//############################################################################
//
// LaserBoy !!!
//
// by James Lehman
// Extra Stimulus Inc.
// james@akrobiz.com
//
// began: October 2003
//
// Copyright 2003 to 2024 James Lehman.
// This source is distributed under the terms of the GNU General Public License.
//
// LaserBoy_SDL_GUI.cpp is part of LaserBoy.
//
// LaserBoy is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// LaserBoy is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with LaserBoy. If not, see .
//
//############################################################################
#include "LaserBoy_SDL_GUI.hpp"
//############################################################################
static void SDL_bailout(int rc)
{
SDL_Quit();
exit(rc);
}
//############################################################################
LaserBoy_SDL_GUI::LaserBoy_SDL_GUI(int x, int y)
: running (false),
prompt_escaped (false),
xres (x ),
yres (y ),
space (this ),
screen (NULL )
{
if(SDL_Init(SDL_INIT_VIDEO) < 0)
SDL_bailout(2);
#ifdef __WITH_SDL2__
window = SDL_CreateWindow("LaserBoy by James Lehman : ©GPL3 2003~2023 Extra Stimulus Inc. SDL2",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
xres,
yres,
0
);
if(window == NULL)
{
SDL_bailout(2);
}
screen = SDL_GetWindowSurface(window);
#else
screen = SDL_SetVideoMode(xres,
yres,
0,
SDL_HWSURFACE
| SDL_ANYFORMAT
);
if(screen == NULL)
{
SDL_bailout(2);
}
SDL_EnableUNICODE(1);
SDL_EnableKeyRepeat(250, 1);
SDL_WM_SetCaption("LaserBoy by James Lehman : ©GPL3 2003~2023 Extra Stimulus Inc. SDL 1.2", NULL);
#endif
SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
SDL_EventState(SDL_PRESSED , SDL_IGNORE);
SDL_EventState(SDL_RELEASED , SDL_IGNORE);
SDL_EventState(SDL_SYSWMEVENT , SDL_IGNORE);
if(SDL_LockSurface(screen) < 0)
SDL_bailout(2);
bmp_clone_SDL_Surface(space.p_bmp(), false);
bmp_copy(space.p_background() , space.p_bmp()); // initialize bitmaps to all the same size as screen
bmp_copy(space.p_background_bmp_2D(), space.p_bmp());
bmp_copy(space.p_background_bmp_3D(), space.p_bmp());
space.recolor_background();
if(LASERBOY_OK == space.font_frames.from_ild_file(LASERBOY_FONT_SHARE + space.font_name + ".ild"))
{
if(space.font_frames.get_unicode_index(space.font_index) & LASERBOY_INVALID_UNICODE)
space.font_frames.clear();
}
else
space.font_frames.clear();
if(y < 960)
space.font_size_factor = 1;
}
//############################################################################
LaserBoy_SDL_GUI::~LaserBoy_SDL_GUI()
{
SDL_FreeSurface (screen);
#ifdef __WITH_SDL2__
SDL_DestroyWindow (window);
#endif
SDL_Quit ();
}
//############################################################################
void LaserBoy_SDL_GUI::capture_screen()
{
int x, y;
struct LaserBoy_bmp screen_capture = {0};
bmp_init(&screen_capture, space.p_bmp()->xres, space.p_bmp()->yres, 24);
for(y = 0; y < space.p_bmp()->yres; y++)
for(x = 0; x < space.p_bmp()->xres; x++)
screen_capture.put_pixel( &screen_capture
, x
, screen_capture.yres - y - 1 // flipped
, screen_capture.make_rgb( space.p_bmp()->r_from_rgb(space.p_bmp()->get_pixel_rgb(space.p_bmp(), x, y))
, space.p_bmp()->g_from_rgb(space.p_bmp()->get_pixel_rgb(space.p_bmp(), x, y))
, space.p_bmp()->b_from_rgb(space.p_bmp()->get_pixel_rgb(space.p_bmp(), x, y))
)
);
bmp_save_as(&screen_capture, (char*)("screen_capture.bmp"));
bmp_free(&screen_capture);
}
//############################################################################
void LaserBoy_SDL_GUI::display_prompt_file_with_auto_complete(const string& prompt, const string& value)
{
bool done = false;
u_int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = x_gap,
list_item = 0,
character = space.file_name.size(),
bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string pre_input;
prompt_escaped = false;
//------------------------------------------------------------------------
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_off, y_off, bmp_bg_color, bmp_bg_color, 0, space.font_size_factor,
" " // clear the line!
);
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
(space.file_name.size()) ? (space.file_name.c_str()) : ("_") // text cursor
);
//------------------------------------------------------------------------
display_space();
//------------------------------------------------------------------------
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.sym == SDLK_RETURN)
{
if(space.file_name.size() == 0)
space.file_name = value;
done = true;
}
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.unicode == SDLK_RETURN)
{
if(space.file_name.size() == 0)
space.file_name = value;
done = true;
}
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(space.file_name.size())
{
space.file_name = space.file_name.substr(0, space.file_name.size() - 1);
if(character > 0)
character--;
if(space.file_name.size() == 0)
{
space.clean_screen();
space.overlay_file_list();
}
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_ ",
space.file_name.c_str()
);
display_space();
}
break;
//------------------------------------------------------------
default:
for(list_item = 0; list_item < space.working_directory_list.size(); list_item++)
{
pre_input = space.file_name;
#ifdef __WITH_SDL2__
pre_input += SDL_Keysym_to_char(&event.key.keysym);
#else
pre_input += event.key.keysym.unicode;
#endif
if(STARTS_WITH(space.working_directory_list[list_item].path().filename().string(), pre_input))
{
space.file_name = pre_input;
character++;
space.clean_screen();
if(space.overlay_file_list() == 1)
{
for(list_item = 0; list_item < space.working_directory_list.size(); list_item++)
{
if(STARTS_WITH(space.working_directory_list[list_item].path().filename().string(), space.file_name))
{
space.file_name = space.working_directory_list[list_item].path().filename().string();
character = space.file_name.size() - 1;
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,255,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.file_name.c_str()
);
break;
}
}
} // if(space.overlay_file_list() == 1)
else
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_",
space.file_name.c_str()
);
}
display_space();
break;
} // if(event.key.keysym.unicode == space.working_directory_list[list_item].path().filename().string()[character])
} // end for(list_item = 0; list_item < space.working_directory_list.size(); list_item++)
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
//------------------------------------------------------------------------
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.file_name.c_str()
);
display_space();
return;
}
//############################################################################
void LaserBoy_SDL_GUI::display_prompt_dir_with_auto_complete(const string& prompt)
{
bool done = false;
u_int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = x_gap,
list_item = 0,
character = 0,
bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string pre_input;
//------------------------------------------------------------------------
prompt_escaped = false;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"_" // text cursor
);
//------------------------------------------------------------------------
display_space();
//------------------------------------------------------------------------
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(space.working_subdirectory.size())
{
space.working_subdirectory = space.working_subdirectory.substr(0, space.working_subdirectory.size() - 1);
if(character > 0)
character--;
if(space.working_subdirectory.size() == 0)
{
space.clean_screen();
space.overlay_subdirectory_list();
}
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_ ",
space.working_subdirectory.c_str()
);
display_space();
}
break;
//------------------------------------------------------------
default:
for(list_item = 0; list_item < space.working_directory_list.size(); list_item++)
{
pre_input = space.working_subdirectory;
#ifdef __WITH_SDL2__
pre_input += SDL_Keysym_to_char(&event.key.keysym);
#else
pre_input += event.key.keysym.unicode;
#endif
if( is_directory(space.working_directory + space.working_directory_list[list_item].path().filename().string())
&& STARTS_WITH(space.working_directory_list[list_item].path().filename().string(), pre_input)
)
{
space.working_subdirectory = pre_input;
character++;
space.clean_screen();
if(space.overlay_subdirectory_list() == 1)
{
for(list_item = 0; list_item < space.working_directory_list.size(); list_item++)
{
if( is_directory(space.working_directory + space.working_directory_list[list_item].path().filename().string())
&& STARTS_WITH(space.working_directory_list[list_item].path().filename().string(), space.working_subdirectory))
{
space.working_subdirectory = space.working_directory_list[list_item].path().filename().string();
character = space.working_subdirectory.size() - 1;
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,255,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.working_subdirectory.c_str()
);
break;
}
} // end for(list_item = 0; list_item < space.working_directory_list.size(); list_item++)
} // end if(space.overlay_subdirectory_list() == 1)
else
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_",
space.working_subdirectory.c_str()
);
}
display_space();
break;
} // END if(is_directory(space.working_directory + space.working_directory_list[list_item].path().filename().string()) ....
} // end for(list_item = 0; list_item < space.working_directory_list.size(); list_item++)
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
//------------------------------------------------------------------------
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.working_subdirectory.c_str()
);
display_space();
return;
}
//############################################################################
void LaserBoy_SDL_GUI::display_prompt_f_effect_with_auto_complete(const string& prompt)
{
bool done = false;
u_int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = x_gap,
list_item = 0,
character = space.effect_name.size(),
bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string pre_input;
//------------------------------------------------------------------------
prompt_escaped = false;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_",
space.effect_name.c_str() // text cursor
);
//------------------------------------------------------------------------
display_space();
//------------------------------------------------------------------------
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(space.effect_name.size())
{
space.effect_name = space.effect_name.substr(0, space.effect_name.size() - 1);
if(character > 0)
character--;
if(space.effect_name.size() == 0)
{
space.clean_screen();
space.overlay_frame_effects();
}
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_ ",
space.effect_name.c_str()
);
display_space();
}
break;
//------------------------------------------------------------
default:
for(list_item = 0; list_item < space.frame_effect_names.size(); list_item++)
{
pre_input = space.effect_name;
#ifdef __WITH_SDL2__
pre_input += SDL_Keysym_to_char(&event.key.keysym);
#else
pre_input += event.key.keysym.unicode;
#endif
if(starts_with(space.frame_effect_names[list_item], pre_input))
{
space.effect_name = pre_input;
character++;
space.clean_screen();
if(space.overlay_frame_effects() == 1)
{
for(list_item = 0; list_item < space.frame_effect_names.size(); list_item++)
{
if(starts_with(space.frame_effect_names[list_item], space.effect_name))
{
space.effect_name = space.frame_effect_names[list_item];
character = space.effect_name.size() - 1;
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,255,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.effect_name.c_str()
);
}
}
} // end if(space.overlay_frame_effects() == 1)
else
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_",
space.effect_name.c_str()
);
}
display_space();
break;
}// end if(starts_with(space.frame_effect_names[list_item], pre_input))
} // end for(list_item = 0; list_item < space.frame_effect_names.size(); list_item++)
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
//------------------------------------------------------------------------
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.effect_name.c_str()
);
display_space();
return;
}
//############################################################################
void LaserBoy_SDL_GUI::display_prompt_sf_effect_with_auto_complete(const string& prompt)
{
bool done = false;
u_int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = x_gap,
list_item = 0,
character = space.effect_name.size(),
bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string pre_input;
//------------------------------------------------------------------------
prompt_escaped = false;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_",
space.effect_name.c_str() // text cursor
);
//------------------------------------------------------------------------
display_space();
//------------------------------------------------------------------------
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(space.effect_name.size())
{
space.effect_name = space.effect_name.substr(0, space.effect_name.size() - 1);
if(character > 0)
character--;
if(space.effect_name.size() == 0)
{
space.clean_screen();
space.overlay_selected_frames_effects();
}
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_ ",
space.effect_name.c_str()
);
display_space();
}
break;
//------------------------------------------------------------
default:
for(list_item = 0; list_item < space.selected_frames_effect_names.size(); list_item++)
{
pre_input = space.effect_name;
#ifdef __WITH_SDL2__
pre_input += SDL_Keysym_to_char(&event.key.keysym);
#else
pre_input += event.key.keysym.unicode;
#endif
if(starts_with(space.selected_frames_effect_names[list_item], pre_input))
{
space.effect_name = pre_input;
character++;
space.clean_screen();
if(space.overlay_selected_frames_effects() == 1)
{
for(list_item = 0; list_item < space.selected_frames_effect_names.size(); list_item++)
{
if(starts_with(space.selected_frames_effect_names[list_item], space.effect_name))
{
space.effect_name = space.selected_frames_effect_names[list_item];
character = space.effect_name.size() - 1;
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,255,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.effect_name.c_str()
);
}
}
} // end if(space.overlay_frame_effects() == 1)
else
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_",
space.effect_name.c_str()
);
}
display_space();
break;
}// end if(starts_with(space.frame_effect_names[list_item], pre_input))
} // end for(list_item = 0; list_item < space.frame_effect_names.size(); list_item++)
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
//------------------------------------------------------------------------
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.effect_name.c_str()
);
display_space();
return;
}
//############################################################################
void LaserBoy_SDL_GUI::display_prompt_fs_effect_with_auto_complete(const string& prompt)
{
bool done = false;
u_int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = x_gap,
list_item = 0,
character = space.effect_name.size(),
bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string pre_input;
//------------------------------------------------------------------------
prompt_escaped = false;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_",
space.effect_name.c_str() // text cursor
);
//------------------------------------------------------------------------
display_space();
//------------------------------------------------------------------------
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(space.effect_name.size())
{
space.effect_name = space.effect_name.substr(0, space.effect_name.size() - 1);
if(character > 0)
character--;
if(space.effect_name.size() == 0)
{
space.clean_screen();
space.overlay_frame_set_effects();
}
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_ ",
space.effect_name.c_str()
);
display_space();
}
break;
//------------------------------------------------------------
default:
for(list_item = 0; list_item < space.frame_set_effect_names.size(); list_item++)
{
pre_input = space.effect_name;
#ifdef __WITH_SDL2__
pre_input += SDL_Keysym_to_char(&event.key.keysym);
#else
pre_input += event.key.keysym.unicode;
#endif
if(starts_with(space.frame_set_effect_names[list_item], pre_input))
{
space.effect_name = pre_input;
character++;
space.clean_screen();
if(space.overlay_frame_set_effects() == 1)
{
for(list_item = 0; list_item < space.frame_set_effect_names.size(); list_item++)
{
if(starts_with(space.frame_set_effect_names[list_item], space.effect_name))
{
space.effect_name = space.frame_set_effect_names[list_item];
character = space.effect_name.size() - 1;
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,255,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.effect_name.c_str()
);
}
}
} // end if(space.overlay_frame_effects() == 1)
else
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_",
space.effect_name.c_str()
);
}
display_space();
break;
} // end if(event.key.keysym.unicode == space.frame_effect_names[list_item][character])
} // end for(list_item = 0; list_item < space.frame_effect_names.size(); list_item++)
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
//------------------------------------------------------------------------
y_off -= y_line;
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_off, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
space.effect_name.c_str()
);
display_space();
return;
}
//############################################################################
string LaserBoy_SDL_GUI::display_prompt_and_echo_name(const string& prompt, u_int max_len)
{
bool done = false;
int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
x_set = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = x_gap;
u_int bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string input;
//------------------------------------------------------------------------
prompt_escaped = false;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor
, " "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor
, prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor
, " "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor
, "_" // text cursor
);
//------------------------------------------------------------------------
display_space();
//------------------------------------------------------------------------
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
} while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return "";
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return "";
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(input.size())
{
input = input.substr(0, input.size() - 1);
x_off -= x_gap;
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
" "
);
display_space();
}
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
if( input.size() < max_len
&& ( isalnum(SDL_Keysym_to_char(&event.key.keysym))
|| SDL_Keysym_to_char(&event.key.keysym) == '_'
|| SDL_Keysym_to_char(&event.key.keysym) == '-'
|| SDL_Keysym_to_char(&event.key.keysym) == '.'
)
)
#else
if( input.size() < max_len
&& ( isalnum(event.key.keysym.unicode)
|| event.key.keysym.unicode == '_'
|| event.key.keysym.unicode == '-'
|| event.key.keysym.unicode == '.'
)
)
#endif
{
#ifdef __WITH_SDL2__
input += SDL_Keysym_to_char(&event.key.keysym);
#else
input += event.key.keysym.unicode;
#endif
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%c",
#ifdef __WITH_SDL2__
SDL_Keysym_to_char(&event.key.keysym)
#else
event.key.keysym.unicode
#endif
);
x_off += x_gap;
display_space();
}
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
//------------------------------------------------------------------------
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s",
input.c_str()
);
display_space();
while(input.size() && input[0] == '.')
input.erase(input.begin());
return input;
}
//############################################################################
string LaserBoy_SDL_GUI::display_prompt_and_echo_string(const string& prompt)
{
bool done = false;
int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
x_set = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = 8 * space.font_size_factor;
u_int bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string input;
prompt_escaped = false;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
space.white_text.as_uint(),
bmp_bg_color,
0,
space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
space.bmp.make_rgb(space.current_palette()[space.selected_color_index].r,
space.current_palette()[space.selected_color_index].g,
space.current_palette()[space.selected_color_index].b
),
bmp_bg_color,
0,
space.font_size_factor,
"_"
);
display_space();
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return "";
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return "";
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(input.size())
{
input = input.substr(0, input.size() - 1);
x_off -= x_gap;
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
space.bmp.make_rgb(space.current_palette()[space.selected_color_index].r,
space.current_palette()[space.selected_color_index].g,
space.current_palette()[space.selected_color_index].b
),
bmp_bg_color,
0,
space.font_size_factor,
" "
);
display_space();
}
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
if( isgraph(SDL_Keysym_to_char(&event.key.keysym))
|| event.key.keysym.sym == ' '
)
#else
if( isgraph(event.key.keysym.unicode)
|| event.key.keysym.unicode == ' '
)
#endif
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
space.bmp.make_rgb(space.current_palette()[space.selected_color_index].r,
space.current_palette()[space.selected_color_index].g,
space.current_palette()[space.selected_color_index].b
),
bmp_bg_color,
0,
space.font_size_factor,
"%c",
#ifdef __WITH_SDL2__
SDL_Keysym_to_char(&event.key.keysym)
#else
event.key.keysym.unicode
#endif
);
display_space();
#ifdef __WITH_SDL2__
input += SDL_Keysym_to_char(&event.key.keysym);
#else
input += event.key.keysym.unicode;
#endif
x_off += x_gap;
}
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off - x_gap * input.size(),
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
input.c_str()
);
display_space();
return input;
}
//############################################################################
string LaserBoy_SDL_GUI::display_prompt_and_echo_unicode(const string& prompt)
{
bool done = false;
int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
x_set = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = 8 * space.font_size_factor;
u_int bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
double number;
string input;
prompt_escaped = false;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
space.white_text.as_uint(),
bmp_bg_color,
0,
space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"_"
);
display_space();
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
// space.file_name.clear();
prompt_escaped = true;
return "";
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
// space.file_name.clear();
prompt_escaped = true;
return "";
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(input.size())
{
input = input.substr(0, input.size() - 1);
x_off -= x_gap;
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
" "
);
display_space();
}
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
if(isxdigit(SDL_Keysym_to_char(&event.key.keysym)) && input.size() < 8)
#else
if(isxdigit(event.key.keysym.unicode) && input.size() < 8)
#endif
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%c",
#ifdef __WITH_SDL2__
SDL_Keysym_to_char(&event.key.keysym)
#else
event.key.keysym.unicode
#endif
);
display_space();
#ifdef __WITH_SDL2__
input += SDL_Keysym_to_char(&event.key.keysym);
#else
input += event.key.keysym.unicode;
#endif
x_off += x_gap;
}
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off - x_gap * input.size(),
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
input.c_str()
);
display_space();
hex_string(input, number);
input = as_hex_string((char32_t)number);
return input;
}
//############################################################################
string LaserBoy_SDL_GUI::display_prompt_and_echo_channel_map(const string& prompt)
{
char in_key = 0x00;
bool done = false;
int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
x_set = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = 8 * space.font_size_factor;
u_int bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string input = space.wav_channel_map;
x_off += (x_gap * input.size());
prompt_escaped = false;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
space.white_text.as_uint(),
bmp_bg_color,
0,
space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%s_",
input.c_str()
);
display_space();
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
prompt_escaped = true;
return space.wav_channel_map;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
prompt_escaped = true;
return space.wav_channel_map;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(input.size())
{
input = input.substr(0, input.size() - 1);
x_off -= x_gap;
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"_ "
);
display_space();
}
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
in_key = (char)SDL_Keysym_to_char(&event.key.keysym);
#else
in_key = (char)event.key.keysym.unicode;
#endif
//--------------------------------------------------------
if(in_key == '/')
in_key = '?'; // upper case it
//--------------------------------------------------------
if( in_key == 'x'
|| in_key == 'y'
|| in_key == 'z'
)
in_key &= 0b11011111; // upper case it
//--------------------------------------------------------
if( in_key == 'R'
|| in_key == 'G'
|| in_key == 'B'
|| in_key == 'I'
)
in_key |= 0b00100000; // lower case it
//--------------------------------------------------------
if( input.size() < 8
&& ( in_key == '0'
|| in_key == '?'
|| ( ( in_key == 'X'
|| in_key == 'Y'
|| in_key == 'Z'
|| in_key == 'r'
|| in_key == 'g'
|| in_key == 'b'
|| in_key == 'i'
)
&& input.find(in_key) == string::npos
)
)
)
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%c_ ",
in_key
);
display_space();
input += in_key;
x_off += x_gap;
}
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off - x_gap * input.size(),
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
input.c_str()
);
display_space();
return input;
}
//############################################################################
double LaserBoy_SDL_GUI::display_prompt_and_echo_double(const string& prompt, double value, double v_max, double v_min)
{
bool done = false;
int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
x_set = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = 8 * space.font_size_factor;
u_int bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
double result = 0.0,
check = 0.0;
string input,
check_string;
prompt_escaped = false;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
space.white_text.as_uint(),
bmp_bg_color,
0,
space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"_"
);
display_space();
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0.0;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0.0;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(input.size())
{
input = input.substr(0, input.size() - 1);
x_off -= x_gap;
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
" "
);
display_space();
}
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
if( isdigit(SDL_Keysym_to_char(&event.key.keysym))
|| ( SDL_Keysym_to_char(&event.key.keysym) == '.'
&& input.find('.') == string::npos
)
|| ( SDL_Keysym_to_char(&event.key.keysym) == '+'
&& !input.size()
)
|| ( SDL_Keysym_to_char(&event.key.keysym) == '-'
&& !input.size()
)
)
#else
if( isdigit(event.key.keysym.unicode)
|| ( event.key.keysym.unicode == '.'
&& input.find('.') == string::npos
)
|| ( event.key.keysym.unicode == '+'
&& !input.size()
)
|| ( event.key.keysym.unicode == '-'
&& !input.size()
)
)
#endif
{
check_string = input;
#ifdef __WITH_SDL2__
check_string += SDL_Keysym_to_char(&event.key.keysym);
#else
check_string += event.key.keysym.unicode;
#endif
sscanf(check_string.c_str(), "%lf", &check);
if(check <= v_max && check >= v_min)
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%c",
#ifdef __WITH_SDL2__
SDL_Keysym_to_char(&event.key.keysym)
#else
event.key.keysym.unicode
#endif
);
display_space();
#ifdef __WITH_SDL2__
input += SDL_Keysym_to_char(&event.key.keysym);
#else
input += event.key.keysym.unicode;
#endif
x_off += x_gap;
}
}
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off - x_gap * input.size(),
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
input.c_str()
);
display_space();
if(input.size())
sscanf(input.c_str(), "%lf", &result);
else
result = value;
return result;
}
//############################################################################
u_char LaserBoy_SDL_GUI::display_prompt_and_echo_u_char(const string& prompt, u_char default_value)
{
bool done = false;
int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
x_set = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = 8 * space.font_size_factor;
u_int bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b),
check = 0,
result = 0;
string input,
check_string;
prompt_escaped = false;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
space.white_text.as_uint(),
bmp_bg_color,
0,
space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"_"
);
display_space();
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(input.size())
{
input = input.substr(0, input.size() - 1);
x_off -= x_gap;
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
" "
);
display_space();
}
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
if(isdigit(SDL_Keysym_to_char(&event.key.keysym)))
#else
if(isdigit(event.key.keysym.unicode))
#endif
{
check = 0;
check_string = input;
#ifdef __WITH_SDL2__
check_string += SDL_Keysym_to_char(&event.key.keysym);
#else
check_string += event.key.keysym.unicode;
#endif
sscanf(check_string.c_str(), "%u", &check);
if(check < 256)
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%c",
#ifdef __WITH_SDL2__
SDL_Keysym_to_char(&event.key.keysym)
#else
event.key.keysym.unicode
#endif
);
display_space();
#ifdef __WITH_SDL2__
input += SDL_Keysym_to_char(&event.key.keysym);
#else
input += event.key.keysym.unicode;
#endif
x_off += x_gap;
}
}
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off - x_gap * input.size(),
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
input.c_str()
);
display_space();
if(input.size())
sscanf(input.c_str(), "%u", &result);
else
result = default_value;
return (u_char)result;
}
//############################################################################
short LaserBoy_SDL_GUI::display_prompt_and_echo_short(const string& prompt, short default_value)
{
bool done = false;
int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
x_set = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = 8 * space.font_size_factor,
check = 0,
result = 0;
u_int bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string input,
check_string;
prompt_escaped = false;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
space.white_text.as_uint(),
bmp_bg_color,
0,
space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"_"
);
display_space();
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(input.size())
{
input = input.substr(0, input.size() - 1);
x_off -= x_gap;
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
" "
);
display_space();
}
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
if( isdigit(SDL_Keysym_to_char(&event.key.keysym))
|| ( SDL_Keysym_to_char(&event.key.keysym) == '+'
&& !input.size()
)
|| ( SDL_Keysym_to_char(&event.key.keysym) == '-'
&& !input.size()
)
)
#else
if( isdigit(event.key.keysym.unicode)
|| ( event.key.keysym.unicode == '+'
&& !input.size()
)
|| ( event.key.keysym.unicode == '-'
&& !input.size()
)
)
#endif
{
check = 0;
check_string = input;
#ifdef __WITH_SDL2__
check_string += SDL_Keysym_to_char(&event.key.keysym);
#else
check_string += event.key.keysym.unicode;
#endif
sscanf(check_string.c_str(), "%u", &check);
if(check <= LASERBOY_MAX_SHORT && check >= LASERBOY_MIN_SHORT)
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%c",
#ifdef __WITH_SDL2__
SDL_Keysym_to_char(&event.key.keysym)
#else
event.key.keysym.unicode
#endif
);
display_space();
#ifdef __WITH_SDL2__
input += SDL_Keysym_to_char(&event.key.keysym);
#else
input += event.key.keysym.unicode;
#endif
x_off += x_gap;
}
}
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off - x_gap * input.size(),
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
input.c_str()
);
display_space();
if(input.size())
sscanf(input.c_str(), "%u", &result);
else
result = default_value;
return (short)result;
}
//############################################################################
int LaserBoy_SDL_GUI::display_prompt_and_echo_int(const string& prompt, int default_value)
{
bool done = false;
int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
x_set = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = 8 * space.font_size_factor,
result = 0;
u_int bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
string input;
prompt_escaped = false;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
space.white_text.as_uint(),
bmp_bg_color,
0,
space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"_"
);
display_space();
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(input.size())
{
input = input.substr(0, input.size() - 1);
x_off -= x_gap;
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
" "
);
display_space();
}
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
if( isdigit(SDL_Keysym_to_char(&event.key.keysym))
|| ( SDL_Keysym_to_char(&event.key.keysym) == '+'
&& !input.size()
)
|| ( SDL_Keysym_to_char(&event.key.keysym) == '-'
&& !input.size()
)
)
#else
if( isdigit(event.key.keysym.unicode)
|| ( event.key.keysym.unicode == '+'
&& !input.size()
)
|| ( event.key.keysym.unicode == '-'
&& !input.size()
)
)
#endif
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%c",
#ifdef __WITH_SDL2__
SDL_Keysym_to_char(&event.key.keysym)
#else
event.key.keysym.unicode
#endif
);
display_space();
#ifdef __WITH_SDL2__
input += SDL_Keysym_to_char(&event.key.keysym);
#else
input += event.key.keysym.unicode;
#endif
x_off += x_gap;
}
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off - x_gap * input.size(),
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
input.c_str()
);
display_space();
if(input.size())
sscanf(input.c_str(), "%u", &result);
else
result = default_value;
return result;
}
//############################################################################
u_int LaserBoy_SDL_GUI::display_prompt_and_echo_u_int(const string& prompt, u_int default_value, u_int v_max)
{
bool done = false;
int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
x_set = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
x_gap = 8 * space.font_size_factor,
y_line = 8 * space.font_size_factor,
result = 0;
u_int bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b),
check = 0;
string input,
check_string;
prompt_escaped = false;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"_"
);
display_space();
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
}
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(event.key.keysym.sym == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0;
}
if(event.key.keysym.sym == SDLK_RETURN)
done = true;
#else
do
{
SDL_WaitEvent(&event);
}
while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
space.file_name.clear();
prompt_escaped = true;
return 0;
}
if(event.key.keysym.unicode == SDLK_RETURN)
done = true;
#endif
else
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_DELETE:
case SDLK_BACKSPACE:
if(input.size())
{
input = input.substr(0, input.size() - 1);
x_off -= x_gap;
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
" "
);
display_space();
}
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
if(isdigit(SDL_Keysym_to_char(&event.key.keysym)))
#else
if(isdigit(event.key.keysym.unicode))
#endif
{
check_string = input;
#ifdef __WITH_SDL2__
check_string += SDL_Keysym_to_char(&event.key.keysym);
#else
check_string += event.key.keysym.unicode;
#endif
sscanf(check_string.c_str(), "%u", &check);
if(check <= v_max)
{
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"%c",
#ifdef __WITH_SDL2__
SDL_Keysym_to_char(&event.key.keysym)
#else
event.key.keysym.unicode
#endif
);
display_space();
#ifdef __WITH_SDL2__
input += SDL_Keysym_to_char(&event.key.keysym);
#else
input += event.key.keysym.unicode;
#endif
x_off += x_gap;
}
}
break;
} // end switch(event.key.keysym.unicode)
} // end else of if(event.key.keysym.unicode == SDLK_RETURN)
} // end while(!done)
y_off -= y_line;
bmp_printf(&(space.bmp), x_set, y_off, space.white_text.as_uint(), bmp_bg_color, 0, space.font_size_factor,
" "
);
bmp_printf(&(space.bmp),
x_set,
y_off,
space.white_text.as_uint(),
bmp_bg_color,
0,
space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off - x_gap * input.size(),
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(255,0,0)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
input.c_str()
);
display_space();
if(input.size())
sscanf(input.c_str(), "%u", &result);
else
result = default_value;
return result;
}
//############################################################################
int LaserBoy_SDL_GUI::display_prompt_and_echo_nibble(const string& prompt)
{
bool done = false;
u_int result = 0x00, // dud return value
x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
y_line = 8 * space.font_size_factor,
bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
prompt_escaped = false;
bmp_printf(&(space.bmp),
x_off,
y_off,
space.white_text.as_uint(),
bmp_bg_color,
0,
space.font_size_factor,
prompt.c_str()
);
y_off += y_line;
bmp_printf(&(space.bmp),
x_off,
y_off,
(space.rainbow_menus) ? (space.bmp.make_rgb(0,255,255)) : (space.bmp.make_rgb(space.mono_text.r, space.mono_text.g, space.mono_text.b)),
bmp_bg_color,
0,
space.font_size_factor,
"_"
);
display_space();
while(!done)
{
#ifdef __WITH_SDL2__
do
{
SDL_WaitEvent(&event);
} while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
if(SDL_Keysym_to_char(&event.key.keysym) == SDLK_ESCAPE)
{
prompt_escaped = true;
return -1;
}
#else
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
prompt_escaped = true;
return -1;
}
#endif
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case '0': return 0x00;
case '1': return 0x01;
case '2': return 0x02;
case '3': return 0x03;
case '4': return 0x04;
case '5': return 0x05;
case '6': return 0x06;
case '7': return 0x07;
case '8': return 0x08;
case '9': return 0x09;
case 'a':
case 'A': return 0x0a;
case 'b':
case 'B': return 0x0b;
case 'c':
case 'C': return 0x0c;
case 'd':
case 'D': return 0x0d;
case 'e':
case 'E': return 0x0e;
case 'f':
case 'F': return 0x0f;
//----------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
} // end while(!done)
return result;
}
//############################################################################
bool LaserBoy_SDL_GUI::display_prompt_and_echo_bool(const string& prompt)
{
u_int x_off = LASERBOY_STATS_DISPLAY_OFFSET * space.font_size_factor,
y_off = space.bmp.yres - 24 * space.font_size_factor,
y_line = 8 * space.font_size_factor,
bmp_bg_color = space.bmp.make_rgb(space.bg_color.r, space.bg_color.g, space.bg_color.b);
prompt_escaped = false;
bmp_printf( &(space.bmp)
, x_off
, y_off
, bmp_bg_color
, bmp_bg_color
, 0
, space.font_size_factor
, " "
);
bmp_printf( &(space.bmp)
, x_off
, y_off
, space.white_text.as_uint()
, bmp_bg_color
, 0
, space.font_size_factor
, prompt.c_str()
);
y_off += y_line;
bmp_printf( &(space.bmp)
, x_off
, y_off
, bmp_bg_color
, bmp_bg_color
, 0
, space.font_size_factor
, " "
);
display_space();
do
{
SDL_WaitEvent(&event);
}
#ifdef __WITH_SDL2__
while( event.type != SDL_KEYDOWN
|| event.key.keysym.sym == SDLK_LSHIFT
|| event.key.keysym.sym == SDLK_RSHIFT
|| event.key.keysym.sym == SDLK_LCTRL
|| event.key.keysym.sym == SDLK_RCTRL
|| event.key.keysym.sym == SDLK_LALT
|| event.key.keysym.sym == SDLK_RALT
|| event.key.keysym.sym == SDLK_UP
|| event.key.keysym.sym == SDLK_DOWN
|| event.key.keysym.sym == SDLK_LEFT
|| event.key.keysym.sym == SDLK_RIGHT
);
#else
while(event.type != SDL_KEYDOWN);
#endif
#ifdef __WITH_SDL2__
if(event.key.keysym.sym == SDLK_ESCAPE)
{
prompt_escaped = true;
return false;
}
#else
if(event.key.keysym.unicode == SDLK_ESCAPE)
{
prompt_escaped = true;
return false;
}
#endif
#ifdef __WITH_SDL2__
if( SDL_Keysym_to_char(&event.key.keysym) == 'y'
|| SDL_Keysym_to_char(&event.key.keysym) == 'Y'
|| SDL_Keysym_to_char(&event.key.keysym) == '1'
)
return true;
#else
if( event.key.keysym.unicode == 'y'
|| event.key.keysym.unicode == 'Y' // this can only happen if the caps lock key is on!
|| event.key.keysym.unicode == '1'
)
return true;
#endif
return false;
}
//############################################################################
void LaserBoy_SDL_GUI::wait_4_Esc()
{
while(true)
{
SDL_WaitEvent(&event);
if( event.type == SDL_KEYDOWN
#ifdef __WITH_SDL2__
&& event.key.keysym.sym == SDLK_ESCAPE
#else
&& event.key.keysym.unicode == SDLK_ESCAPE
#endif
)
break;
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::wait_4_any_key()
{
while(true)
{
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
break;
}
return;
}
//############################################################################
// functions that require direct access to space.bmp
//############################################################################
bool LaserBoy_SDL_GUI::display_bmp_directory(string bmp_dir, bool scale_to_screen)
{
char file_name[128];
DIR *pDIR;
struct dirent *pDirEnt;
vector file_list;
//------------------------------------------------------------------------
pDIR = opendir(bmp_dir.c_str());
//------------------------------------------------------------------------
if(pDIR == NULL)
return false;
else
{
do // clear key strokes from event queue!
{
SDL_PollEvent(&event);
} while(event.type == SDL_KEYDOWN);
display_state("loading bmp files into array");
space.display_please_wait();
pDirEnt = readdir(pDIR);
while(pDirEnt != NULL)
{
if( strcmp(pDirEnt->d_name, "." ) // not the dot
&& strcmp(pDirEnt->d_name, "..") // not the dot dot
)
file_list.push_back(pDirEnt->d_name);
pDirEnt = readdir(pDIR);
}
closedir(pDIR);
if(file_list.size())
{
u_int time_zero,
i = 0;
vector frame_array;
//----------------------------------------------------------------
// for systems that don't return file lists in alpha-numeric order!
sort(file_list.begin(), file_list.end());
//----------------------------------------------------------------
for(i = 0; i < file_list.size(); i++)
{
struct LaserBoy_bmp frame = {0};
strcpy(file_name, (bmp_dir + '/' + file_list[i]).c_str());
if(bmp_from_file(&frame, file_name))
{
struct LaserBoy_bmp to_screen = {0};
bmp_init(&to_screen, space.bmp.xres, space.bmp.yres, space.bmp.bpp);
bmp_flip(&frame);
if(scale_to_screen)
{
bmp_scale_into_bmp(&to_screen,
&frame,
frame.yres > frame.xres
? (double)to_screen.yres / (double)frame.yres
: (double)to_screen.yres / (double)frame.xres
);
}
else
bmp_into_bmp(&to_screen, &frame, 1);
frame_array.push_back(to_screen);
bmp_free(&frame);
display_progress(file_list.size() - i);
}
}
space.clean_screen();
SDL_Delay(250);
SDL_PollEvent(&event);
i = 0;
while( (event.type != SDL_KEYDOWN)
&& (i < frame_array.size())
)
{
time_zero = SDL_GetTicks();
bmp_to_SDL_Surface(&(frame_array.at(i)));
i++;
if(space.loop_animation && i >= frame_array.size())
i = 0;
if(space.approximate_frame_rate)
{
do{;}
while( SDL_GetTicks() - time_zero
< (u_int)((1.0 / space.frames_per_second) * 1000.0)
);
}
SDL_PollEvent(&event);
}
for(i = 0; i < file_list.size(); i++)
bmp_free(&(frame_array.at(i)));
frame_array.clear();
} // end if(file_list.size())
} // end else (pDIR == NULL)
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::display_wav(string wav_file)
{
std::fstream in;
do // clear key strokes from event queue!
{
SDL_PollEvent(&event);
} while(event.type == SDL_KEYDOWN);
in.open(wav_file.c_str(), ios::in | ios::binary);
if(!in.is_open())
return false;
LaserBoy_wav_header header;
if(!header.from_fstream_wav(in, wav_file))
{
space.frame_set_error |= LASERBOY_WAV_HEADER_ERROR;
return false;
}
if( header.version == "!LaserBoy!"
|| !(header.LaserBoy_wav_mode & LASERBOY_WAVE_END_OF_FRAME)
)
{
if(header.num_channels != space.wav_channel_map.size())
{
space.frame_set_error |= LASERBOY_LB_WAV_FORMAT_ERROR;
return false;
}
do
{
display_unframed_wav(in, header);
in.close();
in.open(wav_file.c_str(), ios::in | ios::binary);
header.from_fstream_wav(in, wav_file);
} while(space.wav_loop && !prompt_escaped);
}
else
{
do
{
display_LaserBoy_wav(in, header);
in.close();
in.open(wav_file.c_str(), ios::in | ios::binary);
header.from_fstream_wav(in, wav_file);
} while(space.wav_loop && !prompt_escaped);
}
in.close();
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::display_unframed_wav(string wav_file)
{
std::fstream in;
do // clear key strokes from event queue!
{
SDL_PollEvent(&event);
} while(event.type == SDL_KEYDOWN);
in.open(wav_file.c_str(), ios::in | ios::binary);
if(!in.is_open())
return false;
LaserBoy_wav_header header;
if(!header.from_fstream_wav(in, wav_file))
{
space.frame_set_error |= LASERBOY_WAV_HEADER_ERROR;
return false;
}
if(header.num_channels != space.wav_channel_map.size())
{
space.frame_set_error |= LASERBOY_LB_WAV_FORMAT_ERROR;
return false;
}
do
{
display_unframed_wav(in, header);
in.close();
in.open(wav_file.c_str(), ios::in | ios::binary);
header.from_fstream_wav(in, wav_file);
} while(space.wav_loop && !prompt_escaped);
in.close();
return true;
}
//############################################################################
void LaserBoy_SDL_GUI::display_LaserBoy_wav(std::fstream& in, const LaserBoy_wav_header& header)
{
bool playing = true;
u_char r = 0x00,
g = 0x00,
b = 0x00;
int i,
span,
last,
X_index = header.channel_map.find('X'),
Y_index = header.channel_map.find('Y'),
r_index = header.channel_map.find('r'),
g_index = header.channel_map.find('g'),
b_index = header.channel_map.find('b'),
i_index = header.channel_map.find('i'),
eof_index = -1,
r_offset = 0,
g_offset = 0,
b_offset = 0,
i_offset = 0,
eof_offset = 0,
offset_max = header.offset[0],
offset_min = header.offset[0],
sample_count = 0,
center = screen->h / 2;
u_int time_zero,
color = space.white_text.as_uint();
double scale = screen->h / 65536.0;
struct LaserBoy_bmp frame_buffer = {0},
blank_screen = {0};
LaserBoy_wav_sample_pointer roll_over;
LaserBoy_wav_sample_pointer* samples_window;
//------------------------------------------------------------------------
for(i = 0; i < header.num_channels; i++)
{
if(header.offset[i] > offset_max)
offset_max = header.offset[i];
if(header.offset[i] < offset_min)
offset_min = header.offset[i];
if(header.LSB_tag[i] == LASERBOY_LSB_END_OF_FRAME)
{
eof_index = i;
eof_offset = -header.offset[eof_index] + 1;
}
}
//------------------------------------------------------------------------
span = (offset_max - offset_min) + 2; // at least 2 samples!
last = span - 1;
//------------------------------------------------------------------------
if(r_index >= 0) r_offset = -header.offset[r_index] + 1;
if(g_index >= 0) g_offset = -header.offset[g_index] + 1;
if(b_index >= 0) b_offset = -header.offset[b_index] + 1;
if(i_index >= 0) i_offset = -header.offset[i_index] + 1;
//------------------------------------------------------------------------
samples_window = new LaserBoy_wav_sample_pointer[span]; // at least 2
for(i = 0; i < span; i++)
samples_window[i] = new LaserBoy_wav_sample(header.num_channels);
//------------------------------------------------------------------------
bmp_clone_SDL_Surface(&frame_buffer, false);
bmp_fill(&frame_buffer, space.bg_color.r, space.bg_color.g, space.bg_color.b);
bmp_copy(&blank_screen, &frame_buffer);
//------------------------------------------------------------------------
while(playing)
{
time_zero = SDL_GetTicks();
//--------------------------------------------------------------------
roll_over = samples_window[0];
for(i = 0; i < last; i++)
samples_window[i] = samples_window[i + 1];
samples_window[last] = roll_over;
//--------------------------------------------------------------------
if(space.wav_show_inverted)
playing = samples_window[last]->from_fstream_wav_inverted(in);
else
playing = samples_window[last]->from_fstream_wav(in);
//--------------------------------------------------------------------
SDL_PollEvent(&event);
if(event.type == SDL_KEYDOWN)
{
playing = false;
prompt_escaped = true;
}
else
{
sample_count++;
if( r_index == -1
&& g_index == -1
&& b_index == -1
&& i_index >= 0
)
{
r = g = b = (header.LaserBoy_wav_mode & LASERBOY_COLOR_RESCALE_I)
? (rescale_to_index(header.color_rescale_i, samples_window[i_offset]->channel[i_index]))
: (samples_window[i_offset]->channel[i_index] >> 7);
}
else
{
r = g = b = 0x00;
//------------------------------------------------------------
if(r_index >= 0)
r = (header.LaserBoy_wav_mode & LASERBOY_COLOR_RESCALE_R)
? (rescale_to_index(header.color_rescale_r, samples_window[r_offset]->channel[r_index]))
: (samples_window[r_offset]->channel[r_index] >> 7);
//------------------------------------------------------------
if(g_index >= 0)
g = (header.LaserBoy_wav_mode & LASERBOY_COLOR_RESCALE_G)
? (rescale_to_index(header.color_rescale_g, samples_window[g_offset]->channel[g_index]))
: (samples_window[g_offset]->channel[g_index] >> 7);
//------------------------------------------------------------
if(b_index >= 0)
b = (header.LaserBoy_wav_mode & LASERBOY_COLOR_RESCALE_B)
? (rescale_to_index(header.color_rescale_b, samples_window[b_offset]->channel[b_index]))
: (samples_window[b_offset]->channel[b_index] >> 7);
}
color = frame_buffer.make_rgb(r, g, b);
if(samples_window[eof_offset]->channel[eof_index] & 0x0001) // end of frame
color = 0;
if(color)
{
bmp_put_thick_line_fast( &frame_buffer
, (u_int)round((samples_window[0]->channel[X_index] * scale) + center)
, (u_int)round((samples_window[0]->channel[Y_index] * -scale) + center)
, (u_int)round((samples_window[1]->channel[X_index] * scale) + center)
, (u_int)round((samples_window[1]->channel[Y_index] * -scale) + center)
, color
, space.rendered_line_width
);
if(space.wav_show_vertices)
bmp_put_vertex( &frame_buffer
, (u_int)round((samples_window[1]->channel[X_index] * scale) + center)
, (u_int)round((samples_window[1]->channel[Y_index] * -scale) + center)
, color
, space.rendered_line_width
);
}
//----------------------------------------------------------------
else if(space.wav_show_blanks)
{
bmp_put_thick_line_fast( &frame_buffer
, (u_int)round((samples_window[0]->channel[X_index] * scale) + center)
, (u_int)round((samples_window[0]->channel[Y_index] * -scale) + center)
, (u_int)round((samples_window[1]->channel[X_index] * scale) + center)
, (u_int)round((samples_window[1]->channel[Y_index] * -scale) + center)
, frame_buffer.gray
, space.rendered_line_width
);
if(space.wav_show_vertices)
bmp_put_vertex( &frame_buffer
, (u_int)round((samples_window[1]->channel[X_index] * scale) + center)
, (u_int)round((samples_window[1]->channel[Y_index] * -scale) + center)
, frame_buffer.gray
, space.rendered_line_width
);
}
//----------------------------------------------------------------
if(samples_window[eof_offset]->channel[eof_index] & 0x0001)
{
bmp_to_SDL_Surface(&frame_buffer);
if(space.wav_clean_screen)
memcpy(frame_buffer.image, blank_screen.image, blank_screen.image_size);
if(space.wav_real_time)
{
do
{
SDL_Delay(1); // based on 64hz, or 15.625 ms / tick
}
while( SDL_GetTicks() - time_zero
< (u_int)(sample_count / (header.sample_rate / 1000.0))
);
}
sample_count = 0;
} // end if(samples_window[eof_offset]->channel[eof_index] & 0x0001)
}
} // end while(playing)
bmp_free(&frame_buffer);
for(i = 0; i < span; i++)
if(samples_window[i])
delete samples_window[i];
if(samples_window)
delete samples_window;
//------------------------------------------------------------------------
return;
}
//############################################################################
void LaserBoy_SDL_GUI::display_unframed_wav(std::fstream& in, LaserBoy_wav_header& header)
{
bool playing = true;
u_char r = 0x00,
g = 0x00,
b = 0x00;
int i,
span,
last,
X_index = space.wav_channel_map.find('X'),
Y_index = space.wav_channel_map.find('Y'),
r_index = space.wav_channel_map.find('r'),
g_index = space.wav_channel_map.find('g'),
b_index = space.wav_channel_map.find('b'),
i_index = space.wav_channel_map.find('i'),
r_offset = 0,
g_offset = 0,
b_offset = 0,
i_offset = 0,
offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_X],
offset_min = p_space->wav_offsets[LASERBOY_CHANNEL_X],
sample_count = 0,
center = screen->h / 2;
u_int time_zero,
color = space.white_text.as_uint();
double scale = screen->h / 65536.0;
struct LaserBoy_bmp frame_buffer = {0},
blank_screen = {0};
LaserBoy_wav_sample_pointer roll_over;
LaserBoy_wav_sample_pointer* samples_window;
//------------------------------------------------------------------------
if(p_space->wav_offsets[LASERBOY_CHANNEL_X] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_X];
if(p_space->wav_offsets[LASERBOY_CHANNEL_Y] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_Y];
if(p_space->wav_offsets[LASERBOY_CHANNEL_R] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_R];
if(p_space->wav_offsets[LASERBOY_CHANNEL_G] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_G];
if(p_space->wav_offsets[LASERBOY_CHANNEL_B] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_B];
if(p_space->wav_offsets[LASERBOY_CHANNEL_I] > offset_max) offset_max = p_space->wav_offsets[LASERBOY_CHANNEL_I];
//------------------------------------------------------------------------
p_space->wav_offsets[LASERBOY_CHANNEL_X] -= offset_max;
p_space->wav_offsets[LASERBOY_CHANNEL_Y] -= offset_max;
p_space->wav_offsets[LASERBOY_CHANNEL_R] -= offset_max;
p_space->wav_offsets[LASERBOY_CHANNEL_G] -= offset_max;
p_space->wav_offsets[LASERBOY_CHANNEL_B] -= offset_max;
p_space->wav_offsets[LASERBOY_CHANNEL_I] -= offset_max;
//------------------------------------------------------------------------
header.offset[X_index] = p_space->wav_offsets[LASERBOY_CHANNEL_X]; // use current system offsets
header.offset[Y_index] = p_space->wav_offsets[LASERBOY_CHANNEL_Y];
header.offset[r_index] = p_space->wav_offsets[LASERBOY_CHANNEL_R];
header.offset[g_index] = p_space->wav_offsets[LASERBOY_CHANNEL_G];
header.offset[b_index] = p_space->wav_offsets[LASERBOY_CHANNEL_B];
header.offset[i_index] = p_space->wav_offsets[LASERBOY_CHANNEL_I];
//------------------------------------------------------------------------
for(i = 1; i < header.num_channels; i++)
{
if(header.offset[i] > offset_max)
offset_max = header.offset[i];
if(header.offset[i] < offset_min)
offset_min = header.offset[i];
}
//------------------------------------------------------------------------
span = (offset_max - offset_min) + 2; // at least 2 samples!
last = span - 1;
//------------------------------------------------------------------------
if(r_index >= 0) r_offset = -header.offset[r_index] + 1;
if(g_index >= 0) g_offset = -header.offset[g_index] + 1;
if(b_index >= 0) b_offset = -header.offset[b_index] + 1;
if(i_index >= 0) i_offset = -header.offset[i_index] + 1;
//------------------------------------------------------------------------
samples_window = new LaserBoy_wav_sample_pointer[span]; // at least 2
for(i = 0; i < span; i++)
samples_window[i] = new LaserBoy_wav_sample(header.num_channels);
//------------------------------------------------------------------------
bmp_clone_SDL_Surface(&frame_buffer, false);
bmp_fill(&frame_buffer, space.bg_color.r, space.bg_color.g, space.bg_color.b);
bmp_copy(&blank_screen, &frame_buffer);
//------------------------------------------------------------------------
while(playing)
{
time_zero = SDL_GetTicks();
//--------------------------------------------------------------------
roll_over = samples_window[0];
for(i = 0; i < last; i++)
samples_window[i] = samples_window[i + 1];
samples_window[last] = roll_over;
//--------------------------------------------------------------------
if(space.wav_show_inverted)
playing = samples_window[last]->from_fstream_wav_inverted(in);
else
playing = samples_window[last]->from_fstream_wav(in);
//--------------------------------------------------------------------
SDL_PollEvent(&event);
if(event.type == SDL_KEYDOWN)
{
playing = false;
prompt_escaped = true;
}
else
{
sample_count++;
if( r_index == -1
&& g_index == -1
&& b_index == -1
&& i_index >= 0
)
{
r = g = b = samples_window[i_offset]->channel[i_index] >> 7;
}
else
{
r = g = b = 0x00;
if(r_index >= 0) r = samples_window[r_offset]->channel[r_index] >> 7;
if(g_index >= 0) g = samples_window[g_offset]->channel[g_index] >> 7;
if(b_index >= 0) b = samples_window[b_offset]->channel[b_index] >> 7;
}
color = frame_buffer.make_rgb(r, g, b);
//----------------------------------------------------------------
bmp_put_thick_line_fast(&frame_buffer,
(u_int)round((samples_window[0]->channel[X_index] * scale) + center),
(u_int)round((samples_window[0]->channel[Y_index] * -scale) + center),
(u_int)round((samples_window[1]->channel[X_index] * scale) + center),
(u_int)round((samples_window[1]->channel[Y_index] * -scale) + center),
color,
space.rendered_line_width
);
if(space.wav_show_vertices)
bmp_put_vertex(&frame_buffer,
(u_int)round((samples_window[1]->channel[X_index] * scale) + center),
(u_int)round((samples_window[1]->channel[Y_index] * -scale) + center),
color,
space.rendered_line_width
);
//----------------------------------------------------------------
if(!(sample_count % space.unframed_wav_stride))
{
if(space.wav_real_time)
{
do
{
SDL_Delay(1); // based on 64hz, or 15.625 ms / tick
}
while( SDL_GetTicks() - time_zero
< (u_int)(sample_count / (header.sample_rate / 1000.0))
);
}
bmp_to_SDL_Surface(&frame_buffer);
if(space.wav_clean_screen)
memcpy(frame_buffer.image, blank_screen.image, blank_screen.image_size);
sample_count = 0;
}
}
} // end while(playing)
bmp_free(&frame_buffer);
for(i = 0; i < span; i++)
if(samples_window[i])
delete samples_window[i];
if(samples_window)
delete samples_window;
//------------------------------------------------------------------------
return;
}
//############################################################################
#ifdef __WITH_SDL2__
void LaserBoy_SDL_GUI::check_for_nav_keys(struct SDL_Keysym* sdl_keysym)
#else
void LaserBoy_SDL_GUI::check_for_nav_keys(SDLKey key)
#endif
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(sdl_keysym))
#else
switch(key)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_UP: // show next palette
if(space.show_target_palette)
{
space.target_palette_index++;
if((int)space.target_palette_index >= space.number_of_palettes())
space.target_palette_index = 0;
space.TUI_clue = "+ target palette";
}
break;
//----------------------------------------------------------------
case SDLK_DOWN: // show previous palette
if(space.show_target_palette)
{
if(space.target_palette_index == 0)
space.target_palette_index = space.number_of_palettes();
space.target_palette_index--;
space.TUI_clue = "- target palette";
}
break;
//----------------------------------------------------------------
case SDLK_RIGHT: // show previous frame
if( space.loop_animation
|| (space.frame_index < space.number_of_frames() - 1)
)
space.pre_incr_current_frame();
space.TUI_clue = "+ frame";
break;
//----------------------------------------------------------------
case SDLK_LEFT: // show next frame
if( space.loop_animation
|| (space.frame_index > 0)
)
space.pre_decr_current_frame();
space.TUI_clue = "- frame";
break;
//----------------------------------------------------------------
case SDLK_TAB:
space.set_current_menu_name("value settings", 0x00400000, true);
system_settings_menu();
break;
//------------------------------------------------------------
case ' ': // [Space] select, deselect current frame
space.current_frame().is_selected = !(space.current_frame().is_selected);
if(space.current_frame().is_selected)
space.TUI_clue = "select frame";
else
space.TUI_clue = "deselect frame";
break;
//----------------------------------------------------------------
case SDLK_F3:
capture_screen();
space.TUI_clue = "Screen Captured";
break;
//----------------------------------------------------------------
}
return;
}
//############################################################################
#ifdef __WITH_SDL2__
void LaserBoy_SDL_GUI::check_for_digit_keys(struct SDL_Keysym* sdl_keysym)
#else
void LaserBoy_SDL_GUI::check_for_digit_keys(SDLKey key)
#endif
{
char formatted_string[80] = {0};
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(sdl_keysym))
#else
switch(key)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//------------------------------------------------------------
case '1':
space.view_angle.x += space.rotation_step;
if(space.view_angle.x > two_pi)
space.view_angle.x -= two_pi;
space.TUI_clue = "+ orbit X";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '!':
space.view_angle.x -= space.rotation_step;
if(space.view_angle.x < -two_pi)
space.view_angle.x += two_pi;
space.TUI_clue = "- orbit X";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '2':
space.view_angle.y += space.rotation_step;
if(space.view_angle.y > two_pi)
space.view_angle.y -= two_pi;
space.TUI_clue = "+ orbit Y";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '@':
space.view_angle.y -= space.rotation_step;
if(space.view_angle.y < -two_pi)
space.view_angle.y += two_pi;
space.TUI_clue = "- orbit Y";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '3':
space.view_angle.z += space.rotation_step;
if(space.view_angle.z > two_pi)
space.view_angle.z -= two_pi;
space.TUI_clue = "+ orbit Z";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '#':
space.view_angle.z -= space.rotation_step;
if(space.view_angle.z < -two_pi)
space.view_angle.z += two_pi;
space.TUI_clue = "- orbit Z";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '4':
space.view_angle += space.rotation_step;
if(space.view_angle.x > two_pi)
space.view_angle.x -= two_pi;
if(space.view_angle.y > two_pi)
space.view_angle.y -= two_pi;
if(space.view_angle.z > two_pi)
space.view_angle.z -= two_pi;
space.TUI_clue = "+ orbit XYZ";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '$':
space.view_angle -= space.rotation_step;
if(space.view_angle.x < -two_pi)
space.view_angle.x += two_pi;
if(space.view_angle.y < -two_pi)
space.view_angle.y += two_pi;
if(space.view_angle.z < -two_pi)
space.view_angle.z += two_pi;
space.TUI_clue = "- orbit XYZ";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '5':
space.view_angle = 0;
space.TUI_clue = "front";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '%':
space.view_angle.x = 0;
space.view_angle.y = pi;
space.view_angle.z = 0;
space.TUI_clue = "back";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '6':
space.view_angle.x = 0;
space.view_angle.y = half_pi;
space.view_angle.z = 0;
space.TUI_clue = "left side";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '^':
space.view_angle.x = 0;
space.view_angle.y = -half_pi;
space.view_angle.z = 0;
space.TUI_clue = "right side";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '7':
space.view_angle.x = half_pi;
space.view_angle.y = 0;
space.view_angle.z = 0;
space.TUI_clue = "top";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '&':
space.view_angle.x = -half_pi;
space.view_angle.y = 0;
space.view_angle.z = 0;
space.TUI_clue = "bottom";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '8':
space.view_angle += space.rotation_step;
if( space.loop_animation
|| (space.frame_index < space.number_of_frames() - 1)
)
space.pre_incr_current_frame();
space.TUI_clue = "+ frame & orbit";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '*':
space.view_angle -= space.rotation_step;
if( space.loop_animation
|| (space.frame_index > 0)
)
space.pre_decr_current_frame();
space.TUI_clue = "- frame & orbit";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case '9':
space.frame(0);
space.TUI_clue = "first frame";
break;
//------------------------------------------------------------
case '0':
space.frame(space.number_of_frames() - 1);
space.TUI_clue = "last frame";
break;
//------------------------------------------------------------
case '(': // set, unset start frame select
space.toggle_frame_select_start();
if(space.frame_select_start != -1)
{
sprintf(formatted_string, "start = %d", space.frame_select_start);
space.TUI_clue = formatted_string;
}
else
space.TUI_clue = "start unset";
break;
//------------------------------------------------------------
case ')': // set, unset end frame select
space.toggle_frame_select_end();
if(space.frame_select_end != -1)
{
sprintf(formatted_string, "end = %d", space.frame_select_end);
space.TUI_clue = formatted_string;
}
else
space.TUI_clue = "end unset";
break;
//------------------------------------------------------------
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::animate_forward()
{
u_int time_zero;
SDL_Delay(250);
SDL_PollEvent(&event);
space.TUI_clue = "+ show";
while( (event.type != SDL_KEYDOWN)
&& ( space.loop_animation
|| (space.frame_index < space.number_of_frames() - 1)
)
)
{
time_zero = SDL_GetTicks();
space.pre_incr_current_frame();
space.clean_screen();
space.render_space();
display_space();
if(space.approximate_frame_rate)
{
do{;}
while( SDL_GetTicks() - time_zero
< (u_int)((1.0 / space.frames_per_second) * 1000.0)
);
}
SDL_PollEvent(&event);
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::animate_reverse()
{
u_int time_zero;
SDL_Delay(250);
SDL_PollEvent(&event);
space.TUI_clue = "- show";
while( (event.type != SDL_KEYDOWN)
&& ( space.loop_animation
|| (space.frame_index > 0)
)
)
{
time_zero = SDL_GetTicks();
space.pre_decr_current_frame();
space.clean_screen();
space.render_space();
display_space();
if(space.approximate_frame_rate)
{
do{;}
while( SDL_GetTicks() - time_zero
< (u_int)((1.0 / space.frames_per_second) * 1000.0)
);
}
SDL_PollEvent(&event);
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::rotate_forward()
{
u_int time_zero;
SDL_Delay(250);
SDL_PollEvent(&event);
space.TUI_clue = "+ orbit";
while( (event.type != SDL_KEYDOWN)
&& ( space.loop_animation
|| (space.frame_index < space.number_of_frames() - 1)
)
)
{
time_zero = SDL_GetTicks();
space.view_angle += one_degree;
space.view_has_changed = true;
space.clean_screen();
space.render_space();
display_space();
if(space.approximate_frame_rate)
{
do{;}
while( SDL_GetTicks() - time_zero
< (u_int)((1.0 / space.frames_per_second) * 1000.0)
);
}
SDL_PollEvent(&event);
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::rotate_reverse()
{
u_int time_zero;
SDL_Delay(250);
SDL_PollEvent(&event);
space.TUI_clue = "- orbit";
while( (event.type != SDL_KEYDOWN)
&& ( space.loop_animation
|| (space.frame_index > 0)
)
)
{
time_zero = SDL_GetTicks();
space.view_angle -= one_degree;
space.view_has_changed = true;
space.clean_screen();
space.render_space();
display_space();
if(space.approximate_frame_rate)
{
do{;}
while( SDL_GetTicks() - time_zero
< (u_int)((1.0 / space.frames_per_second) * 1000.0)
);
}
SDL_PollEvent(&event);
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::animate_rotate_forward()
{
u_int time_zero;
SDL_Delay(250);
SDL_PollEvent(&event);
space.TUI_clue = "+ show & orbit";
while( (event.type != SDL_KEYDOWN)
&& ( space.loop_animation
|| (space.frame_index < space.number_of_frames() - 1)
)
)
{
time_zero = SDL_GetTicks();
space.pre_incr_current_frame();
space.view_angle += one_degree;
space.view_has_changed = true;
space.clean_screen();
space.render_space();
display_space();
if(space.approximate_frame_rate)
{
do{;}
while( SDL_GetTicks() - time_zero
< (u_int)((1.0 / space.frames_per_second) * 1000.0)
);
}
SDL_PollEvent(&event);
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::animate_rotate_reverse()
{
u_int time_zero;
SDL_Delay(250);
SDL_PollEvent(&event);
space.TUI_clue = "- show & orbit";
while( (event.type != SDL_KEYDOWN)
&& ( space.loop_animation
|| (space.frame_index > 0)
)
)
{
time_zero = SDL_GetTicks();
space.pre_decr_current_frame();
space.view_angle -= one_degree;
space.view_has_changed = true;
space.clean_screen();
space.render_space();
display_space();
if(space.approximate_frame_rate)
{
do{;}
while( SDL_GetTicks() - time_zero
< (u_int)((1.0 / space.frames_per_second) * 1000.0)
);
}
SDL_PollEvent(&event);
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::system_settings_menu()
{
bool in_menu = true;
//------------------------------------------------------------------------
prompt_escaped = false;
while(in_menu)
{
space.clean_screen();
space.render_space();
space.overlay_settings_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//------------------------------------------------------------
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit value settings";
break;
//------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//------------------------------------------------------------
case SDLK_F3:
capture_screen();
space.TUI_clue = "Screen Captured";
break;
//------------------------------------------------------------
case '1':
space.set_current_menu_name("visual settings", 0x00000040, true);
visuals_settings_menu();
break;
//------------------------------------------------------------
case '2':
space.set_current_menu_name("apply view", 0x00300030, true);
apply_view_menu();
break;
//------------------------------------------------------------
case '3':
space.set_current_menu_name("display options", 0x00300030, true);
display_options_menu();
break;
//------------------------------------------------------------
case '4':
space.set_current_menu_name("vector editor values", 0x00202040, true);
vector_editor_values_menu();
break;
//------------------------------------------------------------
case '5':
space.set_current_menu_name("optimizations factors", 0x00402020, true);
optimization_factors_menu();
break;
//------------------------------------------------------------
case '6':
space.set_current_menu_name("timing & wav settings", 0x00204020, true);
timing_and_wav_settings_menu();
break;
//------------------------------------------------------------
case '7':
space.set_current_menu_name("file settings", 0x00003030, true);
file_type_specific_options_menu();
break;
//------------------------------------------------------------
case '8':
space.set_current_menu_name("bit resolution", 0x00400000, true);
bit_resolution_menu();
break;
//------------------------------------------------------------
} // end switch(SDL_Keysym_to_char(&event.key.keysym))
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::optimization_factors_menu()
{
bool in_menu = true;
u_int temp_u_int;
double temp_double;
//------------------------------------------------------------------------
prompt_escaped = false;
while(in_menu)
{
space.clean_screen();
space.render_space();
space.overlay_optimization_factors_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//------------------------------------------------------------
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit value settings";
break;
//------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//------------------------------------------------------------
case SDLK_F3:
capture_screen();
space.TUI_clue = "Screen Captured";
break;
//------------------------------------------------------------
case '1':
temp_double = display_prompt_and_echo_double( "insignificant angle in degrees 0.0 to 180.0"
, space.insignificant_angle * one_radian
, 180.0
, 0.0
);
if(prompt_escaped)
break;
space.insignificant_angle = temp_double * one_degree;
break;
//------------------------------------------------------------
case '2':
temp_double = display_prompt_and_echo_double( "insignificant distance in points"
, space.insignificant_distance
, 65535.0
, 0.0
);
if(prompt_escaped)
break;
if(temp_double < 0.00)
temp_double = 0.00;
space.insignificant_distance = temp_double;
break;
//------------------------------------------------------------
case '3':
temp_double = display_prompt_and_echo_double( "maximum lit vector length in points"
, space.lit_delta_max
, 65535.0
, 0.0
);
if(prompt_escaped)
break;
space.lit_delta_max = temp_double;
break;
//------------------------------------------------------------
case '4':
temp_double = display_prompt_and_echo_double( "maximum blank vector length in points"
, space.blank_delta_max
, 65535.0
, 0.0
);
if(prompt_escaped)
break;
space.blank_delta_max = temp_double;
break;
//------------------------------------------------------------
case '5':
temp_u_int = display_prompt_and_echo_u_char("black level (0-255)", 0);
if(prompt_escaped)
break;
space.black_level = (u_char)temp_u_int;
break;
//------------------------------------------------------------
case '6':
temp_double = display_prompt_and_echo_double( "max time for wagging in microseconds"
, space.max_wag_microsec
, 1000000.0
, 0.0
);
if(prompt_escaped)
break;
space.max_wag_microsec = temp_double;
break;
//------------------------------------------------------------
case '7':
temp_double = display_prompt_and_echo_double( "dwell in microseconds for 180 degree angle"
, space.max_dwell_microsec
, 1000000.0
, 0.0
);
if(prompt_escaped)
break;
space.max_dwell_microsec = temp_double;
break;
//------------------------------------------------------------
case '8':
temp_u_int = display_prompt_and_echo_u_int( "lit dwell overhang"
, space.lit_dwell_overhang
, 4800
);
if(prompt_escaped)
break;
space.lit_dwell_overhang = temp_u_int;
break;
//------------------------------------------------------------
case '9':
temp_u_int = display_prompt_and_echo_u_int( "dwell on dot"
, space.dwell_on_dot
, 4800
);
if(prompt_escaped)
break;
space.dwell_on_dot = temp_u_int;
break;
//------------------------------------------------------------
case '0':
dots_setting_menu();
break;
//------------------------------------------------------------
case 'a':
case 'A':
space.no_equivalent_vectors = !space.no_equivalent_vectors;
if(space.no_equivalent_vectors)
space.TUI_clue = "+ equal vector remove";
else
space.TUI_clue = "- equal vector remove";
break;
//------------------------------------------------------------
case 'b':
case 'B':
space.conglomerate_in_minimize = !space.conglomerate_in_minimize;
if(space.conglomerate_in_minimize)
space.TUI_clue = "+ conglomerate in minimize";
else
space.TUI_clue = "- conglomerate in minimize";
break;
//------------------------------------------------------------
case 'c':
case 'C':
space.fracture_b4_conglomerate = !space.fracture_b4_conglomerate;
if(space.fracture_b4_conglomerate)
space.TUI_clue = "+ fracture conglomerate";
else
space.TUI_clue = "- fracture conglomerate";
break;
//------------------------------------------------------------
case 'd':
case 'D':
space.black_dwell_vertices = !space.black_dwell_vertices;
if(space.black_dwell_vertices)
space.TUI_clue = "black dwell";
else
space.TUI_clue = "lit dwell";
break;
//------------------------------------------------------------
case 'e':
case 'E':
space.no_black_match = !space.no_black_match;
if(space.no_black_match)
space.TUI_clue = "no black match";
else
space.TUI_clue = "black match palette";
break;
//------------------------------------------------------------
case 'f':
case 'F':
space.allow_lit_black = !space.allow_lit_black;
if(space.allow_lit_black)
space.TUI_clue = "allow lit black";
else
space.TUI_clue = "blank black";
break;
//------------------------------------------------------------
case 'g':
case 'G':
space.save_1_frame_bridge = !space.save_1_frame_bridge;
if(space.save_1_frame_bridge)
space.TUI_clue = "bridge in single ild";
else
space.TUI_clue = "no bridge in ild save";
break;
//------------------------------------------------------------
case 'h':
case 'H':
space.auto_minimize = !space.auto_minimize;
if(space.auto_minimize)
space.TUI_clue = "minimize ild, dxf, txt output";
else
space.TUI_clue = "raw ild, dxf, txt output";
break;
//------------------------------------------------------------
case 'i':
case 'I':
space.auto_opti_ctn = !space.auto_opti_ctn;
if(space.auto_opti_ctn)
space.TUI_clue = "auto optimize ctn output";
else
space.TUI_clue = "raw ctn output";
break;
//------------------------------------------------------------
case 'j':
case 'J':
space.maintain_first_anchor = !space.maintain_first_anchor;
if(space.maintain_first_anchor)
space.TUI_clue = "optimize from first anchor";
else
space.TUI_clue = "optimize from first anchor";
break;
//------------------------------------------------------------
} // end switch(SDL_Keysym_to_char(&event.key.keysym))
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::vector_editor_values_menu()
{
bool in_menu = true;
int temp_int;
double temp_double;
//------------------------------------------------------------------------
prompt_escaped = false;
while(in_menu)
{
space.clean_screen();
space.render_space();
space.overlay_vector_editor_values_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//------------------------------------------------------------
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit value settings";
break;
//------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//------------------------------------------------------------
case SDLK_F3:
capture_screen();
space.TUI_clue = "Screen Captured";
break;
//------------------------------------------------------------
case '1':
temp_int = display_prompt_and_echo_u_int( "move points per key"
, space.displacement_step
, 65535
);
if(prompt_escaped)
break;
space.displacement_step = temp_int;
break;
//------------------------------------------------------------
case '2':
temp_double = 0.0;
while(temp_double == 0.0)
{
temp_double = display_prompt_and_echo_double( "move 1 / [n] of space per key"
, 65536.0 / space.displacement_step
, 65536.0
, 0.0
);
if(prompt_escaped)
break;
}
if(temp_double == 0.0)
break;
space.displacement_step = (int)(65536.0 / temp_double);
break;
//------------------------------------------------------------
case '3':
temp_double = 0.0;
while(temp_double == 0.0)
{
temp_double = display_prompt_and_echo_double( "rotate degrees per key hit"
, space.insignificant_angle * one_radian
, 180.0
, 0.0
);
if(prompt_escaped)
break;
}
if(temp_double == 0.0)
{
space.display_error("angle must non-zero up to 180 degrees.");
wait_4_Esc();
break;
}
space.rotation_step = temp_double * one_degree;
break;
//------------------------------------------------------------
case '4':
temp_double = display_prompt_and_echo_double( "scale %% per key hit"
, space.magnitude_step * 100.0
, DBL_MAX
, 0.0
);
if(prompt_escaped)
break;
space.magnitude_step = temp_double / 100.0;
space.magnitude_step_up = 1.00 + space.magnitude_step;
space.magnitude_step_dn = 1.00 - space.magnitude_step;
break;
//------------------------------------------------------------
case '5':
temp_double = 0.0;
while(temp_double == 0.0)
{
temp_double = display_prompt_and_echo_double( "rendered arc segment angle in degrees"
, space.rendered_arc_angle
, 180.0
, -180.0
);
if(prompt_escaped)
break;
}
if(temp_double == 0.0)
{
space.display_error("angle must be non-zero, between -180 and +180 degrees.");
wait_4_Esc();
break;
}
space.rendered_arc_angle = temp_double;
break;
//------------------------------------------------------------
case '6':
temp_double = display_prompt_and_echo_double( "%% rendered mono font field space"
, space.rendered_mono_font_space * 100.0
, DBL_MAX
, 0.0
);
if(prompt_escaped)
break;
space.rendered_mono_font_space = temp_double / 100.0;
break;
//------------------------------------------------------------
case '7':
temp_double = display_prompt_and_echo_double( "%% rendered variable font gap"
, space.rendered_vari_font_gap * 100.0
, DBL_MAX
, 0.0
);
if(prompt_escaped)
break;
space.rendered_vari_font_gap = temp_double / 100.0;
break;
//------------------------------------------------------------
case '8':
temp_double = display_prompt_and_echo_double( "%% rendered variable font space"
, space.rendered_vari_font_space * 100.0
, DBL_MAX
, 0.0
);
if(prompt_escaped)
break;
space.rendered_vari_font_space = temp_double / 100.0;
break;
//------------------------------------------------------------
case '9':
space.destructive_clipping = !space.destructive_clipping;
if(space.destructive_clipping)
space.TUI_clue = "destructive clipping";
else
space.TUI_clue = "solid bounds";
break;
//------------------------------------------------------------
case '0':
space.maintain_real_origin = !space.maintain_real_origin;
if(space.maintain_real_origin)
space.TUI_clue = "normalize to origin";
else
space.TUI_clue = "normalize to itself";
break;
//------------------------------------------------------------
case 'a':
case 'A':
space.bond_word = !space.bond_word;
if(space.bond_word)
space.TUI_clue = "bond word on";
else
space.TUI_clue = "bond word off";
break;
//------------------------------------------------------------
case 'b':
case 'B':
space.end_vect_to_delta_max = !space.end_vect_to_delta_max;
if(space.end_vect_to_delta_max)
space.TUI_clue = "new end to delta max";
else
space.TUI_clue = "new end to previous";
break;
//------------------------------------------------------------
} // end switch(SDL_Keysym_to_char(&event.key.keysym))
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::timing_and_wav_settings_menu()
{
bool in_menu = true;
u_int temp_u_int;
double temp_double;
//------------------------------------------------------------------------
prompt_escaped = false;
while(in_menu)
{
space.clean_screen();
space.render_space();
space.overlay_timing_and_wav_settings_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//------------------------------------------------------------
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit value settings";
break;
//------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//------------------------------------------------------------
case SDLK_F3:
capture_screen();
space.TUI_clue = "Screen Captured";
break;
//------------------------------------------------------------
case '1':
temp_u_int = display_prompt_and_echo_u_int( "output wav sample rate"
, space.sample_rate
, 2000000 // 2MHz
);
if(prompt_escaped)
break;
if(temp_u_int == 0)
{
space.display_message("0 (zero) is not a valid sample rate.");
wait_4_any_key();
break;
}
if(space.sample_rate != temp_u_int)
{
double ratio = temp_u_int / (double)space.sample_rate;
space.sample_rate = temp_u_int;
if(display_prompt_and_echo_bool("reset wav sample offsets ? : y | [any]"))
{
space.wav_offsets[LASERBOY_CHANNEL_X] = 0;
space.wav_offsets[LASERBOY_CHANNEL_Y] = 0;
space.wav_offsets[LASERBOY_CHANNEL_Z] = 0;
space.wav_offsets[LASERBOY_CHANNEL_R] = (int)round((space.color_delay_microsec / -1000000.0) * space.sample_rate);
space.wav_offsets[LASERBOY_CHANNEL_G] = space.wav_offsets[LASERBOY_CHANNEL_R];
space.wav_offsets[LASERBOY_CHANNEL_B] = space.wav_offsets[LASERBOY_CHANNEL_R];
space.wav_offsets[LASERBOY_CHANNEL_I] = space.wav_offsets[LASERBOY_CHANNEL_R];
space.overlay_timing_and_wav_settings_menu();
display_space();
}
if(display_prompt_and_echo_bool( "adjust max lit distance from "
+ tostring(space.lit_delta_max)
+ " to "
+ tostring(space.lit_delta_max / ratio)
+ " ? : y | [any]"
)
)
space.lit_delta_max /= ratio;
if(display_prompt_and_echo_bool("adjust max blank distance from "
+ tostring(space.blank_delta_max)
+ " to "
+ tostring(space.blank_delta_max / ratio)
+ " ? : y | [any]"
)
)
space.blank_delta_max /= ratio;
if(display_prompt_and_echo_bool("adjust dwell on dot from "
+ tostring(space.dwell_on_dot)
+ " to "
+ tostring(space.dwell_on_dot * ratio)
+ " ? : y | [any]"
)
)
space.dwell_on_dot *= ratio;
}
break;
//------------------------------------------------------------
case '2':
space.set_current_menu_name("wav channels out", 0x00003030, true);
do
{
space.wav_channel_map = display_prompt_and_echo_channel_map("channel_map of XYZrgbi. 0=empty ?=unknown");
if(space.wav_channel_map.find('X') == string::npos)
{
space.display_error("wav_channel_map must contain X");
space.wav_channel_map.push_back('X');
wait_4_Esc();
}
if(space.wav_channel_map.find('Y') == string::npos)
{
space.display_error("wav_channel_map must contain Y");
space.wav_channel_map.push_back('Y');
wait_4_Esc();
}
if(space.wav_channel_map.size() > 8)
{
space.display_error("invalid 8 characters");
space.wav_channel_map = string("XYrgbi");
wait_4_Esc();
}
space.overlay_timing_and_wav_settings_menu();
display_space();
} while( space.wav_channel_map.find('X') == string::npos
|| space.wav_channel_map.find('Y') == string::npos
);
break;
//------------------------------------------------------------
case '3':
space.set_current_menu_name("channel i", 0x00003030, true);
wav_channel_i_menu();
break;
//------------------------------------------------------------
case '4':
temp_double = display_prompt_and_echo_double( "wav frame still output duration in seconds"
, space.still_frame_duration
, 3600.0 // one hour
, 0.0
);
if(prompt_escaped)
break;
space.still_frame_duration = temp_double;
break;
//------------------------------------------------------------
case '5':
temp_double = display_prompt_and_echo_double( "frames per second"
, space.frames_per_second
, space.sample_rate
, 0.0
);
if(prompt_escaped)
break;
space.frames_per_second = temp_double;
break;
//------------------------------------------------------------
case '6':
temp_double = display_prompt_and_echo_double( "target color delay in microsec"
, space.color_delay_microsec
);
if(prompt_escaped)
break;
if(space.color_delay_microsec != temp_double)
{
space.color_delay_microsec = temp_double;
if(display_prompt_and_echo_bool("reset wav sample offsets ? : y | [any]"))
{
space.wav_offsets[LASERBOY_CHANNEL_X] = 0;
space.wav_offsets[LASERBOY_CHANNEL_Y] = 0;
space.wav_offsets[LASERBOY_CHANNEL_Z] = 0;
space.wav_offsets[LASERBOY_CHANNEL_R] = (int)round((space.color_delay_microsec / -1000000.0) * space.sample_rate);
space.wav_offsets[LASERBOY_CHANNEL_G] = space.wav_offsets[LASERBOY_CHANNEL_R];
space.wav_offsets[LASERBOY_CHANNEL_B] = space.wav_offsets[LASERBOY_CHANNEL_R];
space.wav_offsets[LASERBOY_CHANNEL_I] = space.wav_offsets[LASERBOY_CHANNEL_R];
space.overlay_timing_and_wav_settings_menu();
display_space();
}
}
break;
//------------------------------------------------------------
case '7':
space.set_current_menu_name("set wav offsets", 0x00002040, true);
set_wav_offsets_menu();
break;
//------------------------------------------------------------
case '8':
space.auto_flatten_z = !space.auto_flatten_z;
if(space.auto_flatten_z)
space.TUI_clue = "flatten Z for wav";
else
space.TUI_clue = "keep Z for wav";
break;
//------------------------------------------------------------
case '9':
space.auto_apply_offsets = !space.auto_apply_offsets;
if(space.auto_apply_offsets)
space.TUI_clue = "apply sample offsets to wav";
else
space.TUI_clue = "make wav with no offsets";
break;
//------------------------------------------------------------
case '0':
space.invert_wav_output = !space.invert_wav_output;
if(space.invert_wav_output)
space.TUI_clue = "inverted wav output";
else
space.TUI_clue = "positive wav output";
break;
//------------------------------------------------------------
case 'a':
case 'A':
space.auto_apply_rescales = !space.auto_apply_rescales;
if(space.auto_apply_rescales)
space.TUI_clue = "apply system rescales to wav";
else
space.TUI_clue = "make wav linear color";
break;
//------------------------------------------------------------
case 'b':
case 'B':
space.set_current_menu_name("set color rescales", 0x00002040, true);
set_color_rescales_menu(); // does nothing with wav!
break;
//------------------------------------------------------------
case 'c':
case 'C':
temp_u_int = display_prompt_and_echo_u_int( "unframed wav samples per frame"
, space.unframed_wav_stride
, 65536
);
if(prompt_escaped)
break;
space.unframed_wav_stride = temp_u_int;
break;
//------------------------------------------------------------
} // end switch(SDL_Keysym_to_char(&event.key.keysym))
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::display_options_menu()
{
bool in_menu = true;
u_int temp_u_int;
double temp_double;
//------------------------------------------------------------------------
prompt_escaped = false;
while(in_menu)
{
space.clean_screen();
space.render_space();
space.overlay_display_options_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//------------------------------------------------------------
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit value settings";
break;
//------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//------------------------------------------------------------
case SDLK_F3:
capture_screen();
space.TUI_clue = "Screen Captured";
break;
//------------------------------------------------------------
case '1':
temp_u_int = display_prompt_and_echo_u_int( "rendered vector line width"
, space.rendered_line_width
, yres
);
if(prompt_escaped)
break;
if(temp_u_int == 0)
temp_u_int = 1;
space.rendered_line_width = temp_u_int;
break;
//------------------------------------------------------------
case '2':
temp_u_int = display_prompt_and_echo_u_int( "menu font size factor"
, space.font_size_factor
, 8
);
if(prompt_escaped)
break;
if(temp_u_int <= 0)
temp_u_int = 1;
space.font_size_factor = temp_u_int;
break;
//------------------------------------------------------------
case '3':
temp_double = display_prompt_and_echo_double( "background bitmap size %%"
, space.background_bmp_scale * 100.0
, 2500.0
, 0.0
);
if(prompt_escaped)
break;
space.background_bmp_scale = temp_double / 100.00;
space.recolor_background();
break;
//------------------------------------------------------------
case '4':
space.set_current_menu_name("background color", 0x00400000, true);
edit_background_color_menu();
break;
//------------------------------------------------------------
case '5':
space.set_current_menu_name("mono text color", 0x00300020, true);
edit_mono_text_color_menu();
break;
//------------------------------------------------------------
case '6':
space.set_current_menu_name("blank rgb", 0x00400020, true);
edit_rendered_blank_menu();
break;
//------------------------------------------------------------
case '7':
space.set_current_menu_name("black rgb", 0x00200040, true);
edit_rendered_black_menu();
break;
//------------------------------------------------------------
case '8':
temp_double = display_prompt_and_echo_double( "onion skin fade %%"
, space.onion_skin_fade * 100.0
, 100.0
, 0.0
);
if(prompt_escaped)
break;
space.onion_skin_fade = temp_double / 100.0;
space.recolor_background();
break;
//------------------------------------------------------------
case '9':
temp_u_int = display_prompt_and_echo_u_int( "onion skin depth"
, space.number_of_skins
, 20
);
if(prompt_escaped)
break;
space.number_of_skins = (u_char)temp_u_int;
space.recolor_background();
break;
//------------------------------------------------------------
case '0':
temp_u_int = display_prompt_and_echo_u_int( "output bitmap size in pixels square"
, space.output_bmp_size
, 37837 // ridiculous
);
if(prompt_escaped)
break;
space.output_bmp_size = temp_u_int;
break;
//------------------------------------------------------------
case 'a': // wav utilities settings
case 'A':
space.set_current_menu_name("wav show settings", 0x00002040, true);
wav_show_settings_menu();
break;
} // end switch(SDL_Keysym_to_char(&event.key.keysym))
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::edit_background_color_menu()
{
prompt_escaped = false;
space.clean_screen();
space.render_space();
u_char r = display_prompt_and_echo_u_char("red (0-255)", 0);
if(prompt_escaped)
return;
space.bg_color.r = r;
if((space.white_text - space.bg_color).sum() < 384)
space.white_text = LaserBoy_color();
else
space.white_text = LaserBoy_color(255,255,255);
space.recolor_background();
space.clean_screen();
space.render_space();
u_char g = display_prompt_and_echo_u_char("green (0-255)", 0);
if(prompt_escaped)
return;
space.bg_color.g = g;
if((space.white_text - space.bg_color).sum() < 384)
space.white_text = LaserBoy_color();
else
space.white_text = LaserBoy_color(255,255,255);
space.recolor_background();
space.clean_screen();
space.render_space();
u_char b = display_prompt_and_echo_u_char("blue (0-255)", 0);
if(prompt_escaped)
return;
space.bg_color.b = b;
if((space.white_text - space.bg_color).sum() < 384)
space.white_text = LaserBoy_color();
else
space.white_text = LaserBoy_color(255,255,255);
space.recolor_background();
space.clean_screen();
space.render_space();
space.TUI_clue = "background color";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::edit_mono_text_color_menu()
{
prompt_escaped = false;
space.clean_screen();
space.render_space();
u_char r = display_prompt_and_echo_u_char("red (0-255)", 0);
if(prompt_escaped)
return;
space.mono_text.r = r;
if(!space.rainbow_menus)
space.white_text = space.mono_text;
space.clean_screen();
space.render_space();
u_char g = display_prompt_and_echo_u_char("green (0-255)", 0);
if(prompt_escaped)
return;
space.mono_text.g = g;
if(!space.rainbow_menus)
space.white_text = space.mono_text;
space.clean_screen();
space.render_space();
u_char b = display_prompt_and_echo_u_char("blue (0-255)", 0);
if(prompt_escaped)
return;
space.mono_text.b = b;
if(!space.rainbow_menus)
space.white_text = space.mono_text;
space.clean_screen();
space.render_space();
space.TUI_clue = "mono text color";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::edit_rendered_blank_menu()
{
prompt_escaped = false;
space.clean_screen();
space.render_space();
u_char r = display_prompt_and_echo_u_char("red (0-255)", 0);
if(prompt_escaped)
return;
space.rendered_blank.r = r;
space.recolor_background();
space.clean_screen();
space.render_space();
u_char g = display_prompt_and_echo_u_char("green (0-255)", 0);
if(prompt_escaped)
return;
space.rendered_blank.g = g;
space.recolor_background();
space.clean_screen();
space.render_space();
u_char b = display_prompt_and_echo_u_char("blue (0-255)", 0);
if(prompt_escaped)
return;
space.rendered_blank.b = b;
space.recolor_background();
space.clean_screen();
space.render_space();
space.TUI_clue = "blank line color";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::edit_rendered_black_menu()
{
prompt_escaped = false;
space.clean_screen();
space.render_space();
u_char r = display_prompt_and_echo_u_char("red (0-255)", 0);
if(prompt_escaped)
return;
space.rendered_black.r = r;
space.recolor_background();
space.clean_screen();
space.render_space();
u_char g = display_prompt_and_echo_u_char("green (0-255)", 0);
if(prompt_escaped)
return;
space.rendered_black.g = g;
space.recolor_background();
space.clean_screen();
space.render_space();
u_char b = display_prompt_and_echo_u_char("blue (0-255)", 0);
if(prompt_escaped)
return;
space.rendered_black.b = b;
space.recolor_background();
space.clean_screen();
space.render_space();
space.TUI_clue = "black line color";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::wav_channel_i_menu()
{
bool bad_key = true;
space.TUI_clue = "signal if not Z";
while(bad_key)
{
space.clean_screen();
space.overlay_wav_channel_i_options();
display_space();
//--------------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
space.TUI_clue = "action canceled";
return;
//------------------------------------------------------------
case '1':
space.wav_channel_i = LASERBOY_SIGNAL_MONO_TTL;
bad_key = false;
break;
//------------------------------------------------------------
case '2':
space.wav_channel_i = LASERBOY_SIGNAL_MONO_AVG_ANALOG;
bad_key = false;
break;
//------------------------------------------------------------
case '3':
space.wav_channel_i = LASERBOY_SIGNAL_MONO_OR_ANALOG;
bad_key = false;
break;
//------------------------------------------------------------
case '4':
space.wav_channel_i = LASERBOY_SIGNAL_MONO_WEIGHTED_ANALOG;
bad_key = false;
break;
//------------------------------------------------------------
case '5':
space.wav_channel_i = LASERBOY_SIGNAL_MONO_O_SCOPE;
bad_key = false;
break;
} // end switch(event.key.keysym.unicode)
} // end if(event.type == SDL_KEYDOWN)
} // end while(bad_key)
space.clean_screen();
space.overlay_wav_channel_i_options();
display_space();
return;
}
//############################################################################
void LaserBoy_SDL_GUI::dots_setting_menu()
{
bool bad_key = true;
space.TUI_clue = "dots setting";
while(bad_key)
{
space.clean_screen();
space.overlay_dots_options();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
space.TUI_clue = "action canceled";
return;
//------------------------------------------------------------
case '1':
space.dots_setting = LASERBOY_DOTS_IGNORE;
bad_key = false;
break;
//------------------------------------------------------------
case '2':
space.dots_setting = LASERBOY_DOTS_REMOVE;
bad_key = false;
break;
//------------------------------------------------------------
case '3':
space.dots_setting = LASERBOY_DOTS_ENHANCE;
bad_key = false;
break;
}
}
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::bit_resolution_menu()
{
bool in_menu = true;
u_int temp_u_int;
//------------------------------------------------------------------------
prompt_escaped = false;
while(in_menu)
{
space.clean_screen();
space.render_space();
space.overlay_bit_resolution_settings();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit bit resolution";
break;
//------------------------------------------------------------
default:
space.TUI_clue = "bad key";
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//------------------------------------------------------------
case SDLK_F3:
capture_screen();
space.TUI_clue = "Screen Captured";
break;
//------------------------------------------------------------
case 'a':
case 'A':
space.clean_screen();
space.render_space();
space.overlay_bit_resolution_settings();
display_space();
temp_u_int = display_prompt_and_echo_nibble("number of bits to mask (0 ~ f) for X");
if(prompt_escaped)
break;
space.signal_bit_mask[LASERBOY_CHANNEL_X] = temp_u_int;
break;
//------------------------------------------------------------
case 'b':
case 'B':
space.clean_screen();
space.render_space();
space.overlay_bit_resolution_settings();
display_space();
temp_u_int = display_prompt_and_echo_nibble("number of bits to mask (0 ~ f) for Y");
if(prompt_escaped)
break;
space.signal_bit_mask[LASERBOY_CHANNEL_Y] = temp_u_int;
break;
//------------------------------------------------------------
case 'c':
case 'C':
space.clean_screen();
space.render_space();
space.overlay_bit_resolution_settings();
display_space();
temp_u_int = display_prompt_and_echo_nibble("number of bits to mask (0 ~ f) for Z");
if(prompt_escaped)
break;
space.signal_bit_mask[LASERBOY_CHANNEL_Z] = temp_u_int;
break;
//------------------------------------------------------------
case 'd':
case 'D':
space.clean_screen();
space.render_space();
space.overlay_bit_resolution_settings();
display_space();
temp_u_int = display_prompt_and_echo_nibble("number of bits to mask (0 ~ f) for red");
if(prompt_escaped)
break;
space.signal_bit_mask[LASERBOY_CHANNEL_R] = temp_u_int;
break;
//------------------------------------------------------------
case 'e':
case 'E':
space.clean_screen();
space.render_space();
space.overlay_bit_resolution_settings();
display_space();
temp_u_int = display_prompt_and_echo_nibble("number of bits to mask (0 ~ f) for green");
if(prompt_escaped)
break;
space.signal_bit_mask[LASERBOY_CHANNEL_G] = temp_u_int;
break;
//------------------------------------------------------------
case 'f':
case 'F':
space.clean_screen();
space.render_space();
space.overlay_bit_resolution_settings();
display_space();
temp_u_int = display_prompt_and_echo_nibble("number of bits to mask (0 ~ f) for blue");
if(prompt_escaped)
break;
space.signal_bit_mask[LASERBOY_CHANNEL_B] = temp_u_int;
break;
//------------------------------------------------------------
case 'g':
case 'G':
space.clean_screen();
space.render_space();
space.overlay_bit_resolution_settings();
display_space();
temp_u_int = display_prompt_and_echo_nibble("number of bits to mask (0 ~ f) for intensity");
if(prompt_escaped)
break;
space.signal_bit_mask[LASERBOY_CHANNEL_I] = temp_u_int;
break;
//------------------------------------------------------------
case 'h':
space.clean_screen();
space.current_frame().impose_bit_resolution();
space.render_space();
space.overlay_bit_resolution_settings();
display_space();
space.TUI_clue = "imposed bit resolution";
break;
//------------------------------------------------------------
case 'H':
space.TUI_clue = "imposing bit resolution";
space.clean_screen();
space.impose_bit_resolution();
space.render_space();
display_space();
space.TUI_clue = "imposed bit resolution all";
break;
//------------------------------------------------------------
} // end switch(SDL_Keysym_to_char(&event.key.keysym))
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::visuals_settings_menu()
{
bool in_menu = true;
//------------------------------------------------------------------------
while(in_menu)
{
space.clean_screen();
space.render_space();
space.overlay_visuals_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
//------------------------------------------------------------
case SDLK_BACKSPACE:
case SDLK_DELETE:
space.delete_current_frame();
space.TUI_clue = "deleted";
break;
//------------------------------------------------------------
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit UI visuals";
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
case '1':
space.show_vectors = !space.show_vectors;
if(space.show_vectors)
space.TUI_clue = "show vectors";
else
space.TUI_clue = "hide vectors";
break;
//------------------------------------------------------------
case '2':
space.show_vertices = !space.show_vertices;
if(space.show_vertices)
space.TUI_clue = "show vertices";
else
space.TUI_clue = "hide vertices";
break;
//------------------------------------------------------------
case '3':
space.show_direction = !space.show_direction;
if(space.show_direction)
space.TUI_clue = "show direction";
else
space.TUI_clue = "hide direction";
break;
//------------------------------------------------------------
case '4':
space.show_blanking = !space.show_blanking;
if(space.show_blanking)
space.TUI_clue = "show blanking";
else
space.TUI_clue = "hide blanking";
break;
//------------------------------------------------------------
case '5':
space.show_intro = !space.show_intro;
if(space.show_intro)
space.TUI_clue = "show intro";
else
space.TUI_clue = "hide intro";
break;
//------------------------------------------------------------
case '6':
space.show_bridge = !space.show_bridge;
if(space.show_bridge)
space.TUI_clue = "show bridge";
else
space.TUI_clue = "hide bridge";
break;
//------------------------------------------------------------
case '7':
space.show_coda = !space.show_coda;
if(space.show_coda)
space.TUI_clue = "show coda";
else
space.TUI_clue = "hide coda";
break;
//------------------------------------------------------------
case '8':
space.show_indices = !space.show_indices;
if(space.show_indices)
space.TUI_clue = "show indices";
else
space.TUI_clue = "hide indices";
break;
//------------------------------------------------------------
case '9':
space.show_palette = !space.show_palette;
if(space.show_palette)
space.TUI_clue = "show palette";
else
space.TUI_clue = "hide palette";
break;
//------------------------------------------------------------
case '0':
space.show_target_palette = !space.show_target_palette;
if(space.show_target_palette)
space.TUI_clue = "show target palette";
else
space.TUI_clue = "hide target palette";
break;
//------------------------------------------------------------
case 'a':
case 'A':
space.show_stats = !space.show_stats;
if(space.show_stats)
space.TUI_clue = "show stats";
else
space.TUI_clue = "hide stats";
break;
//------------------------------------------------------------
case 'b':
case 'B':
space.transparent_menu_font = (!space.transparent_menu_font) * 4;
if(space.transparent_menu_font == 4)
space.TUI_clue = "transparent menu font";
else
space.TUI_clue = "opaque menu font";
break;
//------------------------------------------------------------
case 'c':
case 'C':
space.rainbow_menus = !space.rainbow_menus;
if(space.rainbow_menus)
{
if(space.bg_color.sum() >= 384)
space.white_text = LaserBoy_color(0, 0, 0);
else
space.white_text = LaserBoy_color(255, 255, 255);
space.TUI_clue = "rainbow menus";
}
else
{
space.white_text = space.mono_text;
space.TUI_clue = "no rainbows for you";
}
break;
//------------------------------------------------------------
case 'd':
case 'D':
space.show_fixed_bounds = !space.show_fixed_bounds;
if(space.show_fixed_bounds)
space.TUI_clue = "show fixed bounds";
else
space.TUI_clue = "hide fixed bounds";
break;
//------------------------------------------------------------
case 'e':
case 'E':
space.show_fixed_origin = !space.show_fixed_origin;
if(space.show_fixed_origin)
space.TUI_clue = "show fixed origin";
else
space.TUI_clue = "hide fixed origin";
break;
//------------------------------------------------------------
case 'f':
case 'F':
space.show_floating_axis = !space.show_floating_axis;
if(space.show_floating_axis)
space.TUI_clue = "show floating axis";
else
space.TUI_clue = "hide floating axis";
break;
//------------------------------------------------------------
case 'g':
case 'G':
space.show_floating_bounds = !space.show_floating_bounds;
if(space.show_floating_bounds)
space.TUI_clue = "show floating bounds";
else
space.TUI_clue = "hide floating bounds";
break;
//------------------------------------------------------------
case 'h':
case 'H':
space.show_onion_skin = !space.show_onion_skin;
if(space.show_onion_skin)
space.TUI_clue = "show onion skin";
else
space.TUI_clue = "hide onion skin";
break;
//------------------------------------------------------------
case 'i':
case 'I':
space.show_onion_visuals = !space.show_onion_visuals;
if(space.show_onion_visuals)
space.TUI_clue = "show onion visuals";
else
space.TUI_clue = "hide onion visuals";
break;
//------------------------------------------------------------
case 'j':
case 'J':
space.show_Z_as_order = !space.show_Z_as_order;
if(space.show_Z_as_order)
space.TUI_clue = "show order in Z";
else
space.TUI_clue = "show normal 3D";
break;
//------------------------------------------------------------
case 'k':
case 'K':
space.show_quad_view = !space.show_quad_view;
space.view_has_changed = true;
if(space.show_quad_view)
space.TUI_clue = "show quad view";
else
space.TUI_clue = "hide quad view";
break;
//------------------------------------------------------------
case 'l':
case 'L':
space.loop_animation = !space.loop_animation;
if(space.loop_animation)
space.TUI_clue = "loop animation";
else
space.TUI_clue = "stop animatiion at ends";
break;
//------------------------------------------------------------
case 'm':
case 'M':
space.approximate_frame_rate = !space.approximate_frame_rate;
if(space.approximate_frame_rate)
space.TUI_clue = "aproximate frame rate";
else
space.TUI_clue = "as fast as possible";
break;
//------------------------------------------------------------
case 'n':
case 'N':
space.show_effects_generation = !space.show_effects_generation;
if(space.show_effects_generation)
space.TUI_clue = "show live rendering";
else
space.TUI_clue = "hide live rendering";
break;
//------------------------------------------------------------
case 'o':
case 'O':
space.show_cursor_limits_msg = !space.show_cursor_limits_msg;
if(space.show_cursor_limits_msg)
space.TUI_clue = "show cursor limits";
else
space.TUI_clue = "hide cursor limits";
break;
//------------------------------------------------------------
case 'p':
case 'P':
space.infinite_vector = !space.infinite_vector;
if(space.infinite_vector)
space.TUI_clue = "show infinite vector";
else
space.TUI_clue = "hide infinite vector";
break;
//------------------------------------------------------------
case 'q':
case 'Q':
space.show_TUI_clue = !space.show_TUI_clue;
if(space.show_TUI_clue)
space.TUI_clue = "show UI hint";
else
space.TUI_clue = "hide UI hint";
break;
//------------------------------------------------------------
case 'r':
case 'R':
space.track_bmp_view = !space.track_bmp_view;
if(space.track_bmp_view)
space.TUI_clue = "track bmp view";
else
space.TUI_clue = "fixed bmp";
break;
//------------------------------------------------------------
case 's':
case 'S':
space.move_menu = !space.move_menu;
if(space.move_menu)
space.TUI_clue = "move menu";
else
space.TUI_clue = "home menu";
break;
//------------------------------------------------------------
case 'z': // +100 frames
if(space.number_of_frames() > 100)
{
if( space.loop_animation
|| (space.frame_index <= (space.number_of_frames() - 101))
)
space.frame_index += 100;
while(space.frame_index >= space.number_of_frames())
space.frame_index = space.frame_index - space.number_of_frames();
space.TUI_clue = "+100 frames";
}
break;
//------------------------------------------------------------
case 'Z': // -100 frames
if(space.number_of_frames() > 100)
{
if(space.frame_index >= 100)
space.frame_index -= 100;
else if( space.loop_animation
&& (space.frame_index < 100)
)
{
space.frame_index = space.number_of_frames() + space.frame_index;
space.frame_index -= 100;
}
space.TUI_clue = "-100 frames";
}
break;
//------------------------------------------------------------
case ' ': // [Space] select, deselect current frame
space.current_frame().is_selected = !(space.current_frame().is_selected);
if(space.current_frame().is_selected)
space.TUI_clue = "select frame";
else
space.TUI_clue = "deselect frame";
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::file_type_specific_options_menu()
{
bool in_menu = true;
//------------------------------------------------------------------------
while(in_menu)
{
space.clean_screen();
space.render_space();
space.overlay_file_type_specific_options_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//------------------------------------------------------------
case SDLK_F3:
capture_screen();
space.TUI_clue = "Screen Captured";
break;
//------------------------------------------------------------
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit switch settings";
break;
//------------------------------------------------------------
//------------------------------------------------------------
case '1':
space.save_ild_fmt_4_5 = !space.save_ild_fmt_4_5;
if(space.save_ild_fmt_4_5)
space.TUI_clue = "ild 4,5";
else
space.TUI_clue = "ild 0,1,2,(!3)";
break;
//------------------------------------------------------------
case '2':
space.save_2D_as_3D = !space.save_2D_as_3D;
if(space.save_2D_as_3D)
space.TUI_clue = "ild save 2D as 3D";
else
space.TUI_clue = "ild save 2D as 2D";
break;
//------------------------------------------------------------
case '3':
space.auto_scale_dxf = !space.auto_scale_dxf;
if(space.auto_scale_dxf)
space.TUI_clue = "scale dxf import";
else
space.TUI_clue = "no scale dxf import";
break;
//------------------------------------------------------------
case '4':
space.save_true_color_dxf = !space.save_true_color_dxf;
if(space.save_true_color_dxf)
space.TUI_clue = "dxf 24-bit";
else
space.TUI_clue = "dxf palette";
break;
//------------------------------------------------------------
case '5':
space.save_txt_unit = !space.save_txt_unit;
if(space.save_txt_unit)
space.TUI_clue = "save txt unit";
else
space.TUI_clue = "save txt short";
break;
//------------------------------------------------------------
case '6':
space.save_txt_with_color = !space.save_txt_with_color;
if(space.save_txt_with_color)
space.TUI_clue = "save txt rgb";
else
space.TUI_clue = "save txt palette & tables";
break;
//------------------------------------------------------------
case '7':
space.save_txt_color_hex = !space.save_txt_color_hex;
if(space.save_txt_color_hex)
space.TUI_clue = "save txt hex";
else
space.TUI_clue = "save txt r g b";
break;
//------------------------------------------------------------
case '8':
space.save_txt_named_palettes = !space.save_txt_named_palettes;
if(space.save_txt_named_palettes)
space.TUI_clue = "save named palettes";
else
space.TUI_clue = "assume named palettes";
break;
//------------------------------------------------------------
//------------------------------------------------------------
case ' ': // [Space] select, deselect current frame
space.current_frame().is_selected = !(space.current_frame().is_selected);
if(space.current_frame().is_selected)
space.TUI_clue = "select frame";
else
space.TUI_clue = "deselect frame";
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
//------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::apply_view_menu()
{
bool in_menu = true;
space.simplify_view_angle();
//------------------------------------------------------------------------
while(in_menu)
{
space.clean_screen();
space.render_space();
space.overlay_view_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit view";
break;
//------------------------------------------------------------
case SDLK_BACKSPACE:
case SDLK_DELETE:
space.delete_current_frame();
space.TUI_clue = "deleted";
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
check_for_digit_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
check_for_digit_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
case 'q':
space.view_offset.x += space.displacement_step;
space.TUI_clue = "+ pan X";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'Q':
space.view_offset.x -= space.displacement_step;
space.TUI_clue = "- pan X";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'w':
space.view_offset.y += space.displacement_step;
space.TUI_clue = "+ pan Y";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'W':
space.view_offset.y -= space.displacement_step;
space.TUI_clue = "- pan Y";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'e':
space.view_offset += space.displacement_step;
space.TUI_clue = "+ pan XY";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'E':
space.view_offset -= space.displacement_step;
space.TUI_clue = "- pan XY";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'r':
case 'R':
space.view_offset = 0;
space.TUI_clue = "on center";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'a':
space.view_scale.x *= space.magnitude_step_up;
space.TUI_clue = "+ zoom X";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'A':
space.view_scale.x *= space.magnitude_step_dn;
space.TUI_clue = "- zoom X";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 's':
space.view_scale.y *= space.magnitude_step_up;
space.TUI_clue = "+ zoom Y";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'S':
space.view_scale.y *= space.magnitude_step_dn;
space.TUI_clue = "- zoom Y";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'd':
space.view_scale *= space.magnitude_step_up;
space.TUI_clue = "+ zoom XY";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'D':
space.view_scale *= space.magnitude_step_dn;
space.TUI_clue = "- zoom XY";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'f':
case 'F':
space.view_scale = 1.0;
space.TUI_clue = "no zoom";
space.view_has_changed = true;
break;
//------------------------------------------------------------
case 'v':
if(!space.current_frame().apply_view())
{
space.view_angle = 0.0;
space.view_offset = 0;
space.view_scale = 1.0;
space.TUI_clue = "set view frame";
space.view_has_changed = true;
}
else
space.TUI_clue = "out of bounds!";
break;
//------------------------------------------------------------
case 'V':
space.TUI_clue = "setting all";
space.render_space();
display_space();
{ // scope
LaserBoy_frame_set current(space);
if(!space.apply_view())
{
space.view_angle = 0.0;
space.view_offset = 0;
space.view_scale = 1.0;
space.TUI_clue = "set view frame";
space.view_has_changed = true;
}
else
{
space = current;
space.display_error("out of bounds!");
wait_4_Esc();
}
}
break;
//------------------------------------------------------------
case 'z': // +100 frames
if(space.number_of_frames() > 100)
{
if( space.loop_animation
|| (space.frame_index <= (space.number_of_frames() - 101))
)
space.frame_index += 100;
while(space.frame_index >= space.number_of_frames())
space.frame_index = space.frame_index - space.number_of_frames();
space.TUI_clue = "+100 frames";
}
break;
//------------------------------------------------------------
case 'Z': // -100 frames
if(space.number_of_frames() > 100)
{
if(space.frame_index >= 100)
space.frame_index -= 100;
else if( space.loop_animation
&& (space.frame_index < 100)
)
{
space.frame_index = space.number_of_frames() + space.frame_index;
space.frame_index -= 100;
}
space.TUI_clue = "-100 frames";
}
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
bool LaserBoy_SDL_GUI::frame_color_trans_menu()
{
bool in_menu = true,
show_menu_was = space.show_menu,
show_palette_was = space.show_palette,
show_target_palette_was = space.show_target_palette;
int temp_int;
u_int temp_u_int;
double temp_double;
space.show_menu = true;
space.show_palette = true;
space.show_target_palette = true;
//------------------------------------------------------------------------
while(in_menu)
{
space.clean_screen();
space.render_space();
if(space.show_menu)
space.overlay_frame_color_tranz_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
in_menu = false;
space.show_color_cursor = false;
space.show_menu = show_menu_was;
space.show_palette = show_palette_was;
space.show_target_palette = show_target_palette_was;
space.TUI_clue = "exit palette transforms";
return false;
//------------------------------------------------------------
case SDLK_BACKSPACE:
case SDLK_DELETE:
space.delete_current_frame();
space.TUI_clue = "deleted";
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
check_for_digit_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
check_for_digit_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
case 't': // toggle menu mode
case 'T':
space.alt_menu_c = !space.alt_menu_c;
if(space.alt_menu_c)
space.TUI_clue = "alt menu";
else
space.TUI_clue = "draw menu";
break;
//------------------------------------------------------------
// palette transforms (to frame)
//------------------------------------------------------------
case 'a':
if(space.alt_menu_c)
space.current_frame().span_x_hues(space.recolor_span_factor, 0);
else
space.current_frame().span_x_palette(space.recolor_span_factor, 0);
space.TUI_clue = "span X frame";
break;
//------------------------------------------------------------
case 'A':
space.TUI_clue = "span X all";
space.render_space();
display_space();
if(space.alt_menu_c)
space.span_x_hues();
else
space.span_x_palette();
space.TUI_clue = "span X done";
break;
//------------------------------------------------------------
case 'b':
if(space.alt_menu_c)
space.current_frame().span_y_hues(space.recolor_span_factor, 0);
else
space.current_frame().span_y_palette(space.recolor_span_factor, 0);
space.TUI_clue = "span Y frame";
break;
//------------------------------------------------------------
case 'B':
space.TUI_clue = "span Y all";
space.render_space();
display_space();
if(space.alt_menu_c)
space.span_y_hues();
else
space.span_y_palette();
space.TUI_clue = "span Y done";
break;
//------------------------------------------------------------
case 'c':
if(space.alt_menu_c)
space.current_frame().span_z_hues(space.recolor_span_factor, 0);
else
space.current_frame().span_z_palette(space.recolor_span_factor, 0);
space.TUI_clue = "span Z frame";
break;
//------------------------------------------------------------
case 'C':
space.TUI_clue = "span Z all";
space.render_space();
display_space();
if(space.alt_menu_c)
space.span_z_hues();
else
space.span_z_palette();
space.TUI_clue = "span Z done";
break;
//------------------------------------------------------------
case 'd':
if(space.alt_menu_c)
space.current_frame().span_radial_hues(space.recolor_span_factor, space.frame_index);
else
space.current_frame().span_radial_palette(space.recolor_span_factor, space.frame_index);
space.TUI_clue = "span radially from origin";
break;
//------------------------------------------------------------
case 'D':
space.TUI_clue = "span radially from origin";
space.render_space();
display_space();
if(space.alt_menu_c)
space.span_radial_hues();
else
space.span_radial_palette();
space.TUI_clue = "done";
break;
//------------------------------------------------------------
case 'e':
if(space.alt_menu_c)
space.current_frame().span_axial_hues(space.recolor_span_factor, space.frame_index);
else
space.current_frame().span_axial_palette(space.recolor_span_factor, space.frame_index);
space.TUI_clue = "span angular around origin";
break;
//------------------------------------------------------------
case 'E':
space.TUI_clue = "span angular around origin";
space.render_space();
display_space();
if(space.alt_menu_c)
space.span_axial_hues();
else
space.span_axial_palette();
space.TUI_clue = "done";
break;
//------------------------------------------------------------
case 'f':
if(space.alt_menu_c)
space.current_frame().span_hues(space.recolor_span_factor, space.frame_index);
else
space.current_frame().span_palette(space.recolor_span_factor, space.frame_index);
space.TUI_clue = "span vertices frame";
break;
//------------------------------------------------------------
case 'F':
space.TUI_clue = "span vertices all";
space.render_space();
display_space();
if(space.alt_menu_c)
space.span_hues();
else
space.span_palette();
space.TUI_clue = "done";
break;
//------------------------------------------------------------
case 'g':
if(space.alt_menu_c)
space.current_frame().index_hues(space.recolor_index_multiple, space.frame_index);
else
space.current_frame().index_palette(space.recolor_index_multiple, space.frame_index);
space.TUI_clue = "index vertices frame";
break;
//------------------------------------------------------------
case 'G':
space.TUI_clue = "index vertices all";
space.render_space();
display_space();
if(space.alt_menu_c)
space.index_hues();
else
space.index_palette();
space.TUI_clue = "done";
break;
//------------------------------------------------------------
case 'h':
if(space.alt_menu_c)
space.current_frame().span_segments_hues(space.recolor_span_factor, space.frame_index);
else
space.current_frame().span_segments_palette(space.recolor_span_factor, space.frame_index);
space.TUI_clue = "span segments frame";
break;
//------------------------------------------------------------
case 'H':
if(space.alt_menu_c)
space.TUI_clue = "span segments all";
space.render_space();
display_space();
if(space.alt_menu_c)
space.span_segments_hues();
else
space.span_segments_palette();
space.TUI_clue = "done";
break;
//------------------------------------------------------------
case 'i':
if(space.alt_menu_c)
space.current_frame().index_segments_hues(space.recolor_index_multiple, space.frame_index);
else
space.current_frame().index_segments_palette(space.recolor_index_multiple, space.frame_index);
space.TUI_clue = "index segments frame";
break;
//------------------------------------------------------------
case 'I':
space.TUI_clue = "index segments all";
space.render_space();
display_space();
if(space.alt_menu_c)
space.index_segments_hues();
else
space.index_segments_palette();
space.TUI_clue = "done";
break;
//------------------------------------------------------------
case 'j':
if(space.alt_menu_c)
space.current_frame().random_color_vectors_hues(space.recolor_index_multiple);
else
space.current_frame().random_color_vectors_palette(space.recolor_index_multiple);
space.TUI_clue = "random vertices frame";
break;
//------------------------------------------------------------
case 'J':
space.TUI_clue = "random vertices all";
space.render_space();
display_space();
if(space.alt_menu_c)
space.random_color_vectors_hues();
else
space.random_color_vectors_palette();
space.TUI_clue = "done";
break;
//------------------------------------------------------------
case 'k':
if(space.alt_menu_c)
space.current_frame().random_color_segments_hues();
else
space.current_frame().random_color_segments_palette();
space.TUI_clue = "random segments frame";
break;
//------------------------------------------------------------
case 'K':
space.TUI_clue = "random segments all";
space.render_space();
display_space();
if(space.alt_menu_c)
space.random_color_segments_hues();
else
space.random_color_segments_palette();
space.TUI_clue = "done";
break;
//------------------------------------------------------------
//------------------------------------------------------------
case 'l':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.current_frame().best_match_target_palette();
space.TUI_clue = "best match frame";
}
break;
//------------------------------------------------------------
case 'L':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "best match all";
space.render_space();
display_space();
space.best_match_target_palette();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 'm':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.current_frame().to_target_palette_by_index();
space.TUI_clue = "by index frame";
}
break;
//------------------------------------------------------------
case 'M':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "by index all";
space.render_space();
display_space();
space.to_target_palette_by_index();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 'n':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.current_frame().strip_color();
space.TUI_clue = "strip color frame";
}
break;
//------------------------------------------------------------
case 'N':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "strip color all";
space.render_space();
display_space();
space.strip_color();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 'o':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.current_frame().strip_color_or();
space.TUI_clue = "strip color frame";
}
break;
//------------------------------------------------------------
case 'O':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "strip color all";
space.render_space();
display_space();
space.strip_color_or();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 'p':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.current_frame().strip_color_avg();
space.TUI_clue = "strip color frame";
}
break;
//------------------------------------------------------------
case 'P':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "strip color all";
space.render_space();
display_space();
space.strip_color_avg();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 'q':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.current_frame().promote_to_true_color();
space.TUI_clue = "promote to 24bit frame";
}
break;
//------------------------------------------------------------
case 'Q':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "promote to 24bit all";
space.render_space();
display_space();
space.promote_to_true_color();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 'r':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.current_frame().sync_rgb_and_palette();
space.TUI_clue = "24-bit to palette frame";
}
break;
//------------------------------------------------------------
case 'R':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "24-bit to palette all";
space.render_space();
display_space();
space.minimize_tables_and_palettes();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 's':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.current_frame().bit_reduce_to_palette();
space.TUI_clue = "888 to 332 frame";
}
break;
//------------------------------------------------------------
case 'S':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "888 to 332 all";
space.render_space();
display_space();
space.bit_reduce_to_palette();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 'v':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.current_frame().best_reduce_to_palette();
space.TUI_clue = "best reduce to minimum palette";
}
break;
//------------------------------------------------------------
case 'V':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "best reduce to minimum palette";
space.render_space();
display_space();
space.best_reduce_to_palette();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 'u':
case 'U':
if(space.alt_menu_c)
space.TUI_clue = "bad key";
else
{
space.TUI_clue = "best reduce all to 1";
space.render_space();
display_space();
space.best_reduce_all_to_palette();
space.TUI_clue = "done";
}
break;
//------------------------------------------------------------
case 'z': // +100 frames
if(space.number_of_frames() > 100)
{
if( space.loop_animation
|| (space.frame_index <= (space.number_of_frames() - 101))
)
space.frame_index += 100;
while(space.frame_index >= space.number_of_frames())
space.frame_index = space.frame_index - space.number_of_frames();
space.TUI_clue = "+100 frames";
}
break;
//------------------------------------------------------------
case 'Z': // -100 frames
if(space.number_of_frames() > 100)
{
if(space.frame_index >= 100)
space.frame_index -= 100;
else if( space.loop_animation
&& (space.frame_index < 100)
)
{
space.frame_index = space.number_of_frames() + space.frame_index;
space.frame_index -= 100;
}
space.TUI_clue = "-100 frames";
}
break;
//------------------------------------------------------------
case '.':
if(space.palette_index >= 0)
{
space.target_palette_index = space.palette_index;
space.TUI_clue = "target to current";
}
else
space.TUI_clue = "current is -24-bit-";
break;
//------------------------------------------------------------
case ',':
{
u_int i;
for(i = 0; i < space.number_of_frames(); i++)
if(space.frame_picker(i).palette_index == (int)space.target_palette_index)
{
space.frame_index = i;
break;
}
if(i == space.number_of_frames())
{
space.display_message("no frame uses this palette.");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case '=':
if(space.alt_menu_c)
temp_double = display_prompt_and_echo_double( "recolor hues span factor"
, space.recolor_span_factor
, 1530.0
, 0.0
);
else
temp_double = display_prompt_and_echo_double( "recolor palette span factor"
, space.recolor_span_factor
, 255.0
, 0.0
);
if(prompt_escaped)
break;
space.recolor_span_factor = temp_double;
break;
//------------------------------------------------------------
case '+':
if(space.alt_menu_c)
temp_u_int = display_prompt_and_echo_u_int( "recolor hues index multiple"
, space.recolor_index_multiple
, 65535
);
else
temp_u_int = display_prompt_and_echo_u_int( "recolor palette index multiple"
, space.recolor_index_multiple
, 65535
);
if(prompt_escaped)
break;
space.recolor_index_multiple = temp_u_int;
break;
//------------------------------------------------------------
case '-':
if(space.alt_menu_c)
temp_int = display_prompt_and_echo_u_int( "recolor hues index frame shift"
, space.color_frame_shift
, 1530
);
else
temp_int = display_prompt_and_echo_u_int( "recolor palette index frame shift"
, space.color_frame_shift
, 255
);
if(prompt_escaped)
break;
space.color_frame_shift = temp_int;
break;
//------------------------------------------------------------
case '<':
space.current_frame().convert_black_to_color();
space.TUI_clue = "black to color";
break;
//------------------------------------------------------------
case '>':
space.convert_black_to_color();
space.TUI_clue = "black to color all";
break;
//------------------------------------------------------------
case '`':
animate_forward();
break;
//------------------------------------------------------------
case '~':
animate_reverse();
break;
//------------------------------------------------------------
case '/': // show frame_set stats
space.show_frame_set_stats = !space.show_frame_set_stats;
break;
//------------------------------------------------------------
case '?': // show frame stats
space.show_frame_stats = !space.show_frame_stats;
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
case SDLK_RETURN:
space.show_menu = !space.show_menu;
if(!space.show_menu)
space.TUI_clue = "[Enter] show menu";
else
space.TUI_clue = "[Enter] hide menu";
break;
}
}
}
space.show_menu = show_menu_was;
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::palette_set_trans_menu()
{
bool in_menu = true,
show_menu_was = space.show_menu,
show_target_palette_was = space.show_target_palette;
int ps_was = 0;
space.show_menu = true;
space.show_target_palette = true;
space.show_color_cursor = true;
prompt_escaped = false;
//------------------------------------------------------------------------
while(in_menu)
{
space.clean_screen();
space.render_space();
if(space.show_menu)
space.overlay_palette_set_tranz_menu();
display_space();
ps_was = space.number_of_palettes();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
in_menu = false;
space.show_color_cursor = false;
space.show_menu = show_menu_was;
space.show_target_palette = show_target_palette_was;
space.TUI_clue = "exit palette transforms";
return false;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
check_for_digit_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
check_for_digit_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
// palette transforms (to palettes and set)
case 'a': // import from txt
case 'A':
{ // scope
int current_palette_count = space.number_of_palettes(),
new_palette_count;
space.clean_screen();
space.file_name.clear();
space.get_file_list(LASERBOY_TXT_SHARE, ".txt");
space.overlay_file_list();
display_space();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("txt palette file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.TUI_clue = "loading " + space.file_name;
display_space();
space.palettes_from_txt_file(LASERBOY_TXT_SHARE + space.file_name);
new_palette_count = space.number_of_palettes() - current_palette_count;
if(space.palette_set_error & LASERBOY_FILE_OPEN_FAILED) // open failed
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
if(space.palette_set_error & LASERBOY_TXT_SYNTAX_ERROR) // word error in txt
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " format error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.palette_set_error & LASERBOY_TXT_PALETTE_FAILED) // palette name error
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.palette_set_error & LASERBOY_PALETTE_NAME_IN_USE)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name in use (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_TXT_PALETTE_NAME_TOO_LONG)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " more than 8 characters in palette name (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(new_palette_count)
{
stringstream strings;
strings << new_palette_count
<< " palette"
<< ( (new_palette_count == 1)
? (" ")
: ("s ")
);
strings << "found in "
<< LASERBOY_TXT_SHARE
<< space.file_name;
space.display_message(strings.str());
space.target_palette_index = space.number_of_palettes() - 1;
wait_4_any_key();
}
} // end else (file opened)
space.TUI_clue = LASERBOY_TXT_SHARE + space.file_name;
break;
}
//------------------------------------------------------------
case 'b': // import from bmp
case 'B':
space.clean_screen();
space.file_name.clear();
space.get_file_list(LASERBOY_BMP_SHARE, ".bmp");
space.overlay_file_list();
display_space();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("bitmap file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".bmp";
space.TUI_clue = "loading " + space.file_name;
display_space();
switch(space.copy_palette_from_bmp(LASERBOY_BMP_SHARE + space.file_name, space.file_name.substr(0, space.file_name.size() - 4)))
{
default:
case LASERBOY_FILE_OPEN_FAILED:
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
case LASERBOY_PALETTE_ALREADY_DEFINED:
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " has already been loaded into the palette set");
wait_4_Esc();
break;
case LASERBOY_NO_PALETTES_FOUND:
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " is not a palette bmp");
wait_4_Esc();
break;
case LASERBOY_OK:
space.TUI_clue = "bmp palette" + space.file_name;
break;
}
break;
//------------------------------------------------------------
case 'c': // export to txt
case 'C':
space.clean_screen();
space.render_space();
space.file_name.clear();
space.get_file_list(LASERBOY_TXT_SHARE, ".txt");
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new palette file name [use palette name]", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = space.target_palette().name + ".txt";
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.TUI_clue = "saving txt";
if( file_exists(LASERBOY_TXT_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.palette_picker(space.target_palette_index).save_as_txt(LASERBOY_TXT_SHARE + space.file_name))
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "txt palette saved";
break;
//------------------------------------------------------------
case 'd': // export to txt all added palettes
case 'D':
space.clean_screen();
space.render_space();
space.file_name.clear();
space.get_file_list(LASERBOY_TXT_SHARE, ".txt");
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new palette file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.TUI_clue = "saving txt";
if( file_exists(LASERBOY_TXT_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
switch(space.save_new_palettes_as_txt(LASERBOY_TXT_SHARE + space.file_name))
{
default:
case LASERBOY_FILE_OPEN_FAILED:
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
case LASERBOY_NO_PALETTES_FOUND:
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " no added palettes to save");
wait_4_Esc();
break;
case LASERBOY_OK:
space.TUI_clue = "txt palette saved";
break;
}
}
break;
//------------------------------------------------------------
case 'e':
case 'E':
space.TUI_clue = "clear unused palettes";
space.render_space();
display_space();
space.clear_unused_palettes();
space.TUI_clue = "done";
break;
//------------------------------------------------------------
case 'f':
case 'F':
if(space.target_palette_index < LASERBOY_BUILT_IN_PALETTES)
{
space.display_error("built in");
wait_4_Esc();
}
else if(!space.omit_palette(space.target_palette_index))
{
space.display_error("in use");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'g':
case 'G':
space.add_palette();
break;
//------------------------------------------------------------
case 'h':
case 'H':
space.copy_palette(space.target_palette_index);
if(ps_was == space.number_of_palettes())
{
space.display_error("palette has no colors!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'i':
case 'I':
space.copy_palette_reverse(space.target_palette_index);
if(ps_was == space.number_of_palettes())
{
space.display_error("palette has no colors!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'j':
case 'J':
space.copy_palette_reorder(space.target_palette_index);
if(ps_was == space.number_of_palettes())
{
space.display_error("palette has no colors!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'k':
case 'K':
space.copy_palette_negative(space.target_palette_index);
if(ps_was == space.number_of_palettes())
{
space.display_error("palette has no colors!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'l':
case 'L':
space.copy_palette_expanded(space.target_palette_index);
if(ps_was == space.number_of_palettes())
{
space.display_error("palette has no colors!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'm':
case 'M':
add_color_to_target_palette_menu();
break;
//------------------------------------------------------------
case 'n':
case 'N':
edit_color_in_target_palette_menu();
break;
//------------------------------------------------------------
case 'o':
case 'O':
insert_color_in_target_palette_menu();
break;
//------------------------------------------------------------
case 'q':
case 'Q':
if(space.target_palette_index < LASERBOY_BUILT_IN_PALETTES)
{
space.add_palette();
space.palette_picker(space.number_of_palettes() - 1) = space.target_palette();
space.target_palette_index = space.number_of_palettes() - 1;
space.target_palette().name = GUID8char();
space.target_palette().erase_index(space.selected_color_index);
}
else
space.target_palette().erase_index(space.selected_color_index);
space.sync_rgb_and_palette();
break;
//------------------------------------------------------------
case 'r':
case 'R':
if(space.target_palette_index < LASERBOY_BUILT_IN_PALETTES)
{
int temp = space.target_palette_index;
space.add_palette();
string name = space.target_palette().name;
space.target_palette() = space.palette_picker(temp);
space.target_palette().name = name;
space.target_palette().clear_from_index(space.selected_color_index);
}
else
space.target_palette().clear_from_index(space.selected_color_index);
space.sync_rgb_and_palette();
break;
//------------------------------------------------------------
case 's':
case 'S':
if(space.target_palette_index >= LASERBOY_BUILT_IN_PALETTES)
{
string name;
do
{
name = display_prompt_and_echo_name("(unique) new target palette name", 8);
if(name.size() == 0)
break;
name += "________";
name = name.substr(0, 8);
} while(space.is_palette_name(name));
if(prompt_escaped)
break;
if(name.size() == 0)
break;
space.target_palette().name = name;
}
else
{
space.display_message("only added palettes can be renamed.");
wait_4_any_key();
}
break;
//------------------------------------------------------------
case 't':
case 'T':
{
if(space.target_palette().number_of_colors() > 7)
if(!display_prompt_and_echo_bool("target palette has more than 7 colors defined. bend anyway ? : y | [any]"))
break;
int temp = space.target_palette_index;
space.add_palette();
space.target_palette() = space.palette_picker(temp);
space.target_palette().name = GUID8char();
space.target_palette().straight_blend();
}
break;
//------------------------------------------------------------
case 'u':
case 'U':
{
if(space.target_palette().number_of_colors() > 7)
if(!display_prompt_and_echo_bool("target palette has more than 7 colors defined. bend anyway ? : y | [any]"))
break;
int temp = space.target_palette_index;
space.add_palette();
space.target_palette() = space.palette_picker(temp);
space.target_palette().name = GUID8char();
space.target_palette().circular_blend();
}
break;
//------------------------------------------------------------
case 'z': // +100 frames
if(space.number_of_frames() > 100)
{
if( space.loop_animation
|| (space.frame_index <= (space.number_of_frames() - 101))
)
space.frame_index += 100;
while(space.frame_index >= space.number_of_frames())
space.frame_index = space.frame_index - space.number_of_frames();
space.TUI_clue = "+100 frames";
}
break;
//------------------------------------------------------------
case 'Z': // -100 frames
if(space.number_of_frames() > 100)
{
if(space.frame_index >= 100)
space.frame_index -= 100;
else if( space.loop_animation
&& (space.frame_index < 100)
)
{
space.frame_index = space.number_of_frames() + space.frame_index;
space.frame_index -= 100;
}
space.TUI_clue = "-100 frames";
}
break;
//------------------------------------------------------------
case 'p':
space.selected_color_index++;
if(space.selected_color_index >= space.greater_number_of_colors())
space.selected_color_index = 0;
space.TUI_clue = "+ color index";
break;
//------------------------------------------------------------
case 'P':
if(space.selected_color_index == 0)
space.selected_color_index = space.greater_number_of_colors();
space.selected_color_index--;
space.TUI_clue = "- color index";
break;
//------------------------------------------------------------
case '.': // set target to current
if(space.palette_index >= 0)
{
space.target_palette_index = space.palette_index;
space.TUI_clue = "target to current";
}
else
space.TUI_clue = "current is -24-bit-";
break;
//------------------------------------------------------------
case ',':
{
u_int i;
for(i = 0; i < space.number_of_frames(); i++)
if(space.frame_picker(i).palette_index == (int)space.target_palette_index)
{
space.frame_index = i;
break;
}
if(i == space.number_of_frames())
{
space.display_message("no frame uses this palette.");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case '`':
animate_forward();
break;
//------------------------------------------------------------
case '~':
animate_reverse();
break;
//------------------------------------------------------------
case '/': // show frame_set stats
space.show_frame_set_stats = !space.show_frame_set_stats;
break;
//------------------------------------------------------------
case '?': // show frame stats
space.show_frame_stats = !space.show_frame_stats;
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
case SDLK_RETURN:
space.show_menu = !space.show_menu;
if(!space.show_menu)
space.TUI_clue = "[Enter] show menu";
else
space.TUI_clue = "[Enter] hide menu";
break;
}
}
}
space.show_menu = show_menu_was;
return true;
}
//############################################################################
void LaserBoy_SDL_GUI::add_color_to_target_palette_menu()
{
prompt_escaped = false;
if(space.target_palette().number_of_colors() >= 255)
{
space.display_error("palette is full");
wait_4_Esc();
return;
}
space.clean_screen();
space.render_space();
u_char r = display_prompt_and_echo_u_char("red (0-255)", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_char g = display_prompt_and_echo_u_char("green (0-255)", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_char b = display_prompt_and_echo_u_char("blue (0-255)", 0);
if(prompt_escaped)
return;
if(space.target_palette_index < LASERBOY_BUILT_IN_PALETTES)
{
int temp = space.target_palette_index;
space.add_palette();
string name = space.target_palette().name;
space.target_palette() = space.palette_picker(temp);
space.target_palette().name = name;
}
space.target_palette().add_color(LaserBoy_color(r, g, b));
space.TUI_clue = "new color";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::insert_color_in_target_palette_menu()
{
prompt_escaped = false;
if(space.target_palette().number_of_colors() >= 255)
{
space.display_error("palette is full");
wait_4_Esc();
return;
}
space.clean_screen();
space.render_space();
u_char r = display_prompt_and_echo_u_char("red (0-255)", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_char g = display_prompt_and_echo_u_char("green (0-255)", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_char b = display_prompt_and_echo_u_char("blue (0-255)", 0);
if(prompt_escaped)
return;
if(space.target_palette_index < LASERBOY_BUILT_IN_PALETTES)
{
int temp = space.target_palette_index;
space.add_palette();
string name = space.target_palette().name;
space.target_palette() = space.palette_picker(temp);
space.target_palette().name = name;
}
space.target_palette().insert_color(LaserBoy_color(r, g, b), space.selected_color_index);
int frame_index = space.frame_index;
space.sync_rgb_and_palette();
space.frame_index = frame_index;
space.TUI_clue = "new color";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::edit_color_in_target_palette_menu()
{
prompt_escaped = false;
if(space.selected_color_index > space.target_palette().number_of_colors())
{
space.display_error("color index out of range");
wait_4_Esc();
return;
}
space.clean_screen();
space.render_space();
u_char r = display_prompt_and_echo_u_char("red (0-255)");
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_char g = display_prompt_and_echo_u_char("green (0-255)");
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_char b = display_prompt_and_echo_u_char("blue (0-255)");
if(prompt_escaped)
return;
if(space.target_palette_index < LASERBOY_BUILT_IN_PALETTES)
{
int temp = space.target_palette_index;
space.add_palette();
string name = space.target_palette().name;
space.target_palette() = space.palette_picker(temp);
space.target_palette().name = name;
space.target_palette().set_index_color(space.selected_color_index, r, g, b);
}
else
space.target_palette().set_index_color(space.selected_color_index, r, g, b);
space.sync_frames_to_target();
space.TUI_clue = "edit color";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::frame_transforms_menu()
{
bool in_menu = true,
show_vertices_was = space.show_vertices,
show_blanking_was = space.show_blanking,
show_menu_was = space.show_menu,
maintain_real_origin_was = space.maintain_real_origin;
space.show_vertices = true;
space.show_blanking = true;
space.show_menu = true;
prompt_escaped = false;
//------------------------------------------------------------------------
while(in_menu)
{
space.clean_screen();
space.render_space();
if(space.show_menu)
space.overlay_frame_tranz_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
in_menu = false;
space.show_vertices = show_vertices_was;
space.show_blanking = show_blanking_was;
space.maintain_real_origin = maintain_real_origin_was;
space.TUI_clue = "exit frame transforms";
break;
//------------------------------------------------------------
case SDLK_BACKSPACE:
case SDLK_DELETE:
space.delete_current_frame();
space.TUI_clue = "deleted";
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
check_for_digit_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
check_for_digit_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
case 't': // toggle menu mode
space.alt_menu_h = !space.alt_menu_h;
if(space.alt_menu_h)
space.TUI_clue = "alt menu";
else
space.TUI_clue = "transform menu";
break;
//------------------------------------------------------------
case 'T': // toggle
space.maintain_real_origin = !space.maintain_real_origin;
if(space.maintain_real_origin)
space.TUI_clue = "to orgin";
else
space.TUI_clue = "to itself";
break;
//------------------------------------------------------------
case 'a':
if(space.alt_menu_h)
{
space.current_frame().flatten_z();
space.TUI_clue = "flatten Z";
}
else
{
space.current_frame().reduce_blank_vectors();
space.TUI_clue = "reduced blank span";
}
break;
//------------------------------------------------------------
case 'A':
if(space.alt_menu_h)
{
space.TUI_clue = "flattening Z";
space.render_space();
display_space();
space.flatten_z();
space.TUI_clue = "flatten Z all";
}
else
{
space.TUI_clue = "reduce blank vectors";
space.render_space();
display_space();
space.reduce_blank_vectors();
space.TUI_clue = "reduced blank span all";
}
break;
//------------------------------------------------------------
case 'b':
if(space.alt_menu_h)
{
space.current_frame().z_order_vertices(65535);
space.TUI_clue = "z order vertices";
}
else
{
space.current_frame().remove_dwell_vertices();
space.TUI_clue = "removed angle dwell";
}
break;
//------------------------------------------------------------
case 'B':
if(space.alt_menu_h)
{
space.TUI_clue = "Z ordering vertices";
space.render_space();
display_space();
space.z_order_vertices(64000);
space.TUI_clue = "Z order vertices all";
}
else
{
space.TUI_clue = "removing dwell vertices";
space.render_space();
display_space();
space.remove_dwell_vertices();
space.TUI_clue = "removed angle dwell all";
}
break;
//------------------------------------------------------------
case 'c':
if(space.alt_menu_h)
{
space.current_frame().flip(0);
space.TUI_clue = "mirror";
}
else
{
space.current_frame().remove_dots();
space.TUI_clue = "removed dots";
}
break;
//------------------------------------------------------------
case 'C':
if(space.alt_menu_h)
{
space.TUI_clue = "mirroring";
space.render_space();
display_space();
space.flip(0);
space.TUI_clue = "mirror all";
}
else
{
space.TUI_clue = "removing dots";
space.render_space();
display_space();
space.remove_dots();
space.TUI_clue = "removed dots all";
}
break;
//------------------------------------------------------------
case 'd':
if(space.alt_menu_h)
{
space.current_frame().flip(1);
space.TUI_clue = "flip";
}
else
{
space.current_frame().remove_short_vectors();
space.TUI_clue = "removed short vectors";
}
break;
//------------------------------------------------------------
case 'D':
if(space.alt_menu_h)
{
space.TUI_clue = "flipping";
space.render_space();
display_space();
space.flip(1);
space.TUI_clue = "flip all";
}
else
{
space.TUI_clue = "removing short vectors";
space.render_space();
display_space();
space.remove_short_vectors();
space.TUI_clue = "removed short vectors all";
}
break;
//------------------------------------------------------------
case 'e':
if(space.alt_menu_h)
{
space.current_frame().quarter_turn(0, 3);
space.TUI_clue = "quarter turn CCW";
}
else
{
space.current_frame().reduce_lit_vectors();
space.TUI_clue = "reduced vectors";
}
break;
//------------------------------------------------------------
case 'E':
if(space.alt_menu_h)
{
space.TUI_clue = "quarter turning CCW";
space.render_space();
display_space();
space.quarter_turn(0, 3);
space.TUI_clue = "quarter turn CCW all";
}
else
{
space.TUI_clue = "reducing vectors";
space.render_space();
display_space();
space.reduce_lit_vectors();
space.TUI_clue = "reduced vectors all";
}
break;
//------------------------------------------------------------
case 'f':
if(space.alt_menu_h)
{
space.current_frame().flat_to_2D();
space.TUI_clue = "flat 3D to 2D";
}
else
{
space.current_frame().omit_equivalent_vectors();
space.TUI_clue = "removed equal vectors";
}
break;
//------------------------------------------------------------
case 'F':
if(space.alt_menu_h)
{
space.TUI_clue = "flattening 3D to 2D all";
space.render_space();
display_space();
space.flat_to_2D();
space.TUI_clue = "flat 3D to 2D all";
}
else
{
space.TUI_clue = "removing equal vectors";
space.render_space();
display_space();
space.omit_equivalent_vectors();
space.TUI_clue = "removed equal vectors";
}
break;
//------------------------------------------------------------
case 'g':
if(space.alt_menu_h)
{
space.TUI_clue = "normalize to %";
space.render_space();
display_space();
double scale = display_prompt_and_echo_double( "normalize frame to %% of space ? [100%%]"
, 100.0
, 100.0
, 0.0
);
if(prompt_escaped)
break;
space.TUI_clue = "normalizing vector size";
space.current_frame().normalize(scale / 100.0);
if(scale == 0.0)
scale = 100.0;
}
else
{
space.current_frame().conglomerate_lit_segments();
space.TUI_clue = "conglomerate segments";
}
break;
//------------------------------------------------------------
case 'G':
if(space.alt_menu_h)
{
space.TUI_clue = "normalize to %";
space.render_space();
double scale = display_prompt_and_echo_double( "normalize all frames to %% of space ? [100%%]"
, 100.0
, 100.0
, 0.0
);
if(prompt_escaped)
break;
if(scale == 0.0)
scale = 100.0;
if(display_prompt_and_echo_bool("each frame individually? (y) or all frames together? [any]"))
for(size_t i = 0; i < space.number_of_frames(); i++)
space.frame(i).normalize(scale / 100.0);
else
space.normalize(scale / 100.0);
space.TUI_clue = "normalize vectors all";
}
else
{
space.TUI_clue = "conglomerate segments";
space.render_space();
display_space();
space.conglomerate_lit_segments();
space.TUI_clue = "conglomerated segments all";
}
break;
//------------------------------------------------------------
case 'h':
if(space.alt_menu_h)
{
space.TUI_clue = "normalize to size";
space.render_space();
display_space();
{
u_int dimension = display_prompt_and_echo_u_int( "normalize frame to ? [50000]"
, 50000
, 65535
);
if(prompt_escaped)
break;
space.current_frame().normalize_vectors((double)dimension / 65535.0);
space.TUI_clue = "normalize vector size";
}
}
else
{
space.current_frame().bond_segments();
space.TUI_clue = "bonded segments";
}
break;
//------------------------------------------------------------
case 'H':
if(space.alt_menu_h)
{
space.TUI_clue = "normalize to size";
space.render_space();
{
u_int dimension = display_prompt_and_echo_u_int( "normalize frames to ? [50000]"
, 50000
, 65535
);
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("each frame individually? (y) or all frames together? [any]"))
for(size_t i = 0; i < space.number_of_frames(); i++)
space.frame(i).normalize_vectors((double)dimension / 65535.0);
else
space.normalize_vectors((double)dimension / 65535.0);
space.TUI_clue = "normalize vectors all";
}
}
else
{
space.TUI_clue = "bonding segments";
space.render_space();
display_space();
space.bond_segments();
space.TUI_clue = "bonded segments all";
}
break;
//------------------------------------------------------------
case 'i':
if(space.alt_menu_h)
{
if(display_prompt_and_echo_bool("center in all X|Y|Z ?"))
{
space.current_frame().center();
space.clean_screen();
space.render_space();
display_space();
}
else
{
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in X ?"))
{
space.current_frame().center_x();
space.clean_screen();
space.render_space();
display_space();
}
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in Y ?"))
{
space.current_frame().center_y();
space.clean_screen();
space.render_space();
display_space();
}
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in Z ?"))
{
space.current_frame().center_z();
space.clean_screen();
space.render_space();
display_space();
}
}
space.TUI_clue = "center vectors";
} // end if(space.alt_menu_h)
else
{
space.TUI_clue = "minimized vectors";
space.current_frame().minimize(0);
}
break;
//------------------------------------------------------------
case 'I':
if(space.alt_menu_h)
{
size_t i;
if(display_prompt_and_echo_bool("each frame individually (y) or all frames together [any]"))
{
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in all X|Y|Z ?"))
{
for(i = 0; i < space.number_of_frames(); i++)
space.frame(i).center();
space.clean_screen();
space.render_space();
display_space();
}
else
{
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in X ?"))
{
for(i = 0; i < space.number_of_frames(); i++)
space.frame(i).center_x();
space.clean_screen();
space.render_space();
display_space();
}
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in Y ?"))
{
for(i = 0; i < space.number_of_frames(); i++)
space.frame(i).center_y();
space.clean_screen();
space.render_space();
display_space();
}
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in Z ?"))
{
for(i = 0; i < space.number_of_frames(); i++)
space.frame(i).center_z();
space.clean_screen();
space.render_space();
display_space();
}
}
}
else // if not individually
{
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in all X|Y|Z ?"))
{
space.center();
space.clean_screen();
space.render_space();
display_space();
}
else
{
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in X ?"))
{
space.center_x();
space.clean_screen();
space.render_space();
display_space();
}
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in Y ?"))
{
space.center_y();
space.clean_screen();
space.render_space();
display_space();
}
if(prompt_escaped)
break;
if(display_prompt_and_echo_bool("center in Z ?"))
{
space.center_z();
space.clean_screen();
space.render_space();
display_space();
}
}
} // end if(display_prompt_and_echo_bool("each frame individually (y) or all frames together [any]"))
space.TUI_clue = "center all";
} // end if(space.alt_menu_h)
else
{
space.TUI_clue = "minimizing vectors";
space.minimize();
space.clean_screen();
space.render_space();
display_space();
space.TUI_clue = "minimized vectors all";
}
break;
//------------------------------------------------------------
case 'j':
if(space.alt_menu_h)
{
space.current_frame().reverse();
space.TUI_clue = "reverse vectors";
}
else
{
if(space.current_frame().fracture_segments())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "fracture segments fail";
}
else
space.TUI_clue = "fractured segments";
}
break;
//------------------------------------------------------------
case 'J':
if(space.alt_menu_h)
{
space.TUI_clue = "reversing vector order";
space.render_space();
display_space();
space.frame_reverse();
space.TUI_clue = "reverse vector order all";
}
else
{
space.TUI_clue = "fracturing segments";
space.render_space();
display_space();
space.fracture_segments();
space.TUI_clue = "fractured segments all";
}
break;
//------------------------------------------------------------
case 'k':
if(space.alt_menu_h)
{
space.current_frame().unblank_all_vertices();
space.TUI_clue = "unblank all";
}
else
{
space.current_frame().randomize_segments();
space.TUI_clue = "randomize segments";
}
break;
//------------------------------------------------------------
case 'K':
if(space.alt_menu_h)
{
space.TUI_clue = "unblank all";
space.render_space();
display_space();
space.unblank_all_vertices();
space.TUI_clue = "unblank all";
}
else
{
space.TUI_clue = "randomizing segments";
space.render_space();
display_space();
space.randomize_segments();
space.TUI_clue = "randomized segments all";
}
break;
//------------------------------------------------------------
case 'l':
if(space.alt_menu_h)
{
space.current_frame().convert_black_to_color();
space.TUI_clue = "black to color";
}
else
{
LaserBoy_vertex point_of_entry;
LaserBoy_segment entry;
if(p_space->maintain_first_anchor)
point_of_entry = space.current_frame().first_lit_anchor();
entry.push_back(point_of_entry);
entry.push_back(point_of_entry);
entry.back().unblank();
if(space.current_frame().reorder_segments(entry))
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "reorder segments fail";
}
else
space.TUI_clue = "reordered segments";
}
break;
//------------------------------------------------------------
case 'L':
if(space.alt_menu_h)
{
space.TUI_clue = "black to color";
space.render_space();
display_space();
space.convert_black_to_color();
space.TUI_clue = "black to color all";
}
else
{
space.TUI_clue = "reordering segments";
space.render_space();
display_space();
if(space.reorder_segments())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "reorder segments fail";
}
else
space.TUI_clue = "reordered segments all";
}
break;
//------------------------------------------------------------
case 'm':
if(space.alt_menu_h)
{
space.current_frame().convert_black_to_blank();
space.TUI_clue = "black to blank";
}
else
{
if(space.current_frame().add_dwell())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "angle dwell fail";
}
else
space.TUI_clue = "added angle dwell";
}
break;
//------------------------------------------------------------
case 'M':
if(space.alt_menu_h)
{
space.TUI_clue = "black to blank";
space.render_space();
display_space();
space.convert_black_to_blank();
space.TUI_clue = "black to blank all";
}
else
{
space.TUI_clue = "adding angle dwell";
space.render_space();
display_space();
if(space.add_dwell())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "angle dwell fail";
}
else
space.TUI_clue = "added angle dwell all";
}
break;
//------------------------------------------------------------
case 'n':
if(space.alt_menu_h)
{
space.current_frame().convert_blank_to_black();
space.TUI_clue = "blank to black";
}
else
{
if(space.current_frame().add_lit_span_vertices())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "distance span fail";
}
else
space.TUI_clue = "added lit distance span";
}
break;
//------------------------------------------------------------
case 'N':
if(space.alt_menu_h)
{
space.TUI_clue = "black to blank";
space.render_space();
display_space();
space.convert_blank_to_black();
space.TUI_clue = "blank to black all";
}
else
{
space.TUI_clue = "adding lit distance span";
space.render_space();
display_space();
if(space.add_lit_span_vertices())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "distance span fail";
}
else
space.TUI_clue = "added lit distance span all";
}
break;
//------------------------------------------------------------
case 'o':
if(space.alt_menu_h)
{
space.current_frame().impose_black_level();
space.TUI_clue = "apply black level";
}
else
{
if(space.current_frame().add_blank_span_vertices())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "distance span fail";
}
else
space.TUI_clue = "added blank distance span";
}
break;
//------------------------------------------------------------
case 'O':
if(space.alt_menu_h)
{
space.TUI_clue = "applying black level";
space.render_space();
display_space();
space.impose_black_level();
space.TUI_clue = "black leveled all";
}
else
{
space.TUI_clue = "adding blank distance span";
space.render_space();
display_space();
if(space.add_blank_span_vertices())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "distance span fail";
}
else
space.TUI_clue = "added blank distance span all";
}
break;
//------------------------------------------------------------
case 'p':
if(space.alt_menu_h)
{
space.current_frame().to_dots();
space.TUI_clue = "to dots";
}
else
{
if(space.current_frame().enhance_dots())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "enhance dots fail";
}
else
space.TUI_clue = "enhanced dots";
}
break;
//------------------------------------------------------------
case 'P':
if(space.alt_menu_h)
{
space.TUI_clue = "converting to dots";
space.render_space();
display_space();
space.to_dots();
space.TUI_clue = "to dots all";
}
else
{
space.TUI_clue = "enhancing dots";
space.render_space();
display_space();
if(space.enhance_dots())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "enhance dots fail";
}
else
space.TUI_clue = "enhanced dots";
}
break;
//------------------------------------------------------------
case 'q':
if(space.alt_menu_h)
{
space.current_frame().name = display_prompt_and_echo_name("new frame name [8 char or less]", 8);
if(space.current_frame().name.size() == 0)
{
char number[12];
sprintf(number, "%05d", space.frame_index);
space.current_frame().name = string("LB_") + string(number);
}
space.TUI_clue = "rename";
}
else
{
space.current_frame().minimize(0);
if(space.current_frame().optimize(0))
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "optimize fail";
}
else
space.TUI_clue = "optimized";
}
break;
//------------------------------------------------------------
case 'Q':
if(space.alt_menu_h)
{
space.current_frame().name = display_prompt_and_echo_name("new frames prefix [3 char or less]", 3);
if(space.current_frame().name.size() == 0)
space.current_frame().name = "LB_";
space.rename_all_frames(space.current_frame().name);
space.TUI_clue = "rename";
}
else
{
space.TUI_clue = "optimizing";
space.render_space();
display_space();
if(space.optimize())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "optimize fail";
}
else
space.TUI_clue = "optimized all";
}
break;
//------------------------------------------------------------
case 'z': // +100 frames
if(space.number_of_frames() > 100)
{
if( space.loop_animation
|| (space.frame_index <= (space.number_of_frames() - 101))
)
space.frame_index += 100;
while(space.frame_index >= space.number_of_frames())
space.frame_index = space.frame_index - space.number_of_frames();
space.TUI_clue = "+100 frames";
}
break;
//------------------------------------------------------------
case 'Z': // -100 frames
if(space.number_of_frames() > 100)
{
if(space.frame_index >= 100)
space.frame_index -= 100;
else if( space.loop_animation
&& (space.frame_index < 100)
)
{
space.frame_index = space.number_of_frames() + space.frame_index;
space.frame_index -= 100;
}
space.TUI_clue = "-100 frames";
}
break;
//------------------------------------------------------------
case '`':
animate_forward();
break;
//------------------------------------------------------------
case '~':
animate_reverse();
break;
//------------------------------------------------------------
case '/': // show frame_set stats
space.show_frame_set_stats = !space.show_frame_set_stats;
space.TUI_clue = "frame_set stats";
break;
//------------------------------------------------------------
case '?': // show frame stats
space.show_frame_stats = !space.show_frame_stats;
space.TUI_clue = "frame stats";
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
case SDLK_RETURN:
space.show_menu = !space.show_menu;
if(!space.show_menu)
space.TUI_clue = "[Enter] show menu";
else
space.TUI_clue = "[Enter] hide menu";
break;
}
}
}
space.show_menu = show_menu_was;
return;
}
//############################################################################
void LaserBoy_SDL_GUI::frame_set_transforms_menu()
{
bool in_menu = true,
show_menu_was = space.show_menu;
u_int temp_u_int = 0;
space.show_menu = true;
prompt_escaped = false;
//------------------------------------------------------------------------
while(in_menu)
{
space.clean_screen();
space.render_space();
if(space.show_menu)
space.overlay_frame_set_tranz_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit frame_set transforms";
break;
//------------------------------------------------------------
case SDLK_BACKSPACE:
case SDLK_DELETE:
space.delete_current_frame();
space.TUI_clue = "deleted";
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
check_for_digit_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
check_for_digit_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
case 'a':
case 'A':
space.TUI_clue = "inverting frame selections";
space.render_space();
display_space();
space.invert_frame_selections();
space.TUI_clue = "inverted frame selections";
break;
//------------------------------------------------------------
case 'b':
case 'B':
space.TUI_clue = "deleting selected frames";
space.render_space();
display_space();
space.delete_selected_frames();
space.TUI_clue = "deleted selected frames";
break;
//------------------------------------------------------------
case 'c':
case 'C':
space.TUI_clue = "trimming to selected frames";
space.render_space();
display_space();
space.trim_to_selected_frames();
space.TUI_clue = "trimmed to selected frames";
break;
//------------------------------------------------------------
case 'd':
case 'D':
space.TUI_clue = "deleting redundant frames";
space.render_space();
display_space();
space.delete_redundant_frames();
space.TUI_clue = "redundant frames deleted";
break;
//------------------------------------------------------------
case 'e':
case 'E':
space.TUI_clue = "copying current frame";
space.render_space();
display_space();
{
size_t i;
LaserBoy_frame_set frame_set;
u_int copies = display_prompt_and_echo_u_int("total number of current frames [3]", 3, 10000);
for(i = 0; i < space.frame_index; i++)
frame_set += space.frame_picker(i);
for(i = 0; i < copies; i++)
frame_set += space.current_frame();
if(space.frame_index < space.number_of_frames() - 1)
for(i = space.frame_index + 1; i < space.number_of_frames(); i++)
frame_set += space.frame_picker(i);
space = frame_set;
}
space.TUI_clue = "copied frames to begining";
break;
//------------------------------------------------------------
case 'f':
case 'F':
space.TUI_clue = "copying selected frames";
space.render_space();
display_space();
space = space.selected_frames() + space;
space.TUI_clue = "copied frames to begining";
break;
//------------------------------------------------------------
case 'g':
case 'G':
space.TUI_clue = "copying selected frames";
space.render_space();
display_space();
space += space.selected_frames();
space.TUI_clue = "copied frames to end";
break;
//------------------------------------------------------------
case 'h':
case 'H':
space.TUI_clue = "moving selected frames";
space.render_space();
display_space();
{
LaserBoy_frame_set frame_set(space.selected_frames());
space.delete_selected_frames();
frame_set += space;
space = frame_set;
}
space.TUI_clue = "moved frames to begining";
break;
//------------------------------------------------------------
case 'i':
case 'I':
space.TUI_clue = "moving selected frames";
space.render_space();
display_space();
{
LaserBoy_frame_set frame_set(space.selected_frames());
space.delete_selected_frames();
space += frame_set;
}
space.TUI_clue = "moved frames to end";
break;
//------------------------------------------------------------
case 'j':
case 'J':
{
LaserBoy_frame_set frame_set;
frame_set += LaserBoy_frame(space.target_palette_index, true); // not quite an empty frame!
space = frame_set + space;
}
space.TUI_clue = "add frame to begining";
break;
//------------------------------------------------------------
case 'k':
case 'K':
{
u_int i;
LaserBoy_frame_set frame_set;
for(i = 0; i <= space.frame_index; i++)
frame_set += space[i];
frame_set += LaserBoy_frame(space.target_palette_index, true);
for(i = space.frame_index + 1; i < space.number_of_frames(); i++)
frame_set += space[i];
space = frame_set;
}
space.TUI_clue = "add after current frame";
break;
//------------------------------------------------------------
case 'l':
case 'L':
{
LaserBoy_frame frame(space.target_palette_index, true);
LaserBoy_frame_set frame_set(space);
frame_set += frame;
space = frame_set;
}
space.TUI_clue = "add frame to end";
break;
//------------------------------------------------------------
case 'm':
case 'M':
space.TUI_clue = "reversing order of frames";
space.render_space();
display_space();
space.reverse();
space.TUI_clue = "reverse order";
break;
//------------------------------------------------------------
case 'n':
case 'N':
space.TUI_clue = "reversing selected frames";
space.render_space();
display_space();
space.reverse_selected();
space.TUI_clue = "reverse selected";
break;
//------------------------------------------------------------
case 'o':
case 'O':
space.TUI_clue = "new first frame";
space.render_space();
display_space();
space.make_current_first();
space.TUI_clue = "new first frame";
break;
//------------------------------------------------------------
case 'p':
case 'P':
space.TUI_clue = "random order frames";
space.render_space();
display_space();
space.random_order();
space.TUI_clue = "random order";
break;
//------------------------------------------------------------
case 'q':
case 'Q':
space.TUI_clue = "order frames by name";
space.render_space();
display_space();
{ // scope
LaserBoy_Error_Code ret = LASERBOY_OK;
string report;
ret = space.order_frames_by_name(report);
if(ret & LASERBOY_INVALID_UNICODE)
{
space.display_error(report);
wait_4_Esc();
break;
}
else if(ret & LASERBOY_REDUNDANT_UNICODE)
{
space.display_error(report);
wait_4_Esc();
if(!display_prompt_and_echo_bool("delete redundant named frames ? : y | [any]"))
{
space.display_error("frame_set order not changed.");
wait_4_Esc();
break;
}
else
space.order_frames_by_name(report, true);
}
}
space.TUI_clue = "frames ordered by name";
break;
//------------------------------------------------------------
case 'r':
case 'R':
space.TUI_clue = "remove every n-th frames";
space.render_space();
display_space();
temp_u_int = 0;
while(temp_u_int == 0 || temp_u_int == 1)
{
temp_u_int = display_prompt_and_echo_u_int( "n"
, 2
, space.number_of_frames() - 1
);
if(prompt_escaped)
break;
}
if(temp_u_int == 0 || temp_u_int == 1)
break;
space.delete_every_nth_frame(temp_u_int);
space.TUI_clue = "n-th frames removed";
break;
//------------------------------------------------------------
case 's':
case 'S':
space.TUI_clue = "keep only every n-th frames";
space.render_space();
display_space();
temp_u_int = display_prompt_and_echo_u_int( "n"
, 2
, space.number_of_frames() - 1
);
if(prompt_escaped)
break;
space.keep_every_nth_frame(temp_u_int);
space.TUI_clue = "n-th frame keep";
break;
//------------------------------------------------------------
case 'y': // go to frame index
{
u_int temp_u_int;
space.TUI_clue = "go to index";
temp_u_int = display_prompt_and_echo_u_int( "frame index"
, 0
, space.number_of_frames() - 1
);
if(prompt_escaped)
break;
space.frame_index = temp_u_int % space.number_of_frames();
break;
}
//------------------------------------------------------------
case 'Y': // go to frame unicode
{
int frame_index;
string unihex;
space.TUI_clue = "go to unicode";
unihex = display_prompt_and_echo_unicode("frame unicode");
if(prompt_escaped)
break;
frame_index = space.index_of_name(unihex);
if(frame_index >= 0)
space.frame_index = frame_index;
else
{
space.display_error(unihex + " not found.");
wait_4_Esc();
}
break;
}
//------------------------------------------------------------
case 'z': // +100 frames
if(space.number_of_frames() > 100)
{
if( space.loop_animation
|| (space.frame_index <= (space.number_of_frames() - 101))
)
space.frame_index += 100;
while(space.frame_index >= space.number_of_frames())
space.frame_index = space.frame_index - space.number_of_frames();
space.TUI_clue = "+100 frames";
}
break;
//------------------------------------------------------------
case 'Z': // -100 frames
if(space.number_of_frames() > 100)
{
if(space.frame_index >= 100)
space.frame_index -= 100;
else if( space.loop_animation
&& (space.frame_index < 100)
)
{
space.frame_index = space.number_of_frames() + space.frame_index;
space.frame_index -= 100;
}
space.TUI_clue = "-100 frames";
}
break;
//------------------------------------------------------------
case '>': // explode current frame
space.explode_current_frame();
space.TUI_clue = "explode segments";
break;
//------------------------------------------------------------
case '<': // collapse selected frames
if(space.collapse_selected_frames())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "collapse segments fail";
}
else
space.TUI_clue = "collapse segments";
break;
//------------------------------------------------------------
case '=': // explode all frames
space.explode_all_frames();
space.TUI_clue = "explode segments";
break;
//------------------------------------------------------------
case '`':
animate_forward();
break;
//------------------------------------------------------------
case '~':
animate_reverse();
break;
//------------------------------------------------------------
case '/': // show frame_set stats
space.show_frame_set_stats = !space.show_frame_set_stats;
space.TUI_clue = "frame_set stats";
break;
//------------------------------------------------------------
case '?': // show frame stats
space.show_frame_stats = !space.show_frame_stats;
space.TUI_clue = "frame stats";
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
case SDLK_RETURN:
space.show_menu = !space.show_menu;
if(!space.show_menu)
space.TUI_clue = "[Enter] show menu";
else
space.TUI_clue = "[Enter] hide menu";
break;
}
}
}
space.show_menu = show_menu_was;
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_color_blank_menu()
{
bool in_menu = true,
show_vertices_was = space.show_vertices,
show_blanking_was = space.show_blanking,
show_intro_was = space.show_intro,
show_bridge_was = space.show_bridge,
show_coda_was = space.show_coda,
show_palette_was = space.show_palette,
show_target_palette_was = space.show_target_palette,
show_menu_was = space.show_menu;
int temp_int;
double temp_double;
LaserBoy_3D_double temp_3D_double;
//------------------------------------------------------------------------
space.show_menu = true;
space.show_vertices = true;
space.show_blanking = true;
space.show_intro = false;
space.show_bridge = false;
space.show_coda = false;
space.show_palette = true;
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
space.show_target_palette = true;
space.show_cursors = true;
space.show_color_cursor = true;
//------------------------------------------------------------------------
while(in_menu)
{
space.clean_screen();
space.render_space();
if(space.show_menu)
space.overlay_draw_color_blank_menu();
display_space();
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
//------------------------------------------------------------
case SDLK_ESCAPE:
in_menu = false;
space.show_cursors = false;
space.show_color_cursor = false;
space.show_vertices = show_vertices_was;
space.show_blanking = show_blanking_was;
space.show_intro = show_intro_was;
space.show_bridge = show_bridge_was;
space.show_coda = show_coda_was;
space.show_palette = show_palette_was;
space.show_target_palette = show_target_palette_was;
space.TUI_clue = "exit draw color blank";
break;
//------------------------------------------------------------
case 't': // toggle menu mode
case 'T':
space.alt_menu_k = !space.alt_menu_k;
if(space.alt_menu_k)
space.TUI_clue = "alt menu";
else
space.TUI_clue = "draw menu";
break;
//------------------------------------------------------------
case SDLK_BACKSPACE:
case SDLK_DELETE:
space.current_frame().remove_at_spider();
space.TUI_clue = "delete vertex";
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
check_for_digit_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
check_for_digit_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
case '[':
if( (space.current_frame().egg < space.current_frame().spider)
&& (space.current_frame().egg < space.current_frame().size() - 1)
)
{
space.current_frame().increment_egg();
space.TUI_clue = "+ start vertex select";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select start must be behind or equal to select end");
wait_4_any_key();
}
break;
//------------------------------------------------------------
case '{':
if(space.current_frame().egg > 0)
{
space.current_frame().deccrement_egg();
space.TUI_clue = "- start vertex select";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select start must be at zero or ahead");
wait_4_any_key();
}
break;
//------------------------------------------------------------
case ']':
if(space.current_frame().spider < space.current_frame().size() - 1)
{
space.current_frame().increment_spider();
space.TUI_clue = "+ end vertex select";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select end must be behind or equal to last vertex");
wait_4_any_key();
}
break;
//------------------------------------------------------------
case '}':
if( (space.current_frame().spider > space.current_frame().egg)
&& (space.current_frame().spider > 0)
)
{
space.current_frame().deccrement_spider();
space.TUI_clue = "- end vertex select";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select end must be ahead or equal to select start");
wait_4_any_key();
}
break;
//------------------------------------------------------------
case'\\':
space.current_frame().spider = (space.current_frame().size() - 1);
space.TUI_clue = "last vertex select";
break;
//------------------------------------------------------------
case '|':
space.current_frame().egg = 0;
space.TUI_clue = "first vertex select";
break;
//------------------------------------------------------------
case 'u':
space.current_frame().next_segment_select();
space.TUI_clue = "+ lit segment";
break;
//------------------------------------------------------------
case 'U':
space.current_frame().previous_segment_select();
space.TUI_clue = "- lit segment";
break;
//------------------------------------------------------------
case 'i':
{
size_t segment_index, start, end;
space.current_frame().find_segment_of_vertex(space.current_frame().egg, start, end, segment_index);
space.current_frame().find_segment_at_index(segment_index + 1, start, end);
if( start <= space.current_frame().spider
&& start < (space.current_frame().size() - 1)
)
{
space.current_frame().next_segment_egg();
space.TUI_clue = "+ start lit segment";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select start must be behind or equal to select end");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case 'I':
{
size_t segment_index, start, end;
space.current_frame().find_segment_of_vertex(space.current_frame().egg, start, end, segment_index);
if(segment_index > 0)
{
space.current_frame().previous_segment_egg();
space.TUI_clue = "- start lit segment";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select start must be at zero or ahead");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case 'o':
{
size_t segment_index, start, end;
space.current_frame().find_segment_of_vertex(space.current_frame().spider, start, end, segment_index);
if(segment_index < space.current_frame().number_of_segments() - 1)
{
space.current_frame().next_segment_spider();
space.TUI_clue = "+ end lit segment";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select end must be at or behind last vertex");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case 'O':
{
size_t segment_index, start, end;
space.current_frame().find_segment_of_vertex(space.current_frame().spider, start, end, segment_index);
if( start > space.current_frame().egg
&& segment_index > 0
)
{
space.current_frame().previous_segment_spider();
space.TUI_clue = "- end lit segment";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select end must be at or ahead of select start and first vertex");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case 'K':
space.current_frame().spider = space.current_frame().egg;
space.TUI_clue = "spider to egg";
break;
//------------------------------------------------------------
case 'L':
space.current_frame().egg = space.current_frame().spider;
space.TUI_clue = "egg to spider";
break;
//------------------------------------------------------------
case 'p':
space.selected_color_index++;
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
if(space.selected_color_index >= space.target_palette().size())
space.selected_color_index = 0;
}
else
{
if(space.selected_color_index >= space.current_palette().size())
space.selected_color_index = 0;
}
space.TUI_clue = "+ color index";
break;
//------------------------------------------------------------
case 'P':
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
if(space.selected_color_index == 0)
space.selected_color_index = space.target_palette().size();
}
else
{
if(space.selected_color_index == 0)
space.selected_color_index = space.current_palette().size();
}
space.selected_color_index--;
space.TUI_clue = "- color index";
break;
//------------------------------------------------------------
case 'b':
space.current_frame().blank_vertices();
space.TUI_clue = "blank selected vectors";
break;
//------------------------------------------------------------
case 'B':
space.current_frame().unblank_vertices();
space.TUI_clue = "unblank selected vectors";
break;
//------------------------------------------------------------
case 'c':
space.current_frame().color_select();
space.TUI_clue = "color selected vectors";
break;
//------------------------------------------------------------
case 'C':
if(space.current_frame().palette_index != LASERBOY_TRUE_COLOR)
{
space.selected_color_index = space.current_frame().at(space.current_frame().spider).c;
space.TUI_clue = "get color";
}
else
space.TUI_clue = "no palette";
break;
//------------------------------------------------------------
case '\'':
{
int index = display_prompt_and_echo_int("place egg at index");
if(prompt_escaped)
break;
if(index <= (int)space.current_frame().spider && index >= 0)
{
space.current_frame().egg = index;
space.current_frame().normalize_cursors();
}
else
{
space.display_message("vertex select start must be between the first vertex and select end");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case '"':
{
int index = display_prompt_and_echo_int("place spider at index");
if(prompt_escaped)
break;
if(index >= (int)space.current_frame().egg)
{
if(index < (int)space.current_frame().size())
{
space.current_frame().spider = index;
space.current_frame().normalize_cursors();
}
else
{
space.current_frame().spider = space.current_frame().size() - 1;
space.current_frame().normalize_cursors();
space.display_message("vertex select end must be at or behind last vertex");
wait_4_any_key();
}
}
else
{
space.display_message("vertex select end must be between select start and last vertex");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case 'j':
space.current_frame().set_spider_to_egg();
space.TUI_clue = "spider to egg";
break;
//------------------------------------------------------------
case 'J':
space.current_frame().set_egg_to_spider();
space.TUI_clue = "egg to spider";
break;
//------------------------------------------------------------
case '/': // show frame_set stats
space.show_frame_set_stats = !space.show_frame_set_stats;
space.TUI_clue = "frame_set stats";
break;
//------------------------------------------------------------
case '?': // show frame stats
space.show_frame_stats = !space.show_frame_stats;
space.TUI_clue = "frame stats";
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
case '`':
space.copy_frame();
space.TUI_clue = "copy frame";
break;
//------------------------------------------------------------
case SDLK_RETURN:
space.show_menu = !space.show_menu;
if(!space.show_menu)
space.TUI_clue = "[Enter] show menu";
else
space.TUI_clue = "[Enter] hide menu";
break;
//------------------------------------------------------------
case 'Q':
if(space.bmp_file_index != -1)
{
int prev = (space.bmp_file_index == 0)
? (space.bmp_file_list.size() - 1)
: (space.bmp_file_index - 1);
space.TUI_clue = "loading " + space.bmp_file_list[prev].path().filename().string();
display_space();
if(!space.load_background_bitmap(space.bmp_file_list[prev].path().string(),
false
)
)
{
space.display_error(space.bmp_file_list[prev].path().string() + " failed to open");
wait_4_Esc();
break;
}
space.bmp_file_index = prev;
}
else
{
space.TUI_clue = "no bmp dir loaded";
display_space();
}
break;
//------------------------------------------------------------
case 'W':
if(space.bmp_file_index != -1)
{
int next = (space.bmp_file_index == (int)space.bmp_file_list.size() - 1)
? (0)
: (space.bmp_file_index + 1);
space.TUI_clue = "loading " + space.bmp_file_list[next].path().filename().string();
display_space();
if(!space.load_background_bitmap(space.bmp_file_list[next].path().string(),
false
)
)
{
space.display_error(space.bmp_file_list[next].path().string() + " failed to open");
wait_4_Esc();
break;
}
space.bmp_file_index = next;
}
else
{
space.TUI_clue = "no bmp dir loaded";
display_space();
}
break;
//------------------------------------------------------------
case 'x':
if(space.current_frame().size() > 1)
{
temp_double = space.current_frame().at(space.current_frame().spider).x + space.displacement_step;
if(temp_double <= LASERBOY_MAX_SHORT)
space.current_frame().at(space.current_frame().spider).x = (u_short)temp_double;
space.TUI_clue = "+ X";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'X':
if(space.current_frame().size() > 1)
{
temp_double = space.current_frame().at(space.current_frame().spider).x - space.displacement_step;
if(temp_double >= LASERBOY_MIN_SHORT)
space.current_frame().at(space.current_frame().spider).x = (u_short)temp_double;
space.TUI_clue = "- X";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'y':
if(space.current_frame().size() > 1)
{
temp_double = space.current_frame().at(space.current_frame().spider).y + space.displacement_step;
if(temp_double <= LASERBOY_MAX_SHORT)
space.current_frame().at(space.current_frame().spider).y = (u_short)temp_double;
space.TUI_clue = "+ Y";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'Y':
if(space.current_frame().size() > 1)
{
temp_double = space.current_frame().at(space.current_frame().spider).y - space.displacement_step;
if(temp_double >= LASERBOY_MIN_SHORT)
space.current_frame().at(space.current_frame().spider).y = (u_short)temp_double;
space.TUI_clue = "- Y";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'z':
if(space.current_frame().size() > 1)
{
temp_double = space.current_frame().at(space.current_frame().spider).z + space.displacement_step;
if(temp_double <= LASERBOY_MAX_SHORT)
space.current_frame().at(space.current_frame().spider).z = (u_short)temp_double;
space.TUI_clue = "+ Z";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'Z':
if(space.current_frame().size() > 1)
{
temp_double = space.current_frame().at(space.current_frame().spider).z - space.displacement_step;
if(temp_double >= LASERBOY_MIN_SHORT)
space.current_frame().at(space.current_frame().spider).z = (u_short)temp_double;
space.TUI_clue = "- Z";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case '.':
if(space.current_frame().add_vertex(space.current_frame().spider))
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "add vertex fail";
}
else
{
if(space.current_frame().spider < (space.current_frame().size() - 1))
space.TUI_clue = "split vector";
else
space.TUI_clue = "add vector";
}
break;
//------------------------------------------------------------
case '>':
if(space.current_frame().break_segment())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "break segment fail";
}
else
space.TUI_clue = "break segment";
break;
//------------------------------------------------------------
case ',':
space.current_frame().reorder_from_egg();
space.TUI_clue = "reorder from egg";
break;
//------------------------------------------------------------
case '<':
space.current_frame().reorder_from_spider();
space.TUI_clue = "reorder from spider";
break;
//------------------------------------------------------------
case 'q':
if(space.current_frame().size() > 1)
{
temp_int = display_prompt_and_echo_short("set X");
if(prompt_escaped)
break;
space.current_frame().at(space.current_frame().spider).x = temp_int;
space.TUI_clue = "X set";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'w':
if(space.current_frame().size() > 1)
{
temp_int = display_prompt_and_echo_short("set Y");
if(prompt_escaped)
break;
space.current_frame().at(space.current_frame().spider).y = temp_int;
space.TUI_clue = "Y set";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'e':
if(space.alt_menu_k)
{
space.current_frame().black_vertices();
space.TUI_clue = "bond black selected vectors";
}
else
{
if(space.current_frame().size() > 1)
{
temp_int = display_prompt_and_echo_short("set Z");
if(prompt_escaped)
break;
space.current_frame().at(space.current_frame().spider).z = temp_int;
space.TUI_clue = "Z set";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
}
break;
//------------------------------------------------------------
case 'E':
if(space.alt_menu_k)
{
space.current_frame().unblack_vertices();
space.TUI_clue = "unbond unblack selected vectors";
}
else
{
if(space.current_frame().size() > 1)
{
temp_int = display_prompt_and_echo_short("set Z");
if(prompt_escaped)
break;
space.current_frame().at(space.current_frame().spider).z = temp_int;
space.TUI_clue = "Z set";
}
else
{
space.display_error("ERROR NO VERTICES!");
wait_4_Esc();
}
}
break;
//------------------------------------------------------------
case 'l':
if(space.current_frame().connect_the_dots())
{
space.display_error("vertex count overflow");
wait_4_Esc();
space.TUI_clue = "line egg to spider fail";
}
else
space.TUI_clue = "line egg to spider";
break;
//------------------------------------------------------------
case 'd':
if(space.alt_menu_k)
{
space.current_frame().selected_to_dots();
space.TUI_clue = "to dots";
}
else
{
if(space.current_frame().spider) // is not the origin
{
temp_3D_double
= rotate_vertex_on_coordinates_x(space.current_frame().at(space.current_frame().spider),
space.current_frame().at(space.current_frame().spider - 1),
space.rotation_step
);
if(!LaserBoy_bounds_check(temp_3D_double, LASERBOY_CUBE))
space.current_frame().at(space.current_frame().spider) = temp_3D_double;
space.TUI_clue = "+ rotate on X axis";
}
else
space.TUI_clue = "not at zero vertex";
}
break;
//------------------------------------------------------------
case 'D':
if(space.alt_menu_k)
{
space.current_frame().selected_to_dots();
space.TUI_clue = "to dots";
}
else
{
if(space.current_frame().spider) // is not the origin
{
temp_3D_double
= rotate_vertex_on_coordinates_x(space.current_frame().at(space.current_frame().spider),
space.current_frame().at(space.current_frame().spider - 1),
-space.rotation_step
);
if(!LaserBoy_bounds_check(temp_3D_double, LASERBOY_CUBE))
space.current_frame().at(space.current_frame().spider) = temp_3D_double;
space.TUI_clue = "- rotate on X axis";
}
else
space.TUI_clue = "not at zero vertex";
}
break;
//------------------------------------------------------------
case 'f':
if(space.alt_menu_k)
{
space.current_frame().color_index_select();
space.TUI_clue = "color index selected vectors";
}
else
{
if(space.current_frame().spider) // is not the origin
{
temp_3D_double
= rotate_vertex_on_coordinates_y(space.current_frame().at(space.current_frame().spider),
space.current_frame().at(space.current_frame().spider - 1),
space.rotation_step
);
if(!LaserBoy_bounds_check(temp_3D_double, LASERBOY_CUBE))
space.current_frame().at(space.current_frame().spider) = temp_3D_double;
space.TUI_clue = "+ rotate on Z axis";
}
else
space.TUI_clue = "not at zero vertex";
}
break;
//------------------------------------------------------------
case 'F':
if(space.alt_menu_k)
{
space.current_frame().color_span_select();
space.TUI_clue = "color span selected vectors";
}
else
{
if(space.current_frame().spider) // is not the origin
{
temp_3D_double
= rotate_vertex_on_coordinates_y(space.current_frame().at(space.current_frame().spider),
space.current_frame().at(space.current_frame().spider - 1),
-space.rotation_step
);
if(!LaserBoy_bounds_check(temp_3D_double, LASERBOY_CUBE))
space.current_frame().at(space.current_frame().spider) = temp_3D_double;
space.TUI_clue = "- rotate on Z axis";
}
else
space.TUI_clue = "not at zero vertex";
}
break;
//------------------------------------------------------------
case 'g':
if(space.alt_menu_k)
{
space.current_frame().color_black_in_select();
space.TUI_clue = "color black selected vectors";
}
else
{
if(space.current_frame().spider) // is not the origin
{
temp_3D_double
= rotate_vertex_on_coordinates_z(space.current_frame().at(space.current_frame().spider),
space.current_frame().at(space.current_frame().spider - 1),
space.rotation_step
);
if(!LaserBoy_bounds_check(temp_3D_double, LASERBOY_CUBE))
space.current_frame().at(space.current_frame().spider) = temp_3D_double;
space.TUI_clue = "+ rotate on Y axis";
}
else
space.TUI_clue = "not at zero vertex";
}
break;
//------------------------------------------------------------
case 'G':
if(space.alt_menu_k)
{
space.current_frame().color_black_in_select();
space.TUI_clue = "color black selected vectors";
}
else
{
if(space.current_frame().spider) // is not the origin
{
temp_3D_double
= rotate_vertex_on_coordinates_z(space.current_frame().at(space.current_frame().spider),
space.current_frame().at(space.current_frame().spider - 1),
-space.rotation_step
);
if(!LaserBoy_bounds_check(temp_3D_double, LASERBOY_CUBE))
space.current_frame().at(space.current_frame().spider) = temp_3D_double;
space.TUI_clue = "- rotate on Y axis";
}
else
space.TUI_clue = "not at zero vertex";
}
break;
//------------------------------------------------------------
case 'm':
if(space.alt_menu_k)
{
space.current_frame().color_index_black();
space.TUI_clue = "color index black";
}
else
{
if(space.current_frame().spider) // is not the origin
{
temp_3D_double
= scale_vertex_on_coordinates(space.current_frame().at(space.current_frame().spider),
space.current_frame().at(space.current_frame().spider - 1),
LaserBoy_3D_double(space.magnitude_step_up, space.magnitude_step_up, space.magnitude_step_up)
);
if(!LaserBoy_bounds_check(temp_3D_double, LASERBOY_CUBE))
space.current_frame().at(space.current_frame().spider) = temp_3D_double;
space.TUI_clue = "+ magnitude of vector";
}
else
space.TUI_clue = "not at zero vertex";
}
break;
//------------------------------------------------------------
case 'M':
if(space.alt_menu_k)
{
space.current_frame().color_span_black();
space.TUI_clue = "color span black";
}
else
{
if(space.current_frame().spider) // is not the origin
{
temp_3D_double
= scale_vertex_on_coordinates(space.current_frame().at(space.current_frame().spider),
space.current_frame().at(space.current_frame().spider - 1),
LaserBoy_3D_double(space.magnitude_step_dn, space.magnitude_step_dn, space.magnitude_step_dn)
);
if(!LaserBoy_bounds_check(temp_3D_double, LASERBOY_CUBE))
space.current_frame().at(space.current_frame().spider) = temp_3D_double;
space.TUI_clue = "- magnitude of vector";
}
else
space.TUI_clue = "not at zero vertex";
}
break;
//------------------------------------------------------------
case 'n':
if(space.alt_menu_k)
{
space.current_frame().color_cycle_select(1);
space.TUI_clue = "+ color cycle";
}
break;
//------------------------------------------------------------
case 'N':
if(space.alt_menu_k)
{
space.current_frame().color_cycle_select(-1);
space.TUI_clue = "- color cycle";
}
break;
} // end switch(event.key.keysym.unicode)
} // end else if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
space.show_menu = show_menu_was;
return;
}
//############################################################################
void LaserBoy_SDL_GUI::move_scale_rotate_menu()
{
bool in_menu = true,
show_vertices_was = space.show_vertices,
show_blanking_was = space.show_blanking,
show_intro_was = space.show_intro,
show_bridge_was = space.show_bridge,
show_coda_was = space.show_coda,
show_menu_was = space.show_menu;
char formatted_string[80] = {0};
double temp_double;
//------------------------------------------------------------------------
space.show_menu = true;
space.show_vertices = true;
space.show_blanking = true;
space.show_intro = false;
space.show_bridge = false;
space.show_coda = false;
space.show_cursors = true;
space.show_fulcrum = space.alt_menu_l;
prompt_escaped = false;
//------------------------------------------------------------------------
while(in_menu)
{
space.clean_screen();
space.render_space();
if(space.show_menu)
space.overlay_move_scale_rotate_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
in_menu = false;
space.show_vertices = show_vertices_was;
space.show_blanking = show_blanking_was;
space.show_intro = show_intro_was;
space.show_bridge = show_bridge_was;
space.show_coda = show_coda_was;
space.show_cursors = false;
space.show_fulcrum = false;
space.TUI_clue = "exit move scale rotate";
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
check_for_digit_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
check_for_digit_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
case 't': // toggle fulcrum mode
case 'T':
space.alt_menu_l = !space.alt_menu_l;
space.show_fulcrum = space.alt_menu_l;
if(space.alt_menu_l)
space.TUI_clue = "on fulcrum";
else
space.TUI_clue = "on itself";
break;
//------------------------------------------------------------
case '[':
if( (space.current_frame().egg < space.current_frame().spider)
&& (space.current_frame().egg < space.current_frame().size() - 1)
)
{
space.current_frame().increment_egg();
space.TUI_clue = "+ start vertex select";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select start must be behind or equal to select end");
wait_4_any_key();
}
break;
//------------------------------------------------------------
case '{':
if(space.current_frame().egg > 0)
{
space.current_frame().deccrement_egg();
space.TUI_clue = "- start vertex select";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select start must be at zero or ahead");
wait_4_any_key();
}
break;
//------------------------------------------------------------
case ']':
if(space.current_frame().spider < space.current_frame().size() - 1)
{
space.current_frame().increment_spider();
space.TUI_clue = "+ end vertex select";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select end must be behind or equal to last vertex");
wait_4_any_key();
}
break;
//------------------------------------------------------------
case '}':
if( (space.current_frame().spider > space.current_frame().egg)
&& (space.current_frame().spider > 0)
)
{
space.current_frame().deccrement_spider();
space.TUI_clue = "- end vertex select";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select end must be ahead or equal to select start");
wait_4_any_key();
}
break;
//------------------------------------------------------------
case'\\':
space.current_frame().spider = (space.current_frame().size() - 1);
space.TUI_clue = "last vertex select";
break;
//------------------------------------------------------------
case '|':
space.current_frame().egg = 0;
space.TUI_clue = "first vertex select";
break;
//------------------------------------------------------------
case 'u':
space.current_frame().next_segment_select();
space.TUI_clue = "+ lit segment";
break;
//------------------------------------------------------------
case 'U':
space.current_frame().previous_segment_select();
space.TUI_clue = "- lit segment";
break;
//------------------------------------------------------------
case 'i':
{
size_t segment_index, start, end;
space.current_frame().find_segment_of_vertex(space.current_frame().egg, start, end, segment_index);
space.current_frame().find_segment_at_index(segment_index + 1, start, end);
if( (start <= space.current_frame().spider)
&& (start < space.current_frame().size() - 1)
)
{
space.current_frame().next_segment_egg();
space.TUI_clue = "+ start lit segment";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select start must be behind or equal to select end");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case 'I':
{
size_t segment_index, start, end;
space.current_frame().find_segment_of_vertex(space.current_frame().egg, start, end, segment_index);
if(segment_index > 0)
{
space.current_frame().previous_segment_egg();
space.TUI_clue = "- start lit segment";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select start must be at zero or ahead");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case 'o':
{
size_t segment_index, start, end;
space.current_frame().find_segment_of_vertex(space.current_frame().spider, start, end, segment_index);
if(segment_index < space.current_frame().number_of_segments() - 1)
{
space.current_frame().next_segment_spider();
space.TUI_clue = "+ end lit segment";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select end must be at or behind last vertex");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case 'O':
{
size_t segment_index, start, end;
space.current_frame().find_segment_of_vertex(space.current_frame().spider, start, end, segment_index);
if( start > space.current_frame().egg
&& segment_index > 0
)
{
space.current_frame().previous_segment_spider();
space.TUI_clue = "- end lit segment";
}
else if(space.show_cursor_limits_msg)
{
space.display_message("vertex select end must be at or ahead of select start and first vertex");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case 'K':
space.current_frame().spider = space.current_frame().egg;
space.TUI_clue = "spider to egg";
break;
//------------------------------------------------------------
case 'L':
space.current_frame().egg = space.current_frame().spider;
space.TUI_clue = "egg to spider";
break;
//------------------------------------------------------------
case '/': // show frame_set stats
space.show_frame_set_stats = !space.show_frame_set_stats;
break;
//------------------------------------------------------------
case '?': // show frame stats
space.show_frame_stats = !space.show_frame_stats;
break;
//------------------------------------------------------------
case '<':
space.current_frame().reverse_selected();
space.TUI_clue = "reversed selection";
break;
//------------------------------------------------------------
case 'c':
switch(space.current_frame().append_selected_segment())
{
default:
case LASERBOY_NOTHING_SELECTED:
space.display_error("nothing selected");
wait_4_Esc();
space.TUI_clue = "copy segment fail";
break;
break;
case LASERBOY_OK:
sprintf(formatted_string, "copied %d vertices to end of frame", (int)space.current_frame().selected_segment().size());
space.TUI_clue = formatted_string;
break;
}
break;
//------------------------------------------------------------
case 'q':
temp_double = display_prompt_and_echo_double("set center X");
if(prompt_escaped)
break;
if(!space.current_frame().move_selection(LaserBoy_3D_double(temp_double - space.current_frame().selected_segment().rectangular_center_of().x,
0,
0
)
)
)
space.TUI_clue = "set center X";
else
{
space.display_error("X out of bounds!");
wait_4_Esc();
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'Q':
if(space.bmp_file_index != -1)
{
int prev = (space.bmp_file_index == 0)
? (space.bmp_file_list.size() - 1)
: (space.bmp_file_index - 1);
space.TUI_clue = "loading " + space.bmp_file_list[prev].path().filename().string();
display_space();
if(!space.load_background_bitmap(space.bmp_file_list[prev].path().string(),
false
)
)
{
space.display_error(space.bmp_file_list[prev].path().string() + " failed to open");
wait_4_Esc();
break;
}
space.bmp_file_index = prev;
}
else
{
space.TUI_clue = "no bmp dir loaded";
display_space();
}
break;
//------------------------------------------------------------
case 'w':
temp_double = display_prompt_and_echo_double("set center Y");
if(prompt_escaped)
break;
if(!space.current_frame().move_selection(LaserBoy_3D_double(0,
temp_double - space.current_frame().selected_segment().rectangular_center_of().y,
0
)
)
)
space.TUI_clue = "set center Y";
else
{
space.display_error("Y out of bounds!");
wait_4_Esc();
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'W':
if(space.bmp_file_index != -1)
{
int next = (space.bmp_file_index == (int)space.bmp_file_list.size() - 1)
? (0)
: (space.bmp_file_index + 1);
space.TUI_clue = "loading " + space.bmp_file_list[next].path().filename().string();
display_space();
if(!space.load_background_bitmap(space.bmp_file_list[next].path().string(),
false
)
)
{
space.display_error(space.bmp_file_list[next].path().string() + " failed to open");
wait_4_Esc();
break;
}
space.bmp_file_index = next;
}
else
{
space.TUI_clue = "no bmp dir loaded";
display_space();
}
break;
//------------------------------------------------------------
case 'e':
temp_double = display_prompt_and_echo_double("set center Z");
if(prompt_escaped)
break;
if(!space.current_frame().move_selection(LaserBoy_3D_double(0,
0,
temp_double - space.current_frame().selected_segment().rectangular_center_of().z
)
)
)
space.TUI_clue = "set center Z";
else
{
space.display_error("Z out of bounds!");
wait_4_Esc();
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'x':
if(!space.current_frame().move_selection(LaserBoy_3D_double(space.displacement_step, 0, 0)))
space.TUI_clue = "+ X move";
else
space.TUI_clue = "out of bounds!";
break;
//------------------------------------------------------------
case 'X':
if(!space.current_frame().move_selection(LaserBoy_3D_double(-space.displacement_step, 0, 0)))
space.TUI_clue = "- X move";
else
space.TUI_clue = "out of bounds!";
break;
//------------------------------------------------------------
case 'y':
if(!space.current_frame().move_selection(LaserBoy_3D_double(0, space.displacement_step, 0)))
space.TUI_clue = "+ Y move";
else
space.TUI_clue = "out of bounds!";
break;
//------------------------------------------------------------
case 'Y':
if(!space.current_frame().move_selection(LaserBoy_3D_double(0, -space.displacement_step, 0)))
space.TUI_clue = "- Y move";
else
space.TUI_clue = "out of bounds!";
break;
//------------------------------------------------------------
case 'z':
if(!space.current_frame().move_selection(LaserBoy_3D_double(0, 0, space.displacement_step)))
space.TUI_clue = "+ Z move";
else
space.TUI_clue = "out of bounds!";
break;
//------------------------------------------------------------
case 'Z':
if(!space.current_frame().move_selection(LaserBoy_3D_double(0, 0,-space.displacement_step)))
space.TUI_clue = "- Z move";
else
space.TUI_clue = "out of bounds!";
break;
//------------------------------------------------------------
case 'd':
if(space.alt_menu_l)
{
if(!space.current_frame().rotate_selection_on_fulcrum(LaserBoy_3D_double(space.rotation_step, 0, 0)))
space.TUI_clue = "+ rotate on fulcrum X";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().rotate_selection(LaserBoy_3D_double(space.rotation_step, 0, 0)))
space.TUI_clue = "+ rotate X";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'D':
if(space.alt_menu_l)
{
if(!space.current_frame().rotate_selection_on_fulcrum(LaserBoy_3D_double(-space.rotation_step, 0, 0)))
space.TUI_clue = "- rotate on fulcrum X";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().rotate_selection(LaserBoy_3D_double(-space.rotation_step, 0, 0)))
space.TUI_clue = "- rotate X";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'f':
if(space.alt_menu_l)
{
if(!space.current_frame().rotate_selection_on_fulcrum(LaserBoy_3D_double(0, space.rotation_step, 0)))
space.TUI_clue = "+ rotate on fulcrum Y";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().rotate_selection(LaserBoy_3D_double(0, space.rotation_step, 0)))
space.TUI_clue = "+ rotate Y";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'F':
if(space.alt_menu_l)
{
if(!space.current_frame().rotate_selection_on_fulcrum(LaserBoy_3D_double(0, -space.rotation_step, 0)))
space.TUI_clue = "- rotate on fulcrum Y";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().rotate_selection(LaserBoy_3D_double(0,-space.rotation_step, 0)))
space.TUI_clue = "- rotate Y";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'g':
if(space.alt_menu_l)
{
if(!space.current_frame().rotate_selection_on_fulcrum(LaserBoy_3D_double(0, 0, space.rotation_step)))
space.TUI_clue = "+ rotate on fulcrum Z";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().rotate_selection(LaserBoy_3D_double(0, 0, space.rotation_step)))
space.TUI_clue = "+ rotate Z";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'G':
if(space.alt_menu_l)
{
if(!space.current_frame().rotate_selection_on_fulcrum(LaserBoy_3D_double(0, 0, -space.rotation_step)))
space.TUI_clue = "- rotate on fulcrum Z";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().rotate_selection(LaserBoy_3D_double(0, 0, -space.rotation_step)))
space.TUI_clue = "- rotate Z";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'm':
if(space.alt_menu_l)
{
if(!space.current_frame().scale_selection_on_fulcrum(LaserBoy_3D_double(space.magnitude_step_up, space.magnitude_step_up, space.magnitude_step_up)))
space.TUI_clue = "+ scale XYZ by fulcrum";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().scale_selection(LaserBoy_3D_double(space.magnitude_step_up, space.magnitude_step_up, space.magnitude_step_up)))
space.TUI_clue = "+ scale XYZ";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'M':
if(space.alt_menu_l)
{
if(!space.current_frame().scale_selection_on_fulcrum(LaserBoy_3D_double(space.magnitude_step_dn, space.magnitude_step_dn, space.magnitude_step_dn)))
space.TUI_clue = "- scale XYZ by fulcrum";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().scale_selection(LaserBoy_3D_double(space.magnitude_step_dn, space.magnitude_step_dn, space.magnitude_step_dn)))
space.TUI_clue = "- scale XYZ";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'v':
if(space.alt_menu_l)
{
if(!space.current_frame().scale_selection_on_fulcrum(LaserBoy_3D_double(space.magnitude_step_up, 1, 1)))
space.TUI_clue = "+ scale X by fulcrum";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().scale_selection(LaserBoy_3D_double(space.magnitude_step_up, 1, 1)))
space.TUI_clue = "+ scale X";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'V':
if(space.alt_menu_l)
{
if(!space.current_frame().scale_selection_on_fulcrum(LaserBoy_3D_double(space.magnitude_step_dn, 1, 1)))
space.TUI_clue = "- scale X by fulcrum";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().scale_selection(LaserBoy_3D_double(space.magnitude_step_dn, 1, 1)))
space.TUI_clue = "- scale X";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'b':
if(space.alt_menu_l)
{
if(!space.current_frame().scale_selection_on_fulcrum(LaserBoy_3D_double(1, space.magnitude_step_up, 1)))
space.TUI_clue = "+ scale Y by fulcrum";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().scale_selection(LaserBoy_3D_double(1, space.magnitude_step_up, 1)))
space.TUI_clue = "+ scale Y";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'B':
if(space.alt_menu_l)
{
if(!space.current_frame().scale_selection_on_fulcrum(LaserBoy_3D_double(1, space.magnitude_step_dn, 1)))
space.TUI_clue = "- scale Y by fulcrum";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().scale_selection(LaserBoy_3D_double(1, space.magnitude_step_dn, 1)))
space.TUI_clue = "- scale Y";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'n':
if(space.alt_menu_l)
{
if(!space.current_frame().scale_selection_on_fulcrum(LaserBoy_3D_double(1, 1, space.magnitude_step_up)))
space.TUI_clue = "+ size Z by fulcrum";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().scale_selection(LaserBoy_3D_double(1, 1, space.magnitude_step_up)))
space.TUI_clue = "+ scale Z";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'N':
if(space.alt_menu_l)
{
if(!space.current_frame().scale_selection_on_fulcrum(LaserBoy_3D_double(1, 1, space.magnitude_step_dn)))
space.TUI_clue = "- scale Z by fulcrum";
else
space.TUI_clue = "out of bounds!";
}
else
{
if(!space.current_frame().scale_selection(LaserBoy_3D_double(1, 1, space.magnitude_step_dn)))
space.TUI_clue = "- scale Z";
else
space.TUI_clue = "out of bounds!";
}
break;
//------------------------------------------------------------
case 'a':
space.fulcrum.x += space.displacement_step;
space.TUI_clue = "+ X fulcrum";
break;
//------------------------------------------------------------
case 'A':
space.fulcrum.x -= space.displacement_step;
space.TUI_clue = "- X fulcrum";
break;
//------------------------------------------------------------
case 's':
space.fulcrum.y += space.displacement_step;
space.TUI_clue = "+ Y fulcrum";
break;
//------------------------------------------------------------
case 'S':
space.fulcrum.y -= space.displacement_step;
space.TUI_clue = "- Y fulcrum";
break;
//------------------------------------------------------------
case 'r':
space.fulcrum.z += space.displacement_step;
space.TUI_clue = "+ Z fulcrum";
break;
//------------------------------------------------------------
case 'R':
space.fulcrum.z -= space.displacement_step;
space.TUI_clue = "- Z fulcrum";
break;
//------------------------------------------------------------
case 'j':
temp_double = display_prompt_and_echo_double( "set fulcrum X (can be outside of space)"
, 0
, DBL_MAX
, -DBL_MAX
);
if(prompt_escaped)
break;
space.fulcrum.x = temp_double;
space.TUI_clue = "vertex X set";
break;
//------------------------------------------------------------
case 'k':
temp_double = display_prompt_and_echo_double( "set fulcrum Y (can be outside of space)"
, 0
, DBL_MAX
, -DBL_MAX
);
if(prompt_escaped)
break;
space.fulcrum.y = temp_double;
space.TUI_clue = "vertex Y set";
break;
//------------------------------------------------------------
case 'l':
temp_double = display_prompt_and_echo_double( "set fulcrum Z (can be outside of space)"
, 0
, DBL_MAX
, -DBL_MAX
);
if(prompt_escaped)
break;
space.fulcrum.z = temp_double;
space.TUI_clue = "vertex Z set";
break;
//------------------------------------------------------------
case ',':
space.fulcrum = space.current_frame().at(space.current_frame().egg);
space.TUI_clue = "fulcrum to egg";
break;
//------------------------------------------------------------
case '.':
space.fulcrum = space.current_frame().at(space.current_frame().spider);
space.TUI_clue = "fulcrum to spider";
break;
//------------------------------------------------------------
case '\'':
{
int index = display_prompt_and_echo_int("place egg at index");
if(prompt_escaped)
break;
if(index <= (int)space.current_frame().spider && index >= 0)
{
space.current_frame().egg = index;
space.current_frame().normalize_cursors();
}
else
{
space.display_message("vertex select start must be between the first vertex and select end");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case '"':
{
int index = display_prompt_and_echo_int("place spider at index");
if(prompt_escaped)
break;
if(index >= (int)space.current_frame().egg)
{
if(index < (int)space.current_frame().size())
{
space.current_frame().spider = index;
space.current_frame().normalize_cursors();
}
else
{
space.current_frame().spider = space.current_frame().size() - 1;
space.current_frame().normalize_cursors();
space.display_message("vertex select end must be at or behind last vertex");
wait_4_any_key();
}
}
else
{
space.display_message("vertex select end must be between select start and last vertex");
wait_4_any_key();
}
}
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
case '`':
space.copy_frame();
space.TUI_clue = "copy frame";
break;
//------------------------------------------------------------
case SDLK_RETURN:
space.show_menu = !space.show_menu;
if(!space.show_menu)
space.TUI_clue = "[Enter] show menu";
else
space.TUI_clue = "[Enter] hide menu";
break;
} // end switch(event.key.keysym.unicode)
} // end else if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
space.show_menu = show_menu_was;
return;
}
//############################################################################
void LaserBoy_SDL_GUI::direct_draw_segments_menu()
{
bool in_menu = true,
show_palette_was = space.show_palette,
show_target_palette_was = space.show_target_palette,
show_menu_was = space.show_menu;
space.show_menu = true;
space.show_palette = true;
space.show_color_cursor = true;
//------------------------------------------------------------------------
while(in_menu)
{
space.show_target_palette = space.current_frame().palette_index == LASERBOY_TRUE_COLOR ? true : false;
space.clean_screen();
space.render_space();
if(space.show_menu)
space.overlay_draw_by_coordinates_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
//------------------------------------------------------------
case SDLK_ESCAPE:
in_menu = false;
space.show_color_cursor = false;
space.show_palette = show_palette_was;
space.show_target_palette = show_target_palette_was;
space.TUI_clue = "exit render segments";
break;
//------------------------------------------------------------
case SDLK_BACKSPACE:
case SDLK_DELETE:
space.delete_current_frame();
space.TUI_clue = "deleted";
break;
//------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
check_for_digit_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
check_for_digit_keys(event.key.keysym.sym);
#endif
break;
//------------------------------------------------------------
case 'a':
draw_point_menu();
break;
//------------------------------------------------------------
case 'b':
draw_line_menu();
break;
//------------------------------------------------------------
case 'c':
draw_rectangle_menu();
break;
//------------------------------------------------------------
case 'd':
draw_polygon_menu();
break;
//------------------------------------------------------------
case 'e':
draw_polyline_menu();
break;
//------------------------------------------------------------
case 'f':
draw_polystar_menu();
break;
//------------------------------------------------------------
case 'g':
draw_circular_arc_menu();
break;
//------------------------------------------------------------
case 'h':
draw_elliptical_arc_menu();
break;
//------------------------------------------------------------
case 'i':
draw_rhodonea_menu();
break;
//------------------------------------------------------------
case 'j':
draw_epicycloid_menu();
break;
//------------------------------------------------------------
case 'k':
draw_epitrochoid_menu();
break;
//------------------------------------------------------------
case 'l':
draw_hypocycloid_menu();
break;
//------------------------------------------------------------
case 'm':
draw_hypotrochoid_menu();
break;
//------------------------------------------------------------
case 'n':
draw_lissajous_menu();
break;
//------------------------------------------------------------
case 'q':
draw_mono_spaced_font_menu();
break;
//------------------------------------------------------------
case 'r':
draw_variable_spaced_font_menu();
break;
//------------------------------------------------------------
case 'p':
space.selected_color_index++;
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
if(space.selected_color_index >= space.target_palette().size())
space.selected_color_index = 0;
}
else
{
if(space.selected_color_index >= space.current_palette().size())
space.selected_color_index = 0;
}
space.TUI_clue = "+ color index";
break;
//------------------------------------------------------------
case 'P':
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
if(space.selected_color_index == 0)
space.selected_color_index = space.target_palette().size();
}
else
{
if(space.selected_color_index == 0)
space.selected_color_index = space.current_palette().size();
}
space.selected_color_index--;
space.TUI_clue = "- color index";
break;
//------------------------------------------------------------
case 'z': // +100 frames
if(space.number_of_frames() > 100)
{
if( space.loop_animation
|| (space.frame_index <= (space.number_of_frames() - 101))
)
space.frame_index += 100;
while(space.frame_index >= space.number_of_frames())
space.frame_index = space.frame_index - space.number_of_frames();
space.TUI_clue = "+100 frames";
}
break;
//------------------------------------------------------------
case 'Z': // -100 frames
if(space.number_of_frames() > 100)
{
if(space.frame_index >= 100)
space.frame_index -= 100;
else if( space.loop_animation
&& (space.frame_index < 100)
)
{
space.frame_index = space.number_of_frames() + space.frame_index;
space.frame_index -= 100;
}
space.TUI_clue = "-100 frames";
}
break;
//------------------------------------------------------------
case '/': // show frame_set stats
space.show_frame_set_stats = !space.show_frame_set_stats;
break;
//------------------------------------------------------------
case '?': // show frame stats
space.show_frame_stats = !space.show_frame_stats;
break;
//------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//------------------------------------------------------------
case '`':
space.copy_frame();
space.TUI_clue = "copy frame";
break;
//------------------------------------------------------------
case '~':
space.new_frame();
space.TUI_clue = "new frame";
break;
//------------------------------------------------------------
case SDLK_RETURN:
space.show_menu = !space.show_menu;
if(!space.show_menu)
space.TUI_clue = "[Enter] show menu";
else
space.TUI_clue = "[Enter] hide menu";
break;
} // end switch(event.key.keysym.unicode)
} // end else if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
space.show_menu = show_menu_was;
return;
}
//############################################################################
void LaserBoy_SDL_GUI::effect_functions_menu()
{
bool bad_key = true;
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.render_space();
space.overlay_effect_functions_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit output file";
bad_key = false;
break;
//----------------------------------------------------------------
case '1': // generate and save frame effect
space.clean_screen();
space.effect_name.clear();
space.overlay_frame_effects();
while(!space.f_effect_selected())
{
display_prompt_f_effect_with_auto_complete("frame effect name");
if(prompt_escaped)
break;
}
if(space.effect_name.size() == 0)
break;
space.TUI_clue = space.effect_name;
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new ild file name [no name no save] ? ", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = LASERBOY_NO_FILE_SAVED;
display_space();
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& ( space.file_name.size() < 5
|| !iends_with(space.file_name, space.current_extension)
)
)
space.file_name += ".ild";
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
LaserBoy_Bounds out_of_bounds = space.call_frame_effect();
if(out_of_bounds & LASERBOY_BOUNDS_MASK)
{
space.display_error(space.effect_name + " is out of bounds! NO FILE SAVED!");
wait_4_Esc();
break;
}
}
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // generate and save selected frames effect
if(space.number_of_selected_frames())
{
space.clean_screen();
space.effect_name.clear();
space.overlay_selected_frames_effects();
while(!space.sf_effect_selected())
{
display_prompt_sf_effect_with_auto_complete("frame_set effect name");
if(prompt_escaped)
break;
}
if(space.effect_name.size() == 0)
break;
space.TUI_clue = space.effect_name;
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new ild file name [no name no save] ? ", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = LASERBOY_NO_FILE_SAVED;
display_space();
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& ( space.file_name.size() < 5
|| !iends_with(space.file_name, space.current_extension)
)
)
space.file_name += ".ild";
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
LaserBoy_Bounds out_of_bounds = space.call_selected_frames_effect();
if(out_of_bounds & LASERBOY_NOTHING_SELECTED)
{
space.display_error(space.effect_name + " requires selected frames");
wait_4_Esc();
break;
}
if(out_of_bounds & LASERBOY_BOUNDS_MASK)
{
space.display_error(space.effect_name + " is out of bounds! NO FILE SAVED!");
wait_4_Esc();
break;
}
}
bad_key = false;
break;
}
else
{
space.display_error("requires selected frames");
wait_4_Esc();
break;
}
//----------------------------------------------------------------
case '3': // generate and save frame_set effect
space.clean_screen();
space.effect_name.clear();
space.overlay_frame_set_effects();
while(!space.fs_effect_selected())
{
display_prompt_fs_effect_with_auto_complete("frame_set effect name");
if(prompt_escaped)
break;
}
if(space.effect_name.size() == 0)
break;
space.TUI_clue = space.effect_name;
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new ild file name [no name no save] ? ", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = LASERBOY_NO_FILE_SAVED;
display_space();
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& ( space.file_name.size() < 5
|| !iends_with(space.file_name, space.current_extension)
)
)
space.file_name += ".ild";
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
LaserBoy_Bounds out_of_bounds = space.call_frame_set_effect();
if(out_of_bounds & LASERBOY_NOTHING_SELECTED)
{
space.display_error(space.effect_name + " requires selected frames");
wait_4_Esc();
break;
}
if(out_of_bounds & LASERBOY_BOUNDS_MASK)
{
space.display_error(space.effect_name + " is out of bounds! NO FILE SAVED!");
wait_4_Esc();
break;
}
}
bad_key = false;
break;
} // end switch(event.key.keysym.unicode)
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_point_menu()
{
prompt_escaped = false;
LaserBoy_vertex _0;
space.clean_screen();
space.render_space();
_0.x = display_prompt_and_echo_short("X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_0.y = display_prompt_and_echo_short(" Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_0.z = display_prompt_and_echo_short(" Z [0]", 0);
if(prompt_escaped)
return;
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
_0.r = space.palette_picker(space.target_palette_index)[space.selected_color_index].r;
_0.g = space.palette_picker(space.target_palette_index)[space.selected_color_index].g;
_0.b = space.palette_picker(space.target_palette_index)[space.selected_color_index].b;
}
else
{
_0.c = space.selected_color_index;
_0.r = space.palette_picker(space.palette_index)[_0.c].r;
_0.g = space.palette_picker(space.palette_index)[_0.c].g;
_0.b = space.palette_picker(space.palette_index)[_0.c].b;
}
if(space.current_frame().size())
{
space.current_frame() += space.current_frame().back();
space.current_frame().back().blank();
}
_0.blank();
space.current_frame() += _0;
_0.unblank();
space.current_frame() += _0;
space.TUI_clue = "point";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_line_menu()
{
LaserBoy_vertex _0,
_1;
prompt_escaped = false;
space.clean_screen();
space.render_space();
_0.x = display_prompt_and_echo_short("start X [-32767]", -32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_0.y = display_prompt_and_echo_short("start Y [0]");
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_0.z = display_prompt_and_echo_short("start Z [0]");
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_1.x = display_prompt_and_echo_short("end X [32767]", 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_1.y = display_prompt_and_echo_short("end Y [0]");
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_1.z = display_prompt_and_echo_short("end Z [0]");
if(prompt_escaped)
return;
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
_1.r = space.palette_picker(space.target_palette_index)[space.selected_color_index].r;
_1.g = space.palette_picker(space.target_palette_index)[space.selected_color_index].g;
_1.b = space.palette_picker(space.target_palette_index)[space.selected_color_index].b;
}
else
{
_1.c = space.selected_color_index;
_1.r = space.palette_picker(space.palette_index)[_1.c].r;
_1.g = space.palette_picker(space.palette_index)[_1.c].g;
_1.b = space.palette_picker(space.palette_index)[_1.c].b;
}
if(space.current_frame().size())
{
space.current_frame() += space.current_frame().back();
space.current_frame().back().blank();
}
_0.blank();
_1.unblank();
space.current_frame() += _0;
space.current_frame() += _1;
space.TUI_clue = "line";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_rectangle_menu()
{
LaserBoy_vertex _0,
_1,
_2;
space.clean_screen();
space.render_space();
prompt_escaped = false;
_0.x = display_prompt_and_echo_short("first corner X [-30000]", -30000);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_0.y = display_prompt_and_echo_short("first corner Y [10000]", 10000);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_1.x = display_prompt_and_echo_short("second corner X [30000]", 30000);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_1.y = display_prompt_and_echo_short("second corner Y [-10000]", -10000);
if(prompt_escaped)
return;
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
_2.r = space.palette_picker(space.target_palette_index)[space.selected_color_index].r;
_2.g = space.palette_picker(space.target_palette_index)[space.selected_color_index].g;
_2.b = space.palette_picker(space.target_palette_index)[space.selected_color_index].b;
}
else
{
_2.c = space.selected_color_index;
_2.r = space.palette_picker(space.palette_index)[_2.c].r;
_2.g = space.palette_picker(space.palette_index)[_2.c].g;
_2.b = space.palette_picker(space.palette_index)[_2.c].b;
}
if(space.current_frame().size())
{
space.current_frame() += space.current_frame().back();
space.current_frame().back().blank();
}
_0.blank();
_2.unblank();
space.current_frame() += _0;
_2 = _0.as_3D_short();
_2.x = _1.x;
_2.z = _1.z;
space.current_frame() += _2;
_2 = _1.as_3D_short();
space.current_frame() += _2;
_2.x = _0.x;
_2.z = _0.z;
space.current_frame() += _2;
_2 = _0.as_3D_short();
space.current_frame() += _2;
space.TUI_clue = "rectangle";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_polygon_menu()
{
LaserBoy_3D_short center,
vertex;
LaserBoy_segment polygon;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]");
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]");
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
vertex.x = display_prompt_and_echo_short("first vertex X [30000]", 30000);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
vertex.y = display_prompt_and_echo_short("first vertex Y [0]");
if(prompt_escaped)
return;
u_int number_of_sides = 0;
while(number_of_sides < 3)
{
number_of_sides = display_prompt_and_echo_u_int( "number of sides [8] "
, 8
, 800
);
if(prompt_escaped)
{
space.display_error("number of sides must be 3 or more!");
return;
}
}
polygon = LaserBoy_segment(center,
vertex,
number_of_sides
);
polygon.palette_index = space.current_frame().palette_index;
space.current_frame() += polygon;
space.TUI_clue = "polygon";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_polyline_menu()
{
int number_of_vertecies = 0;
char text_number[16];
LaserBoy_vertex _0,
_1;
_1.unblank();
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
_1.r = space.palette_picker(space.target_palette_index)[space.selected_color_index].r;
_1.g = space.palette_picker(space.target_palette_index)[space.selected_color_index].g;
_1.b = space.palette_picker(space.target_palette_index)[space.selected_color_index].b;
}
else
{
_1.c = space.selected_color_index;
_1.r = space.palette_picker(space.palette_index)[_1.c].r;
_1.g = space.palette_picker(space.palette_index)[_1.c].g;
_1.b = space.palette_picker(space.palette_index)[_1.c].b;
}
prompt_escaped = false;
while(true)
{
sprintf(text_number, "%d", number_of_vertecies);
space.clean_screen();
space.render_space();
_1.x = display_prompt_and_echo_short(string("vertex ") + text_number + " X [0] ([Esc] to finish)");
if(prompt_escaped)
break;
space.clean_screen();
space.render_space();
_1.y = display_prompt_and_echo_short(string("vertex ") + text_number + " Y [0] ([Esc] to finish)");
if(prompt_escaped)
break;
space.clean_screen();
space.render_space();
_1.z = display_prompt_and_echo_short(string("vertex ") + text_number + " Z [0] ([Esc] to finish)");
if(prompt_escaped)
break;
space.current_frame() += _1;
if(number_of_vertecies == 0)
{
_0 = _1;
space.current_frame().back().blank();
}
number_of_vertecies++;
}
space.clean_screen();
space.render_space();
bool close_polyline = display_prompt_and_echo_bool("close polyline ? : y | [any]");
if(prompt_escaped)
return;
if(close_polyline)
space.current_frame() += _0;
space.TUI_clue = "polyline";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_polystar_menu()
{
LaserBoy_3D_short center,
vertex;
LaserBoy_segment polystar;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
vertex.x = display_prompt_and_echo_short("first vertex X [30000]", 30000);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
vertex.y = display_prompt_and_echo_short("first vertex Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int number_of_points = 0;
while(number_of_points < 3)
{
number_of_points = display_prompt_and_echo_u_int( "number of points [9]"
, 9
, 720
);
if(prompt_escaped)
{
space.display_error("number of points must be 3 or more!");
return;
}
}
double ratio = display_prompt_and_echo_double( "inner / outer ratio [0.5]"
, 0.5
, 1.0
, 0.0
);
if(prompt_escaped)
return;
polystar = LaserBoy_segment(center,
vertex,
number_of_points,
ratio
);
polystar.palette_index = space.current_frame().palette_index;
space.current_frame() += polystar;
space.TUI_clue = "polystar";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_circular_arc_menu()
{
LaserBoy_3D_short center,
radius;
LaserBoy_segment arc;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
radius.x = display_prompt_and_echo_short("first vertex X [32767]", 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
radius.y = display_prompt_and_echo_short("first vertex Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
double arc_angle = display_prompt_and_echo_double( "arc angle in degrees, (0 = 360) [0]"
, 0.0
, 360.0
, 0.0
);
if(prompt_escaped)
return;
arc = LaserBoy_segment(center, radius, arc_angle);
arc.palette_index = space.current_frame().palette_index;
space.current_frame() += arc;
space.TUI_clue = "circular arc";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_elliptical_arc_menu()
{
LaserBoy_3D_short center,
radius;
LaserBoy_segment arc;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
radius.x = display_prompt_and_echo_short("first vertex X [32767]", 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
radius.y = display_prompt_and_echo_short("first vertex Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
double arc_angle = display_prompt_and_echo_double( "arc angle in degrees, (0 = 360) [0]"
, 0.0
, 360.0
, -360.0
);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
double radii_ratio = display_prompt_and_echo_double( "minor / major radii ratio [0.5]"
, 0.5
);
if(prompt_escaped)
return;
arc = LaserBoy_segment(center, radius, arc_angle, radii_ratio);
arc.palette_index = space.current_frame().palette_index;
space.current_frame() += arc;
space.TUI_clue = "elliptical arc";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_rhodonea_menu()
{
LaserBoy_3D_short center;
LaserBoy_segment rhodonea;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
int radius = display_prompt_and_echo_short("radius [30000]", 30000);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int rhodonea_numerator = 0;
while(rhodonea_numerator == 0)
{
rhodonea_numerator = display_prompt_and_echo_u_int( "pedal factor numerator [11]"
, 11
);
if(prompt_escaped)
{
space.display_error("pedal numerator must not be 0!");
return;
}
}
space.clean_screen();
space.render_space();
u_int rhodonea_denominator = 0;
while(rhodonea_denominator == 0)
{
rhodonea_denominator = display_prompt_and_echo_u_int( "pedal factor denominator [17]"
, 17
);
if(prompt_escaped)
{
space.display_error("pedal denominator must not be 0!");
return;
}
}
rhodonea = LaserBoy_segment(center,
radius,
rhodonea_numerator,
rhodonea_denominator
);
rhodonea.palette_index = space.current_frame().palette_index;
space.current_frame() += rhodonea;
space.TUI_clue = "rhodonea";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_epicycloid_menu()
{
LaserBoy_3D_short center;
LaserBoy_segment epicycloid;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int fixed_radius = display_prompt_and_echo_u_int("fixed circle radius [3000]", 3000, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int roller_radius = display_prompt_and_echo_u_int("rolling circle radius [10000]", 10000, 32767);
if(prompt_escaped)
return;
epicycloid = LaserBoy_segment(fixed_radius,
center,
roller_radius,
roller_radius
);
epicycloid.palette_index = space.current_frame().palette_index;
space.current_frame() += epicycloid;
space.TUI_clue = "epicycloid";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_epitrochoid_menu()
{
LaserBoy_3D_short center;
LaserBoy_segment epitrochoid;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int fixed_radius = display_prompt_and_echo_u_int("fixed circle radius [3100]", 3100, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int roller_radius = display_prompt_and_echo_u_int("rolling circle radius [10000]", 10000, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int roller_offset = display_prompt_and_echo_u_int("distance from rolling center [9000]", 9000, 32767);
if(prompt_escaped)
return;
epitrochoid = LaserBoy_segment(fixed_radius,
center,
roller_radius,
roller_offset
);
epitrochoid.palette_index = space.current_frame().palette_index;
space.current_frame() += epitrochoid;
space.TUI_clue = "epitrochoid";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_hypocycloid_menu()
{
LaserBoy_3D_short center;
LaserBoy_segment hypocycloid;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int fixed_radius = display_prompt_and_echo_u_int("fixed circle radius [30000]", 30000, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int roller_radius = display_prompt_and_echo_u_int("rolling circle radius [13500]", 13500, 32767);
if(prompt_escaped)
return;
hypocycloid = LaserBoy_segment(fixed_radius,
roller_radius,
roller_radius,
center
);
hypocycloid.palette_index = space.current_frame().palette_index;
space.current_frame() += hypocycloid;
space.TUI_clue = "hypocycloid";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_hypotrochoid_menu()
{
LaserBoy_3D_short center;
LaserBoy_segment hypotrochoid;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int fixed_radius = display_prompt_and_echo_u_int("fixed circle radius [15000]", 15000, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int roller_radius = display_prompt_and_echo_u_int("rolling circle radius [8000]", 8000, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int roller_offset = display_prompt_and_echo_u_int("distance from rolling center [11000]", 11000, 32767);
if(prompt_escaped)
return;
hypotrochoid = LaserBoy_segment(fixed_radius,
roller_radius,
roller_offset,
center
);
hypotrochoid.palette_index = space.current_frame().palette_index;
space.current_frame() += hypotrochoid;
space.TUI_clue = "hypotrochoid";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_lissajous_menu()
{
LaserBoy_3D_short center;
LaserBoy_segment lissaju;
space.clean_screen();
space.render_space();
prompt_escaped = false;
center.x = display_prompt_and_echo_short("center X [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.y = display_prompt_and_echo_short("center Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
center.z = display_prompt_and_echo_short("center Z [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int amplitude_x = display_prompt_and_echo_u_int("amplitude in X [30000]", 30000, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int amplitude_y = display_prompt_and_echo_u_int("amplitude in Y [30000]", 30000, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int frequency_x = display_prompt_and_echo_u_int("frequency in X [4]", 4, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
u_int frequency_y = display_prompt_and_echo_u_int("frequency in Y [5]", 5, 32767);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
double phase_x = display_prompt_and_echo_double( "phase shift in X [0] degrees"
, 0.0
, 360.0
, 0.0
);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
double phase_y = display_prompt_and_echo_double( "phase shift in Y [0] degrees"
, 0.0
, 360.0
, 0.0
);
if(prompt_escaped)
return;
lissaju = LaserBoy_segment(center,
amplitude_x,
amplitude_y,
frequency_x,
frequency_y,
phase_x,
phase_y
);
lissaju.palette_index = space.current_frame().palette_index;
space.current_frame() += lissaju;
space.TUI_clue = "Lissajous curv";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_mono_spaced_font_menu()
{
char buffer[30];
string prompt;
LaserBoy_3D_short _0,
_1;
LaserBoy_segment segment;
space.clean_screen();
space.render_space();
prompt_escaped = false;
_0.x = display_prompt_and_echo_short("baseline start X [-30000]", -30000);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_0.y = display_prompt_and_echo_short("baseline start Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_1.x = display_prompt_and_echo_short("baseline end X [30000]", 30000);
if(prompt_escaped)
return;
sprintf(buffer, "%d", _0.y);
prompt = "baseline end Y [";
prompt.append(buffer);
prompt.append("]");
space.clean_screen();
space.render_space();
_1.y = display_prompt_and_echo_short(prompt.c_str(), _0.y);
if(prompt_escaped)
return;
space.get_file_list(LASERBOY_ILD_SHARE + string("fonts/"), ".ild");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("font file name ? [laserellipse.ild]", "laserellipse.ild");
if(prompt_escaped)
return;
}
if(space.file_name.size() == 0) // [esc]
return;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, ".ild"))
space.file_name += ".ild";
//------------------------------------------------------------------------
space.clean_screen();
space.render_space();
string text = display_prompt_and_echo_string("text to render");
if(prompt_escaped)
return;
//------------------------------------------------------------------------
segment = LaserBoy_segment(_0,
_1,
LASERBOY_ILD_SHARE + "fonts/" + space.file_name,
text
);
segment.palette_index = space.current_frame().palette_index;
space.current_frame() += segment;
//------------------------------------------------------------------------
space.TUI_clue = "text rendered";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::draw_variable_spaced_font_menu()
{
char buffer[30];
string prompt;
LaserBoy_3D_short _0,
_1;
LaserBoy_segment segment;
space.clean_screen();
space.render_space();
prompt_escaped = false;
_0.x = display_prompt_and_echo_short("baseline start X [-30000]", -30000);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_0.y = display_prompt_and_echo_short("baseline start Y [0]", 0);
if(prompt_escaped)
return;
space.clean_screen();
space.render_space();
_1.x = display_prompt_and_echo_short("baseline end X [30000]", 30000);
if(prompt_escaped)
return;
sprintf(buffer, "%d", _0.y);
prompt = "baseline end Y [";
prompt.append(buffer);
prompt.append("]");
space.clean_screen();
space.render_space();
_1.y = display_prompt_and_echo_short(prompt.c_str(), _0.y);
if(prompt_escaped)
return;
space.get_file_list(LASERBOY_ILD_SHARE + string("fonts/"), ".ild");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("font file name ? [wide_vector.ild]", "wide_vector.ild");
if(prompt_escaped)
return;
}
if(space.file_name.size() == 0) // [esc]
return;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, ".ild"))
space.file_name += ".ild";
//------------------------------------------------------------------------
space.clean_screen();
space.render_space();
string text = display_prompt_and_echo_string("text to render");
if(prompt_escaped)
return;
//------------------------------------------------------------------------
segment = LaserBoy_segment(_0,
_1,
LASERBOY_ILD_SHARE + string("fonts/") + space.file_name,
text,
0
);
segment.palette_index = space.current_frame().palette_index;
space.current_frame() += segment;
//------------------------------------------------------------------------
space.TUI_clue = "text rendered";
return;
}
//############################################################################
void LaserBoy_SDL_GUI::wav_utilities_menu()
{
bool in_menu = true,
good_call = false;
//------------------------------------------------------------------------
prompt_escaped = false;
while(in_menu)
{
space.set_current_menu_name("wav file utilities", 0x00002040);
space.clean_screen();
space.overlay_wav_utilities_menu();
display_space();
//--------------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
in_menu = false;
space.TUI_clue = "exit wav file utilities";
break;
//------------------------------------------------------------
case '1': // show wav on screen
space.set_current_menu_name("wav raster display options", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
wav_raster_display_menu();
break;
//------------------------------------------------------------
case '2': // apply LaserBoy wav sample offsets
space.set_current_menu_name("apply system offsets", 0x00002040, true);
space.clean_screen();
space.file_name.clear();
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
space.get_subdirectory_list();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to apply offsets");
if(prompt_escaped)
break;
}
if(prompt_escaped)
break;
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.clean_screen();
display_space();
if(space.apply_wav_offsets_prep(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
space.TUI_clue = "wav stats";
space.clean_screen();
good_call = space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(good_call)
display_space();
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
}
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case '3': // overwrite LaserBoy wav sample offsets
space.set_current_menu_name("overwrite system offsets", 0x00002040, true);
space.clean_screen();
space.file_name.clear();
space.get_subdirectory_list();
space.overlay_file_list();
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to overwrite offsets");
if(prompt_escaped)
break;
}
if(prompt_escaped)
break;
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.clean_screen();
display_space();
if(space.overwirte_wav_offsets(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
space.TUI_clue = "wav stats";
space.clean_screen();
good_call = space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(good_call)
display_space();
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
}
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case '4': // sort wav dir into subdirs
space.set_current_menu_name("sort wav sir", 0x00002040, true);
{ // scope
size_t files = 0,
new_dirs = 0;
space.sort_wav_dir(files, new_dirs);
space.display_message( to_string(files)
+ string(" moved from ")
+ LASERBOY_WAV_SHARE
+ string(" into ")
+ to_string(new_dirs)
+ string(" new directories")
);
wait_4_Esc();
}
break;
//------------------------------------------------------------
case '5': // apply color rescales to wav
space.set_current_menu_name("apply color rescales", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
apply_color_rescales_menu();
break;
//------------------------------------------------------------
case '6': // omit color rescal tables in header
space.set_current_menu_name("remove color rescales", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
omit_color_rescales_menu();
break;
//------------------------------------------------------------
case '7': // save color rescal tables
space.set_current_menu_name("saving rescales", 0x00002040, true);
space.clean_screen();
space.file_name.clear();
space.get_subdirectory_list();
space.overlay_file_list();
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to save color rescales");
if(prompt_escaped)
break;
}
if(prompt_escaped)
break;
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.clean_screen();
display_space();
if(space.save_wav_rescales_as_txt(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name,
LASERBOY_RESCALE_SHARE + space.file_name.substr(0, space.file_name.size() - 4))
)
{
space.TUI_clue = "wav stats";
space.clean_screen();
good_call = space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(good_call)
display_space();
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
}
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
}
break;
//------------------------------------------------------------
case '8': // impose bit resolution reduction on wav
space.set_current_menu_name("bit resolution to wav", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
bit_resolution_to_wav_menu();
break;
//------------------------------------------------------------
case '9': // invert LaserBoy signal polarities
space.set_current_menu_name("set signal polarities", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
set_signal_polarities_menu();
break;
//------------------------------------------------------------
case '0': // clear LaserBoy wav polarity matrix
space.set_current_menu_name("clear polarities list", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
clear_wav_polarities_menu();
break;
//------------------------------------------------------------
case 'a': // invert LaserBoy wav polarity
case 'A':
space.set_current_menu_name("invert wav", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("LaserBoy wav file name to see stats");
if(prompt_escaped)
break;
}
if(prompt_escaped)
break;
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.clean_screen();
display_space();
if(space.invert_wav_prep(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
space.TUI_clue = "wav invert";
space.clean_screen();
good_call = space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(good_call)
display_space();
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
}
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
if(prompt_escaped)
break;
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'b': // Show LaserBoy wav stats
case 'B':
space.set_current_menu_name("show stats", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("LaserBoy wav file name to see stats");
if(prompt_escaped)
break;
}
if(prompt_escaped)
break;
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.clean_screen();
good_call = space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(good_call)
display_space();
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
if(prompt_escaped)
break;
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'c': // analyze LaserBoy wav
case 'C':
space.set_current_menu_name("analyse wav", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to analyze");
if(prompt_escaped)
break;
}
if(prompt_escaped)
break;
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "wav analysis";
space.clean_screen();
good_call = space.overlay_wav_analysis(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(good_call)
display_space();
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
if(prompt_escaped)
break;
wait_4_Esc();
}
break;
//------------------------------------------------------------
case 'd': // stream wav
case 'D':
space.set_current_menu_name("stream wav", 0x00002040, true);
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
bool wav_real_time_was = space.wav_real_time,
wav_show_inverted_was = space.wav_show_inverted,
wav_clean_screen_was = space.wav_clean_screen,
wav_loop_was = space.wav_loop;
std::error_code ec;
string command,
command_return;
boost::process::ipstream pipe_stream;
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to stream");
if(prompt_escaped)
break;
}
if(prompt_escaped)
break;
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "stream wav";
space.clean_screen();
command = "gst-launch-1.0 filesrc location=";
command += LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name;
command += " ! wavparse ! audioconvert ! audio/x-raw,channels=5 ! rtpL16pay ! udpsink host=pi21 port=8885";
cout << endl << command << endl << flush;
boost::process::child play_wav(command.c_str(), boost::process::std_out > pipe_stream);
getline(pipe_stream, command_return);
cout << endl << command_return << endl << flush;
if(play_wav.running(ec))
{
display_wav(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(prompt_escaped)
{
play_wav.terminate(ec);
play_wav.wait(ec);
space.wav_real_time = wav_real_time_was,
space.wav_show_inverted = wav_show_inverted_was,
space.wav_clean_screen = wav_clean_screen_was,
space.wav_loop = wav_loop_was;
break;
}
}
play_wav.wait(ec);
space.wav_real_time = wav_real_time_was,
space.wav_show_inverted = wav_show_inverted_was,
space.wav_clean_screen = wav_clean_screen_was,
space.wav_loop = wav_loop_was;
}
break;
//------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::wav_show_settings_menu()
{
bool in_menu = true;
//------------------------------------------------------------------------
while(in_menu)
{
space.set_current_menu_name("wav show settings", 0x00002040);
space.clean_screen();
space.overlay_wav_show_settings_menu();
display_space();
//----------------------------------------------------------------
SDL_WaitEvent(&event);
if(event.type == SDL_KEYDOWN)
{
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
case SDLK_ESCAPE:
space.TUI_clue = "exit wav raster display settings";
in_menu = false;
break;
//------------------------------------------------------------
case '1':
space.wav_show_vertices = !space.wav_show_vertices;
if(space.wav_show_vertices)
space.TUI_clue = "show vertices";
else
space.TUI_clue = "hide vertices";
break;
//------------------------------------------------------------
case '2':
space.wav_show_blanks = !space.wav_show_blanks;
if(space.wav_show_blanks)
space.TUI_clue = "show blanking";
else
space.TUI_clue = "hide blanking";
break;
//------------------------------------------------------------
case '3':
space.wav_real_time = !space.wav_real_time;
if(space.wav_real_time)
space.TUI_clue = "real time";
else
space.TUI_clue = "as fast as possible";
break;
//------------------------------------------------------------
case '4':
space.wav_show_inverted = !space.wav_show_inverted;
if(space.wav_show_inverted)
space.TUI_clue = "inverted";
else
space.TUI_clue = "non-inverted";
break;
//------------------------------------------------------------
case '5':
space.wav_clean_screen = !space.wav_clean_screen;
if(space.wav_clean_screen)
space.TUI_clue = "clean screen";
else
space.TUI_clue = "no clean screen";
break;
//------------------------------------------------------------
case '6':
space.wav_loop = !space.wav_loop;
if(space.wav_loop)
space.TUI_clue = "loop";
else
space.TUI_clue = "no loop";
break;
} // end switch(event.key.keysym.unicode)
} // end if(event.type == SDL_KEYDOWN)
} // end while(in_menu)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::wav_raster_display_menu()
{
while(true)
{
space.set_current_menu_name("wav show options", 0x00002040, true);
space.clean_screen();
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.overlay_wav_raster_display_menu();
display_space();
prompt_escaped = false;
while(!space.file_selected())
{
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
display_prompt_file_with_auto_complete("wav file name to show");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
if(file_exists(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
if(!display_prompt_and_echo_bool("display as unformatted ? : y | [any]"))
{
display_wav(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(prompt_escaped)
return;
}
else
{
space.frame_set_error = LASERBOY_OK;
display_unframed_wav(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(space.frame_set_error & LASERBOY_LB_WAV_FORMAT_ERROR)
{
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " channel count mismatch " + space.wav_channel_map);
wait_4_Esc();
}
if(prompt_escaped)
return;
}
}
else
{
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
}
} // end while(true)
return;
}
//############################################################################
void LaserBoy_SDL_GUI::set_wav_offsets_menu()
{
int temp_int = 0;
prompt_escaped = false;
//------------------------------------------------------------------------
do
{
space.clean_screen();
space.overlay_wav_offsets(LASERBOY_CHANNEL_X);
temp_int = 0;
temp_int = display_prompt_and_echo_int( "wav sample offset for X ["
+ to_string(space.wav_offsets[LASERBOY_CHANNEL_X])
+ "]"
, space.wav_offsets[LASERBOY_CHANNEL_X]
);
if(prompt_escaped)
break;
space.wav_offsets[LASERBOY_CHANNEL_X] = temp_int;
//--------------------------------------------------------------------
space.clean_screen();
space.overlay_wav_offsets(LASERBOY_CHANNEL_Y);
temp_int = display_prompt_and_echo_int( "wav sample offset for Y ["
+ to_string(space.wav_offsets[LASERBOY_CHANNEL_Y])
+ "]"
, space.wav_offsets[LASERBOY_CHANNEL_Y]
);
if(prompt_escaped)
break;
space.wav_offsets[LASERBOY_CHANNEL_Y] = temp_int;
//--------------------------------------------------------------------
space.clean_screen();
space.overlay_wav_offsets(LASERBOY_CHANNEL_Z);
temp_int = display_prompt_and_echo_int( "wav sample offset for Z ["
+ to_string(space.wav_offsets[LASERBOY_CHANNEL_Z])
+ "]"
, space.wav_offsets[LASERBOY_CHANNEL_Z]
);
if(prompt_escaped)
break;
space.wav_offsets[LASERBOY_CHANNEL_Z] = temp_int;
//--------------------------------------------------------------------
space.clean_screen();
space.overlay_wav_offsets(LASERBOY_CHANNEL_R);
temp_int = display_prompt_and_echo_int( "wav sample offset for red ["
+ to_string(space.wav_offsets[LASERBOY_CHANNEL_R])
+ "]"
, space.wav_offsets[LASERBOY_CHANNEL_R]
);
if(prompt_escaped)
break;
space.wav_offsets[LASERBOY_CHANNEL_R] = temp_int;
//--------------------------------------------------------------------
space.clean_screen();
space.overlay_wav_offsets(LASERBOY_CHANNEL_G);
temp_int = display_prompt_and_echo_int( "wav sample offset for green ["
+ to_string(space.wav_offsets[LASERBOY_CHANNEL_G])
+ "]"
, space.wav_offsets[LASERBOY_CHANNEL_G]
);
if(prompt_escaped)
break;
space.wav_offsets[LASERBOY_CHANNEL_G] = temp_int;
//--------------------------------------------------------------------
space.clean_screen();
space.overlay_wav_offsets(LASERBOY_CHANNEL_B);
temp_int = display_prompt_and_echo_int( "wav sample offset for blue ["
+ to_string(space.wav_offsets[LASERBOY_CHANNEL_B])
+ "]"
, space.wav_offsets[LASERBOY_CHANNEL_B]
);
if(prompt_escaped)
break;
space.wav_offsets[LASERBOY_CHANNEL_B] = temp_int;
//--------------------------------------------------------------------
space.clean_screen();
space.overlay_wav_offsets(LASERBOY_CHANNEL_I);
temp_int = display_prompt_and_echo_int( "wav sample offset for intensity ["
+ to_string(space.wav_offsets[LASERBOY_CHANNEL_I])
+ "]"
, space.wav_offsets[LASERBOY_CHANNEL_I]
);
if(prompt_escaped)
break;
space.wav_offsets[LASERBOY_CHANNEL_I] = temp_int;
//--------------------------------------------------------------------
} while(0);
space.clean_screen();
space.overlay_wav_offsets(7);
display_space();
return;
}
//############################################################################
void LaserBoy_SDL_GUI::set_color_rescales_menu()
{
LaserBoy_Rescale_Error_Code rescale_file_error;
space.get_file_list(LASERBOY_RESCALE_SHARE, ".txt");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.overlay_color_rescale_stats(true);
prompt_escaped = false;
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("color rescale file for red", ".");
if(prompt_escaped)
break;
if(space.file_name.size() == 0 || space.file_name == ".")
break;
}
if(space.file_name.size() == 0)
return;
else if(space.file_name == ".")
space.color_rescale_file[0] = ".";
else
{
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.color_rescale_file[0] = LASERBOY_RESCALE_SHARE + space.file_name;
if((rescale_file_error = space.load_color_rescale_file(0)))
{
space.display_rescale_file_error(rescale_file_error);
wait_4_Esc();
}
}
//------------------------------------------------------------------------
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.overlay_color_rescale_stats(true);
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("color rescale file for green", ".");
if(prompt_escaped)
break;
if(space.file_name.size() == 0 || space.file_name == ".")
break;
}
if(space.file_name.size() == 0)
return;
else if(space.file_name == ".")
space.color_rescale_file[1] = ".";
else
{
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.color_rescale_file[1] = LASERBOY_RESCALE_SHARE + space.file_name;
if((rescale_file_error = space.load_color_rescale_file(1)))
{
space.display_rescale_file_error(rescale_file_error);
wait_4_Esc();
}
}
//------------------------------------------------------------------------
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.overlay_color_rescale_stats(true);
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("color rescale file for blue", ".");
if(prompt_escaped)
break;
if(space.file_name.size() == 0 || space.file_name == ".")
break;
}
if(space.file_name.size() == 0)
return;
else if(space.file_name == ".")
space.color_rescale_file[2] = ".";
else
{
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.color_rescale_file[2] = LASERBOY_RESCALE_SHARE + space.file_name;
if((rescale_file_error = space.load_color_rescale_file(2)))
{
space.display_rescale_file_error(rescale_file_error);
wait_4_Esc();
}
}
//------------------------------------------------------------------------
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.overlay_color_rescale_stats(true);
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("color rescale file for intensity", ".");
if(prompt_escaped)
break;
if(space.file_name.size() == 0 || space.file_name == ".")
break;
}
if(space.file_name.size() == 0)
return;
else if(space.file_name == ".")
space.color_rescale_file[3] = ".";
else
{
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.color_rescale_file[3] = LASERBOY_RESCALE_SHARE + space.file_name;
if((rescale_file_error = space.load_color_rescale_file(3)))
{
space.display_rescale_file_error(rescale_file_error);
wait_4_Esc();
}
}
//------------------------------------------------------------------------
space.clean_screen();
space.overlay_color_rescale_stats(false);
display_space();
wait_4_Esc();
return;
}
//############################################################################
void LaserBoy_SDL_GUI::apply_color_rescales_menu()
{
bool good_call = false;
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
prompt_escaped = false;
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to apply color rescales");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
return;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
//------------------------------------------------------------------------
space.clean_screen();
display_space();
if(space.apply_color_rescales_prep(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
space.TUI_clue = "wav stats";
space.clean_screen();
good_call = space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(good_call)
display_space();
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
}
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
return;
}
//############################################################################
void LaserBoy_SDL_GUI::omit_color_rescales_menu()
{
bool good_call = false;
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
prompt_escaped = false;
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to remove color rescales");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
return;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
//------------------------------------------------------------------------
space.clean_screen();
display_space();
if(space.omit_color_rescales(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
space.TUI_clue = "wav stats";
space.clean_screen();
good_call = space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
if(good_call)
display_space();
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
}
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
return;
}
//############################################################################
void LaserBoy_SDL_GUI::set_signal_polarities_menu()
{
short wav_signal_id[8];
u_int wav_channels,
i;
//------------------------------------------------------------------------
prompt_escaped = false;
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to signal invert");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
return;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
if(!file_exists(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
return;
}
//------------------------------------------------------------------------
for(i = LASERBOY_CHANNEL_X; i <= LASERBOY_CHANNEL_I; i++)
space.signal_polarity[i] = -1; // not set!
//------------------------------------------------------------------------
wav_channels = space.overlay_wav_signal_polarities(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name, wav_signal_id);
for(i = 0; i < wav_channels; i++)
{
space.clean_screen();
space.overlay_wav_signal_polarities(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name, wav_signal_id);
switch((int)abs(wav_signal_id[i]))
{
case LASERBOY_SIGNAL_X_POSITION:
space.signal_polarity[LASERBOY_CHANNEL_X] = display_prompt_and_echo_bool("invert X ? : y | [any]");
if(prompt_escaped)
return;
break;
//------------------------------------------------------------
case LASERBOY_SIGNAL_Y_POSITION:
space.signal_polarity[LASERBOY_CHANNEL_Y] = display_prompt_and_echo_bool("invert Y ? : y | [any]");
if(prompt_escaped)
return;
break;
//------------------------------------------------------------
case LASERBOY_SIGNAL_Z_POSITION:
space.signal_polarity[LASERBOY_CHANNEL_Z] = display_prompt_and_echo_bool("invert Z ? : y | [any]");
if(prompt_escaped)
return;
break;
//------------------------------------------------------------
case LASERBOY_SIGNAL_RED_ANALOG:
space.signal_polarity[LASERBOY_CHANNEL_R] = display_prompt_and_echo_bool("invert red ? : y | [any]");
if(prompt_escaped)
return;
break;
//------------------------------------------------------------
case LASERBOY_SIGNAL_GREEN_ANALOG:
space.signal_polarity[LASERBOY_CHANNEL_G] = display_prompt_and_echo_bool("invert green ? : y | [any]");
if(prompt_escaped)
return;
break;
//------------------------------------------------------------
case LASERBOY_SIGNAL_BLUE_ANALOG:
space.signal_polarity[LASERBOY_CHANNEL_B] = display_prompt_and_echo_bool("invert blue ? : y | [any]");
if(prompt_escaped)
return;
break;
//------------------------------------------------------------
case LASERBOY_SIGNAL_MONO_TTL:
case LASERBOY_SIGNAL_MONO_OR_ANALOG:
case LASERBOY_SIGNAL_MONO_WEIGHTED_ANALOG:
case LASERBOY_SIGNAL_MONO_AVG_ANALOG:
case LASERBOY_SIGNAL_MONO_O_SCOPE:
space.signal_polarity[LASERBOY_CHANNEL_I] = display_prompt_and_echo_bool("invert intensity ? : y | [any]");
if(prompt_escaped)
return;
break;
//------------------------------------------------------------
case LASERBOY_NO_SIGNAL:
default:
break;
} // end switch((int)abs(wav_out_header.signal_id[i]))
} // end for(u_int i = 0; i < wav_out_header.num_channels; i++)
if(wav_channels)
{
space.clean_screen();
space.overlay_wav_signal_polarities(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name, wav_signal_id);
display_space();
SDL_Delay(250);
space.TUI_clue = "inverting signals";
display_space();
//----------------------------------------------------------------
space.invert_signals_prep(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
//----------------------------------------------------------------
space.TUI_clue = "wav stats";
space.clean_screen();
display_space();
if(!space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
else
display_space();
}
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::clear_wav_polarities_menu()
{
prompt_escaped = false;
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to clear");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
return;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
if(!file_exists(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
return;
}
//------------------------------------------------------------------------
space.clean_screen();
bool global_flip_flop = display_prompt_and_echo_bool("flip global polarity status? : y | [any]");
if(prompt_escaped)
return;
space.TUI_clue = "clearing polarities";
display_space();
//------------------------------------------------------------------------
if(space.clear_wav_polarity_list(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name, global_flip_flop))
{
space.TUI_clue = "wav stats";
space.clean_screen();
display_space();
if(!space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
else
display_space();
}
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::bit_resolution_to_wav_menu()
{
prompt_escaped = false;
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
{
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to bit reduce");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
return;
string file_in = space.file_name;
if(file_in.size() < 5 || file_in.substr(file_in.size() - 4) != ".wav")
file_in += ".wav";
if(!file_exists(LASERBOY_WAV_SHARE + space.working_subdirectory + file_in))
{
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + file_in + " failed to open");
wait_4_Esc();
return;
}
//------------------------------------------------------------------------
space.clean_screen();
space.overlay_file_list();
string file_out = display_prompt_and_echo_name("new name for output wav", 64);
if(prompt_escaped)
return;
if(file_out.size() == 0)
return;
if(file_out.size() < 5 || file_out.substr(file_out.size() - 4) != ".wav")
file_out += ".wav";
space.TUI_clue = "bit reducing";
display_space();
//------------------------------------------------------------------------
if(space.bit_resolution_to_wav_prep(LASERBOY_WAV_SHARE + space.working_subdirectory + file_in, LASERBOY_WAV_SHARE + space.working_subdirectory + file_out))
{
space.TUI_clue = "wav stats";
space.clean_screen();
display_space();
if(!space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + file_out))
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + file_out + " failed to open");
else
display_space();
}
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + file_out + " failed to open");
wait_4_Esc();
}
return;
}
//############################################################################
void LaserBoy_SDL_GUI::file_open_menu()
{
bool bad_key = true;
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.overlay_in_file_type_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit input file";
bad_key = false;
break;
//----------------------------------------------------------------
case '1': // open ild
space.current_menu_name = "open ild";
if(file_in_cd_menu(LASERBOY_ILD_SHARE))
if(ild_file_open_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // open dxf
space.current_menu_name = "open dxf";
if(dxf_file_open_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // open wav
space.current_menu_name = "open wav";
if(file_in_cd_menu(LASERBOY_WAV_SHARE))
if(wav_file_open_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '4': // open txt
space.current_menu_name = "open txt";
if(txt_file_open_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '5': // open txt
space.current_menu_name = "open ctn";
if(ctn_file_open_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '6': // open bmp
space.current_menu_name = "open bmp";
if(bmp_file_open_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '7': // open wtf
space.current_menu_name = "open wtf";
space.get_file_list(LASERBOY_WTF_SHARE, ".wtf");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wtf file name [LaserBoy.wtf]", "LaserBoy.wtf");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(!space.load_wtf_file(LASERBOY_WTF_SHARE + space.file_name))
{
space.display_error(LASERBOY_WTF_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = "wtf open";
bad_key = false;
break;
//----------------------------------------------------------------
case '8': // open utf8
{ // scope
size_t i;
u32string unicode;
space.current_menu_name = "open utf8";
space.get_file_list(LASERBOY_UTF8_SHARE, ".utf8");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("utf8 file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(!get_utf8_index(unicode, LASERBOY_UTF8_SHARE + space.file_name))
{
space.display_error(LASERBOY_UTF8_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
if(unicode.size() > space.number_of_frames())
{
if(display_prompt_and_echo_bool("utf8 greater than frames! add missing frames? (y) | [any]"))
{
LaserBoy_frame frame;
for(i = 0; i < space.number_of_frames(); i++)
space.frame_picker(i).name = as_hex_string(unicode[i]);
for(i = space.number_of_frames(); i < unicode.size(); i++)
{
frame = LaserBoy_real_segment(unicode[i]);
frame.name = as_hex_string(unicode[i]);
space += frame;
}
}
else
{
bad_key = false;
break;
}
}
else if(unicode.size() < space.number_of_frames())
{
if(display_prompt_and_echo_bool("utf8 less than frames! tail-end un-indexed frames? (y) | [any]"))
{
for(i = 0; i < unicode.size(); i++)
space.frame_picker(i).name = as_hex_string(unicode[i]);
for(i = unicode.size(); i < space.number_of_frames(); i++)
space.frame_picker(i).name = "ffffffff";
}
else
{
bad_key = false;
break;
}
}
else
{
for(i = 0; i < unicode.size(); i++)
space.frame_picker(i).name = as_hex_string(unicode[i]);
}
} // end scope
space.TUI_clue = "utf8 open";
bad_key = false;
break;
} // end switch(event.key.keysym.unicode)
}
return;
}
//############################################################################
bool LaserBoy_SDL_GUI::file_in_cd_menu(string LB_dir)
{
bool bad_key = true;
prompt_escaped = false;
space.clean_screen();
while(bad_key)
{
space.clean_screen();
space.get_subdirectory_list(LB_dir); // folders from ./ild/
if(!space.subdirectory_selected())
space.working_subdirectory.clear();
space.overlay_file_in_cd_menu(LB_dir);
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit cd dir";
return false;
//----------------------------------------------------------------
case '1': // change current ild directory
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LB_dir); // folders from LB_dir
space.overlay_subdirectory_list();
while(!space.subdirectory_selected())
{
display_prompt_dir_with_auto_complete("cd to directory name");
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
}
if(space.working_subdirectory.size()) // not zero
space.working_subdirectory += "/";
else
break;
if(!directory_exists(LB_dir + space.working_subdirectory, space.absolute_path_of_LaserBoy)) // does not exists
{
space.display_error(LB_dir + space.working_subdirectory + " does not exists!");
wait_4_Esc();
space.working_subdirectory = subdirectory_copy; // stay in the current directory
break;
}
space.TUI_clue = "cd dir" + LB_dir + space.working_subdirectory;
bad_key = false;
}
break;
//----------------------------------------------------------------
case '2': // stay in current ild directory
space.TUI_clue = "open file " + LB_dir + space.working_subdirectory;
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // go to root ild directory
space.clean_screen();
space.working_subdirectory.clear();
space.overlay_subdirectory_list();
space.TUI_clue = "cd to dir" + LB_dir + space.working_subdirectory;
bad_key = false;
break;
//----------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
//----------------------------------------------------------------
} // end while(bad_key)
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::ild_file_open_menu()
{
bool bad_key = true;
LaserBoy_ild_header_count counter;
LaserBoy_frame_set frame_set;
space.get_file_list(LASERBOY_ILD_SHARE + space.working_subdirectory, ".ild");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
prompt_escaped = false;
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("open ild file in " + LASERBOY_ILD_SHARE + space.working_subdirectory);
if(prompt_escaped)
return false;
}
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".ild";
while(bad_key)
{
space.clean_screen();
space.overlay_in_ild_action_menu();
display_space();
//--------------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//--------------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit input ild";
return false;
//----------------------------------------------------------------
case '1': // replace
space.TUI_clue = "ild replace";
space.clean_screen();
display_space();
space.display_please_wait();
if(!space.report_ild_file_open(frame_set, space.file_name, counter))
return false;
space.frame_index = 0;
space = frame_set;
space.TUI_clue = LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // prepend
space.TUI_clue = "ild prepend";
space.clean_screen();
display_space();
space.display_please_wait();
if(!space.report_ild_file_open(frame_set, space.file_name, counter))
return false;
space.frame_index = 0;
frame_set += space;
space = frame_set;
space.TUI_clue = LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // insert
space.TUI_clue = "ild insert";
space.clean_screen();
display_space();
space.display_please_wait();
{ // scope
u_int i;
LaserBoy_frame_set result;
if(!space.report_ild_file_open(frame_set, space.file_name, counter))
return false;
for(i = 0; i <= space.frame_index; i++)
result += space[i];
for(i = 0; i < frame_set.number_of_frames(); i++)
result += frame_set[i];
for(i = space.frame_index + 1; i < space.number_of_frames(); i++)
result += space[i];
space.frame_index = 0;
space = result;
}
space.TUI_clue = LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '4': // append
space.TUI_clue = "ild append";
space.clean_screen();
display_space();
space.display_please_wait();
if(!space.report_ild_file_open(frame_set, space.file_name, counter))
return false;
space.frame_index = 0;
space += frame_set;
space.TUI_clue = LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '5': // superimpose
space.TUI_clue = "ild superimpose";
space.clean_screen();
display_space();
space.display_please_wait();
if(!space.report_ild_file_open(frame_set, space.file_name, counter))
return false;
space.frame_index = 0;
space.superimpose_frame_set(frame_set);
space.TUI_clue = LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name;
bad_key = false;
break;
} // end switch(event.key.keysym.unicode)
//--------------------------------------------------------------------
space.display_ild_file_stats(counter);
wait_4_Esc();
} // end while(bad_key)
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::dxf_file_open_menu()
{
bool bad_key = true;
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.overlay_in_dxf_action_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit input dxf";
return false;
//----------------------------------------------------------------
case '1': // open dxf
space.clean_screen();
space.get_file_list(LASERBOY_DXF_SHARE, ".dxf");
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("dxf file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".dxf";
space.TUI_clue = "dxf replace";
space.clean_screen();
display_space();
if(space.from_dxf_file(LASERBOY_DXF_SHARE + space.file_name) != LASERBOY_OK)
{
space.display_error(LASERBOY_DXF_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = LASERBOY_DXF_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // append dxf
space.clean_screen();
space.get_file_list(LASERBOY_DXF_SHARE, ".dxf");
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("dxf file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".dxf";
space.TUI_clue = "dxf append";
space.clean_screen();
display_space();
if(space.from_dxf_file(LASERBOY_DXF_SHARE + space.file_name, true) != LASERBOY_OK)
{
space.display_error(LASERBOY_DXF_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = LASERBOY_DXF_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // open dxf directory
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_DXF_SHARE); // folders from ./dxf/
space.overlay_subdirectory_list();
while(!space.subdirectory_selected())
{
display_prompt_dir_with_auto_complete("dxf directory name");
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
}
if(space.working_subdirectory.size() == 0)
break;
space.TUI_clue = "dxf set replace " + space.working_subdirectory;
display_space();
space.frame_index = 0;
if(!space.from_dxf_directory(LASERBOY_DXF_SHARE + space.working_subdirectory))
{
space.display_error(LASERBOY_DXF_SHARE + space.working_subdirectory + " failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = "dxf set open " + space.working_subdirectory;
space.working_subdirectory = subdirectory_copy;
bad_key = false;
}
break;
//----------------------------------------------------------------
case '4': // append dxf directory
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_DXF_SHARE); // folders from ./dxf/
space.overlay_subdirectory_list();
while(!space.subdirectory_selected())
{
display_prompt_dir_with_auto_complete("dxf directory name");
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
}
if(space.working_subdirectory.size() == 0)
break;
space.TUI_clue = "dxf set append" + space.working_subdirectory;
display_space();
if(!space.from_dxf_directory(LASERBOY_DXF_SHARE + space.working_subdirectory, true))
{
space.display_error(LASERBOY_DXF_SHARE + space.working_subdirectory + " failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = "dxf set append " + space.working_subdirectory;
space.working_subdirectory = subdirectory_copy;
bad_key = false;
}
break;
//----------------------------------------------------------------
case '5': // open dxf font frames_set
space.clean_screen();
space.get_file_list(LASERBOY_DXF_SHARE, ".dxf");
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("dxf file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".dxf";
space.TUI_clue = "dxf font replace";
space.clean_screen();
display_space();
if(space.from_dxf_font(LASERBOY_DXF_SHARE + space.file_name) != LASERBOY_OK)
{
space.display_error(LASERBOY_DXF_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
else
{
if(file_exists( LASERBOY_UTF8_SHARE
+ space.file_name.substr(0, space.file_name.size() - 4)
+ ".utf8"
)
)
{
if(display_prompt_and_echo_bool( "name frames from ./utf8/"
+ space.file_name.substr(0, space.file_name.size() - 4)
+ ".utf8 ? : y | [any]"
)
)
{
size_t i;
u32string unicode;
if(!get_utf8_index(unicode, LASERBOY_UTF8_SHARE
+ space.file_name.substr(0, space.file_name.size() - 4)
+ ".utf8"
)
)
{
space.display_error( LASERBOY_UTF8_SHARE
+ space.file_name.substr(0, space.file_name.size() - 4)
+ ".utf8" + " failed to open"
);
wait_4_Esc();
break;
}
if(unicode.size() > space.number_of_frames())
{
if(display_prompt_and_echo_bool("utf8 greater than frames! add missing frames? (y) | [any]"))
{
LaserBoy_frame frame;
for(i = 0; i < space.number_of_frames(); i++)
space.frame_picker(i).name = as_hex_string(unicode[i]);
for(i = space.number_of_frames(); i < unicode.size(); i++)
{
frame = LaserBoy_real_segment(unicode[i]);
frame.name = as_hex_string(unicode[i]);
space += frame;
}
}
else
{
bad_key = false;
break;
}
}
else if(unicode.size() < space.number_of_frames())
{
if(display_prompt_and_echo_bool("utf8 less than frames! tail-end un-indexed frames? (y) | [any]"))
{
for(i = 0; i < unicode.size(); i++)
space.frame_picker(i).name = as_hex_string(unicode[i]);
for(i = unicode.size(); i < space.number_of_frames(); i++)
space.frame_picker(i).name = "ffffffff";
}
else
{
bad_key = false;
break;
}
}
else
{
for(i = 0; i < unicode.size(); i++)
space.frame_picker(i).name = as_hex_string(unicode[i]);
}
} // end if(display_prompt_and_echo_bool( "name frames from " ...
} // end if(file_exists( LASERBOY_DXF_SHARE .....
}
space.TUI_clue = LASERBOY_DXF_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '6': // append dxf
space.clean_screen();
space.get_file_list(LASERBOY_DXF_SHARE, ".dxf");
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("dxf file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".dxf";
space.TUI_clue = "dxf font append";
space.clean_screen();
display_space();
{ // scope
size_t current_number_of_frames = space.number_of_frames();
if(space.from_dxf_font(LASERBOY_DXF_SHARE + space.file_name, true) != LASERBOY_OK)
{
space.display_error(LASERBOY_DXF_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
else
{
if(file_exists( LASERBOY_UTF8_SHARE
+ space.file_name.substr(0, space.file_name.size() - 4)
+ ".utf8"
)
)
{
if(display_prompt_and_echo_bool( "name frames from ./utf8/"
+ space.file_name.substr(0, space.file_name.size() - 4)
+ ".utf8 ? : y | [any]"
)
)
{
size_t i;
u32string unicode;
if(!get_utf8_index(unicode, LASERBOY_UTF8_SHARE
+ space.file_name.substr(0, space.file_name.size() - 4)
+ ".utf8"
)
)
{
space.display_error( LASERBOY_UTF8_SHARE
+ space.file_name.substr(0, space.file_name.size() - 4)
+ ".utf8" + " failed to open"
);
wait_4_Esc();
break;
}
if(unicode.size() > (space.number_of_frames() - current_number_of_frames))
{
if(display_prompt_and_echo_bool("utf8 greater than added frames! add missing frames? (y) | [any]"))
{
LaserBoy_frame frame;
for(i = (current_number_of_frames - 1); i < space.number_of_frames(); i++)
space.frame_picker(i).name = as_hex_string(unicode[i - current_number_of_frames]);
for(i = (space.number_of_frames() - current_number_of_frames); i < unicode.size(); i++)
{
frame = LaserBoy_real_segment(unicode[i]);
frame.name = as_hex_string(unicode[i]);
space += frame;
}
}
else
{
bad_key = false;
break;
}
}
else if(unicode.size() < (space.number_of_frames() - current_number_of_frames))
{
if(display_prompt_and_echo_bool("utf8 less than frames! tail-end un-indexed frames? (y) | [any]"))
{
for(i = (current_number_of_frames - 1); i < space.number_of_frames(); i++)
space.frame_picker(i).name = as_hex_string(unicode[i - current_number_of_frames]);
for(i = (unicode.size() + current_number_of_frames); i < space.number_of_frames(); i++)
space.frame_picker(i).name = "ffffffff";
}
else
{
bad_key = false;
break;
}
}
else
{
for(i = 0; i < unicode.size(); i++)
space.frame_picker(i).name = as_hex_string(unicode[i]);
}
} // end if(display_prompt_and_echo_bool( "name frames from " ...
} // end if(file_exists( LASERBOY_DXF_SHARE .....
}
}
space.TUI_clue = LASERBOY_DXF_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
} // end while(bad_key)
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::wav_file_open_menu()
{
bool bad_key = true;
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.overlay_in_wav_action_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit input wav";
return false;
//----------------------------------------------------------------
case '1': // replace
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "opening " + space.file_name;
display_space();
if(!space.from_LaserBoy_wav_file(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
if(space.frame_set_error & LASERBOY_LB_WAV_FORMAT_ERROR)
space.display_error(space.file_name + " is not a LaserBoy formatted wav");
else
space.display_error(space.file_name + " failed to open");
wait_4_Esc();
break;
}
else
{
space.clean_screen();
space.render_space();
space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
display_space();
wait_4_any_key();
}
space.TUI_clue = LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // append
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "opening " + space.file_name;
display_space();
if(!space.from_LaserBoy_wav_file(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name, true))
{
if(space.frame_set_error & LASERBOY_LB_WAV_FORMAT_ERROR)
space.display_error(space.file_name + " is not a LaserBoy formatted wav");
else
space.display_error(space.file_name + " failed to open");
wait_4_Esc();
break;
}
else
{
space.clean_screen();
space.render_space();
space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
display_space();
wait_4_any_key();
}
space.TUI_clue = LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // open wav as unformatted
{
space.get_file_list(LASERBOY_WAV_SHARE + space.working_subdirectory, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "opening " + space.file_name;
if(!file_exists(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name))
{
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
break;
}
bool global_polarity = display_prompt_and_echo_bool("is this wav inverted ? : y | [any]");
if(prompt_escaped)
break;
space.clean_screen();
display_space();
if(!space.from_unformatted_wav_file(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name, global_polarity, false))
{
if(space.frame_set_error & LASERBOY_LB_WAV_FORMAT_ERROR)
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " channel count mismatch " + space.wav_channel_map);
else
space.display_error(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
break;
}
else
{
space.clean_screen();
space.render_space();
space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name);
display_space();
wait_4_any_key();
}
space.TUI_clue = LASERBOY_WAV_SHARE + space.working_subdirectory + space.file_name;
bad_key = false;
break;
}
/*
//----------------------------------------------------------------
case '4': // replace frame_set with LaserBoy formatted wav clip
space.get_file_list(LASERBOY_CLIPS_SHARE, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "opening " + space.file_name;
display_space();
if(!space.from_LaserBoy_wav_file(LASERBOY_CLIPS_SHARE + space.file_name))
{
if(space.frame_set_error & LASERBOY_LB_WAV_FORMAT_ERROR)
space.display_error(space.file_name + " is not a LaserBoy formatted wav");
else
space.display_error(space.file_name + " failed to open");
wait_4_Esc();
break;
}
else
{
space.clean_screen();
space.render_space();
space.overlay_wav_header_stats(LASERBOY_CLIPS_SHARE + space.file_name);
display_space();
wait_4_any_key();
}
space.TUI_clue = LASERBOY_CLIPS_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '5': // append frame_set with LaserBoy formatted wav clip
space.get_file_list(LASERBOY_CLIPS_SHARE, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "opening " + space.file_name;
display_space();
if(!space.from_LaserBoy_wav_file(LASERBOY_CLIPS_SHARE + space.file_name, true))
{
if(space.frame_set_error & LASERBOY_LB_WAV_FORMAT_ERROR)
space.display_error(space.file_name + " is not a LaserBoy formatted wav");
else
space.display_error(space.file_name + " failed to open");
wait_4_Esc();
break;
}
else
{
space.clean_screen();
space.render_space();
space.overlay_wav_header_stats(LASERBOY_CLIPS_SHARE + space.file_name);
display_space();
wait_4_any_key();
}
space.TUI_clue = LASERBOY_CLIPS_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '6': // open LaserBoy wav clip as unformatted
{
space.get_file_list(LASERBOY_CLIPS_SHARE, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "opening " + space.file_name;
if(!file_exists(LASERBOY_CLIPS_SHARE + space.file_name))
{
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
bool global_polarity = display_prompt_and_echo_bool("is this wav inverted ? : y | [any]");
if(prompt_escaped)
break;
space.clean_screen();
display_space();
if(!space.from_unformatted_wav_file(LASERBOY_CLIPS_SHARE + space.file_name, global_polarity, false))
{
if(space.frame_set_error & LASERBOY_LB_WAV_FORMAT_ERROR)
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " has fewer channels than " + space.wav_channel_map);
else
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
else
{
space.clean_screen();
space.render_space();
space.overlay_wav_header_stats(LASERBOY_CLIPS_SHARE + space.file_name);
display_space();
wait_4_any_key();
}
space.TUI_clue = LASERBOY_CLIPS_SHARE + space.file_name;
bad_key = false;
break;
}
//----------------------------------------------------------------
case '7': // replace frame_set with unformatted wav
if(wav_unformatted_open_menu(false))
bad_key = false;
break;
//----------------------------------------------------------------
case '8': // append frame_set with unformatted wav
if(wav_unformatted_open_menu(true))
bad_key = false;
break;
*/
//----------------------------------------------------------------
case '9':
if(wav_LB_headerless_open_menu(false))
bad_key = false;
break;
//----------------------------------------------------------------
case '0': // open qm blanked wav
if(wav_qm_open_menu(true))
bad_key = false;
break;
}
}
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::wav_unformatted_open_menu(bool append)
{
space.get_file_list(LASERBOY_UNFORMATTED_SHARE, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
display_space();
prompt_escaped = false;
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name");
if(prompt_escaped)
return false;
}
if(space.file_name.size() == 0) // [esc]
return false;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "opening wav";
bool global_polarity = display_prompt_and_echo_bool("is this wav inverted ? : y | [any]");
if(prompt_escaped)
return false;
display_space();
if(!file_exists(LASERBOY_UNFORMATTED_SHARE + space.file_name))
{
space.display_error(LASERBOY_UNFORMATTED_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
if(!space.from_unformatted_wav_file(LASERBOY_UNFORMATTED_SHARE + space.file_name, global_polarity, append))
{
if(space.frame_set_error & LASERBOY_LB_WAV_FORMAT_ERROR)
space.display_error(LASERBOY_UNFORMATTED_SHARE + space.file_name + " channel count mismatch " + space.wav_channel_map);
else
space.display_error(LASERBOY_UNFORMATTED_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
space.clean_screen();
space.render_space();
space.overlay_wav_header_stats(LASERBOY_UNFORMATTED_SHARE + space.file_name);
display_space();
wait_4_any_key();
}
space.TUI_clue = LASERBOY_UNFORMATTED_SHARE + space.file_name;
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::wav_LB_headerless_open_menu(bool append)
{
bool global_polarity;
space.get_file_list(LASERBOY_WAV_SHARE, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
display_space();
prompt_escaped = false;
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name");
if(prompt_escaped)
return false;
}
if(space.file_name.size() == 0) // [esc]
return false;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "opening wav";
global_polarity = display_prompt_and_echo_bool("is this wav inverted ? : y | [any]");
if(prompt_escaped)
return false;
display_space();
if(!file_exists(LASERBOY_WAV_SHARE + space.file_name))
{
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
if(!space.from_headerless_LB_wav_file(LASERBOY_WAV_SHARE + space.file_name, global_polarity, append))
{
if(space.frame_set_error & LASERBOY_LB_WAV_FORMAT_ERROR)
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " channel count mismatch " + space.wav_channel_map);
else
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
space.clean_screen();
space.render_space();
space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.file_name);
display_space();
wait_4_any_key();
}
space.TUI_clue = LASERBOY_WAV_SHARE + space.file_name;
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::wav_qm_open_menu(bool append)
{
space.get_file_list(LASERBOY_UNFORMATTED_SHARE, ".wav");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
display_space();
prompt_escaped = false;
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name");
if(prompt_escaped)
return false;
}
if(space.file_name.size() == 0) // [esc]
return false;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "opening wav";
bool global_polarity = display_prompt_and_echo_bool("is this wav inverted ? : y | [any]");
if(prompt_escaped)
return false;
display_space();
if(!file_exists(LASERBOY_UNFORMATTED_SHARE + space.file_name))
{
space.display_error(LASERBOY_UNFORMATTED_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
if(!space.from_qm_wav_file(LASERBOY_UNFORMATTED_SHARE + space.file_name, global_polarity, append))
{
space.display_error(LASERBOY_UNFORMATTED_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
space.clean_screen();
space.render_space();
space.overlay_wav_header_stats(LASERBOY_UNFORMATTED_SHARE + space.file_name);
display_space();
wait_4_any_key();
}
space.TUI_clue = LASERBOY_UNFORMATTED_SHARE + space.file_name;
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::txt_file_open_menu()
{
bool bad_key = true;
int current_palette_count = space.number_of_palettes(),
new_palette_count,
new_frame_count ;
stringstream strings;
prompt_escaped = false;
space.get_file_list(LASERBOY_TXT_SHARE, ".txt");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("ASCII txt file name");
if(prompt_escaped)
return false;
}
if(space.file_name.size() == 0) // [esc]
return false;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
while(bad_key)
{
space.clean_screen();
space.overlay_in_txt_action_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
space.clean_screen();
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit input txt";
return false;
//----------------------------------------------------------------
case '1': // replace
space.TUI_clue = "txt replace";
display_space();
{
LaserBoy_frame_set current;
current = space; // make a copy
space.from_txt_file(LASERBOY_TXT_SHARE + space.file_name);
new_palette_count = space.number_of_palettes() - current_palette_count;
new_frame_count = space.number_of_frames();
if(space.frame_set_error & LASERBOY_FILE_OPEN_FAILED) // open failed
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
if(space.number_of_frames() == 0) // no frames in txt file
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " no frames found"
);
space = current;
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_TXT_SYNTAX_ERROR) // syntax error in txt
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " syntax error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_TXT_PALETTE_FAILED) // palette name error
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_COLOR_VERTEX_MISSMATCH) // color table vertex mismatch
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " color table vertex mismatch (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_PALETTE_NAME_IN_USE)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name in use (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_TXT_PALETTE_NAME_TOO_LONG)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " more than 8 characters in palette name (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(new_palette_count)
{
strings << new_palette_count
<< " palette"
<< ( (new_palette_count == 1)
? (" ")
: ("s ")
);
}
if(new_frame_count)
{
strings << new_frame_count
<< " frame"
<< ( (new_frame_count == 1)
? (" ")
: ("s ")
);
}
if(new_palette_count || new_frame_count)
{
strings << "found in "
<< LASERBOY_TXT_SHARE
<< space.file_name;
space.display_message(strings.str());
wait_4_any_key();
}
} // end else (file open did not fail)
}
space.TUI_clue = LASERBOY_TXT_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // prepend
space.TUI_clue = "txt prepend";
display_space();
{ // scope
LaserBoy_frame_set insert;
insert.from_txt_file(LASERBOY_TXT_SHARE + space.file_name);
new_frame_count = insert.number_of_frames();
new_palette_count = space.number_of_palettes() - current_palette_count;
if(insert.frame_set_error & LASERBOY_FILE_OPEN_FAILED) // open failed
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
if(insert.number_of_frames() == 0) // no frames in txt file
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " no frames found"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_TXT_SYNTAX_ERROR) // word error in txt
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " format error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_TXT_PALETTE_FAILED) // palette name error
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_COLOR_VERTEX_MISSMATCH) // color table vertex mismatch
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " color table vertex mismatch (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_PALETTE_NAME_IN_USE)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name in use (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_TXT_PALETTE_NAME_TOO_LONG)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " more than 8 characters in palette name (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(new_palette_count)
{
strings << new_palette_count
<< " palette"
<< ( (new_palette_count == 1)
? (" ")
: ("s ")
);
}
if(new_frame_count)
{
insert += space;
space = insert;
strings << new_frame_count
<< " frame"
<< ( (new_frame_count == 1)
? (" ")
: ("s ")
);
}
if(new_palette_count || new_frame_count)
{
strings << "found in "
<< LASERBOY_TXT_SHARE
<< space.file_name;
space.display_message(strings.str());
wait_4_any_key();
}
}
}
space.TUI_clue = LASERBOY_TXT_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // insert
space.TUI_clue = "txt insert";
display_space();
{ // scope
u_int i;
LaserBoy_frame_set insert,
result;
insert.from_txt_file(LASERBOY_TXT_SHARE + space.file_name);
new_palette_count = space.number_of_palettes() - current_palette_count;
new_frame_count = insert.number_of_frames();
if(insert.frame_set_error & LASERBOY_FILE_OPEN_FAILED) // open failed
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
if(insert.number_of_frames() == 0) // no frames in txt file
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " no frames found"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_TXT_SYNTAX_ERROR) // word error in txt
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " format error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_TXT_PALETTE_FAILED) // palette name error
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_COLOR_VERTEX_MISSMATCH) // color table vertex mismatch
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " color table vertex mismatch (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_PALETTE_NAME_IN_USE)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name in use (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_TXT_PALETTE_NAME_TOO_LONG)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " more than 8 characters in palette name (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(new_palette_count)
{
strings << new_palette_count
<< " palette"
<< ( (new_palette_count == 1)
? (" ")
: ("s ")
);
}
if(new_frame_count)
{
for(i = 0; i <= space.frame_index; i++)
result += space[i];
for(i = 0; i < insert.number_of_frames(); i++)
result += insert[i];
for(i = space.frame_index + 1; i < space.number_of_frames(); i++)
result += space[i];
space = result;
strings << new_frame_count
<< " frame"
<< ( (new_frame_count == 1)
? (" ")
: ("s ")
);
}
if(new_palette_count || new_frame_count)
{
strings << "found in "
<< LASERBOY_TXT_SHARE
<< space.file_name;
space.display_message(strings.str());
wait_4_any_key();
}
} // end else (file opened)
} // end scope
space.TUI_clue = LASERBOY_TXT_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '4': // append
space.TUI_clue = "txt append";
display_space();
{ // scope
u_int i;
LaserBoy_frame_set insert,
result;
insert.from_txt_file(LASERBOY_TXT_SHARE + space.file_name);
new_palette_count = space.number_of_palettes() - current_palette_count;
new_frame_count = insert.number_of_frames();
if(insert.frame_set_error & LASERBOY_FILE_OPEN_FAILED) // open failed
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
if(insert.number_of_frames() == 0) // no frames in txt file
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " no frames found"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_TXT_SYNTAX_ERROR) // word error in txt
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " format error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_TXT_PALETTE_FAILED) // palette name error
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_COLOR_VERTEX_MISSMATCH) // color table vertex mismatch
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " color table vertex mismatch (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_PALETTE_NAME_IN_USE)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name in use (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(insert.frame_set_error & LASERBOY_TXT_PALETTE_NAME_TOO_LONG)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " more than 8 characters in palette name (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(new_palette_count)
{
strings << new_palette_count
<< " palette"
<< ( (new_palette_count == 1)
? (" ")
: ("s ")
);
}
if(new_frame_count)
{
for(i = 0; i < space.number_of_frames(); i++)
result += space[i];
for(i = 0; i < insert.number_of_frames(); i++)
result += insert[i];
space = result;
strings << new_frame_count
<< " frame"
<< ( (new_frame_count == 1)
? (" ")
: ("s ")
);
}
if(new_palette_count || new_frame_count)
{
strings << "found in "
<< LASERBOY_TXT_SHARE
<< space.file_name;
space.display_message(strings.str());
wait_4_any_key();
}
} // end else (file opened)
} // end scope
space.TUI_clue = LASERBOY_TXT_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '5': // superimpose
space.TUI_clue = "txt superimpose";
display_space();
space.superimpose_from_txt_file(LASERBOY_TXT_SHARE + space.file_name, new_frame_count, new_palette_count);
if(space.frame_set_error & LASERBOY_FILE_OPEN_FAILED) // open failed
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
if(new_frame_count == 0) // no frames in txt file
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " no frames found"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_TXT_SYNTAX_ERROR) // word error in txt
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " format error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_TXT_PALETTE_FAILED) // palette name error
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_COLOR_VERTEX_MISSMATCH) // color table vertex mismatch
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " color table vertex mismatch (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_PALETTE_NAME_IN_USE)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name in use (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_TXT_PALETTE_NAME_TOO_LONG)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " more than 8 characters in palette name (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(new_palette_count)
{
strings << new_palette_count
<< " palette"
<< ( (new_palette_count == 1)
? (" ")
: ("s ")
);
}
if(new_frame_count)
{
strings << new_frame_count
<< " frame"
<< ( (new_frame_count == 1)
? (" ")
: ("s ")
);
}
if(new_palette_count || new_frame_count)
{
strings << "found in "
<< LASERBOY_TXT_SHARE
<< space.file_name;
space.display_message(strings.str());
wait_4_any_key();
}
} // end else (file opened)
space.TUI_clue = LASERBOY_TXT_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '6': // superimpose
space.TUI_clue = "txt palettes only";
display_space();
space.palettes_from_txt_file(LASERBOY_TXT_SHARE + space.file_name);
new_palette_count = space.number_of_palettes() - current_palette_count;
if(space.palette_set_error & LASERBOY_FILE_OPEN_FAILED) // open failed
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to open");
wait_4_Esc();
return false;
}
else
{
if(space.palette_set_error & LASERBOY_TXT_SYNTAX_ERROR) // word error in txt
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " format error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.palette_set_error & LASERBOY_TXT_PALETTE_FAILED) // palette name error
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name error (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.palette_set_error & LASERBOY_PALETTE_NAME_IN_USE)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " palette name in use (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(space.frame_set_error & LASERBOY_TXT_PALETTE_NAME_TOO_LONG)
{
space.display_error( LASERBOY_TXT_SHARE
+ space.file_name
+ " more than 8 characters in palette name (see txt_in_errors.txt)"
);
wait_4_Esc();
}
if(new_palette_count)
{
strings << new_palette_count
<< " palette"
<< ( (new_palette_count == 1)
? (" ")
: ("s ")
);
strings << "found in "
<< LASERBOY_TXT_SHARE
<< space.file_name;
space.display_message(strings.str());
wait_4_any_key();
}
} // end else (file opened)
space.TUI_clue = LASERBOY_TXT_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
}
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::ctn_file_open_menu()
{
bool bad_key = true;
space.get_file_list(LASERBOY_CTN_SHARE, ".ctn");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
prompt_escaped = false;
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("ctn file name");
if(prompt_escaped)
return false;
}
if(space.file_name.size() == 0) // [esc]
return false;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".ctn";
while(bad_key)
{
space.clean_screen();
space.overlay_in_ctn_action_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit input ctn";
return false;
//----------------------------------------------------------------
case '1': // replace
space.TUI_clue = "ctn replace";
space.clean_screen();
display_space();
{ // scope
LaserBoy_frame_set frame_set;
if(!space.report_ctn_file_open(frame_set, space.file_name))
return false;
space.frame_index = 0;
space = frame_set;
} // end scope
space.TUI_clue = LASERBOY_CTN_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // prepend
space.TUI_clue = "ctn prepend";
space.clean_screen();
display_space();
{ // scope
LaserBoy_frame_set frame_set;
if(!space.report_ctn_file_open(frame_set, space.file_name))
return false;
space.frame_index = 0;
frame_set += space;
space = frame_set;
}
space.TUI_clue = LASERBOY_CTN_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // insert
space.TUI_clue = "ctn insert";
space.clean_screen();
display_space();
{ // scope
u_int i;
LaserBoy_frame_set frame_set,
result;
if(!space.report_ctn_file_open(frame_set, space.file_name))
return false;
for(i = 0; i <= space.frame_index; i++)
result += space[i];
for(i = 0; i < frame_set.number_of_frames(); i++)
result += frame_set[i];
for(i = space.frame_index + 1; i < space.number_of_frames(); i++)
result += space[i];
space.frame_index = 0;
space = result;
}
space.TUI_clue = LASERBOY_CTN_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '4': // append
space.TUI_clue = "ctn append";
space.clean_screen();
display_space();
{
LaserBoy_frame_set frame_set;
if(!space.report_ctn_file_open(frame_set, space.file_name))
return false;
space.frame_index = 0;
space += frame_set;
}
space.TUI_clue = LASERBOY_CTN_SHARE + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '5': // superimpose
space.TUI_clue = "ctn superimpose";
space.clean_screen();
display_space();
{
LaserBoy_frame_set frame_set;
if(!space.report_ctn_file_open(frame_set, space.file_name))
return false;
space.frame_index = 0;
space.superimpose_frame_set(frame_set);
}
space.TUI_clue = LASERBOY_CTN_SHARE + space.file_name;
bad_key = false;
break;
} // end switch(event.key.keysym.unicode)
//----------------------------------------------------------------
} // end while(bad_key)
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::bmp_file_open_menu()
{
bool bad_key = true;
prompt_escaped = false;
space.get_file_list(LASERBOY_BMP_SHARE, ".bmp");
while(bad_key)
{
space.clean_screen();
space.overlay_in_bmp_action_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit input bmp";
return false;
//----------------------------------------------------------------
case '1': // open as frame color map
space.clean_screen();
space.file_name.clear();
space.get_file_list(LASERBOY_BMP_SHARE, ".bmp");
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("bitmap file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".bmp";
space.TUI_clue = "loading " + space.file_name;
display_space();
if(space.current_frame().color_from_bmp(LASERBOY_BMP_SHARE + space.file_name) != LASERBOY_OK)
{
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = "color map " + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // open as frame_set color map
space.clean_screen();
space.file_name.clear();
space.get_file_list(LASERBOY_BMP_SHARE, ".bmp");
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("bitmap file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".bmp";
space.TUI_clue = "loading " + space.file_name;
display_space();
if(space.color_from_bmp(LASERBOY_BMP_SHARE + space.file_name) != LASERBOY_OK)
{
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = "color map all " + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // load bmp directory as map
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_BMP_SHARE);
space.overlay_subdirectory_list();
while(!space.subdirectory_selected())
{
display_prompt_dir_with_auto_complete("bmp directory name");
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
}
if(space.working_subdirectory.size() == 0)
break;
space.get_file_list(LASERBOY_BMP_SHARE + space.working_subdirectory + '/', ".bmp");
if(space.working_directory_list.size() == 0)
{
space.display_error(LASERBOY_BMP_SHARE + space.working_subdirectory + "/ has no files");
wait_4_Esc();
break;
}
space.bmp_file_list = space.working_directory_list;
space.bmp_file_index = 0;
display_space();
if(space.number_of_frames() >= space.bmp_file_list.size())
{
for(size_t i = 0; i < space.number_of_frames(); i++)
space.frame_picker(i).color_from_bmp(space.bmp_file_list[i % space.bmp_file_list.size()].path().string());
}
else
{
LaserBoy_frame_set fs;
for(size_t i = 0; i < space.bmp_file_list.size(); i++)
{
fs += space.frame_picker(i % space.number_of_frames());
fs.back().color_from_bmp(space.bmp_file_list[i].path().string());
}
space = fs;
}
space.working_subdirectory = subdirectory_copy;
bad_key = false;
}
break;
//----------------------------------------------------------------
case '4': // open as frame mask
space.clean_screen();
space.file_name.clear();
space.get_file_list(LASERBOY_BMP_SHARE, ".bmp");
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("bitmap file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".bmp";
space.TUI_clue = "loading " + space.file_name;
display_space();
if(space.current_frame().subtract_bmp(LASERBOY_BMP_SHARE + space.file_name) != LASERBOY_OK)
{
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = "frame - " + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '5': // open as frame_set mask
space.clean_screen();
space.file_name.clear();
space.get_file_list(LASERBOY_BMP_SHARE, ".bmp");
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("bitmap file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".bmp";
space.TUI_clue = "loading " + space.file_name;
display_space();
if(space.subtract_bmp(LASERBOY_BMP_SHARE + space.file_name) != LASERBOY_OK)
{
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = "subtract bmp all";
bad_key = false;
break;
//----------------------------------------------------------------
case '6': // load bmp directory as mask
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_BMP_SHARE);
space.overlay_subdirectory_list();
while(!space.subdirectory_selected())
{
display_prompt_dir_with_auto_complete("bmp directory name");
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
}
if(space.working_subdirectory.size() == 0)
break;
space.get_file_list(LASERBOY_BMP_SHARE + space.working_subdirectory + '/', ".bmp");
if(space.working_directory_list.size() == 0)
{
space.display_error(LASERBOY_BMP_SHARE + space.working_subdirectory + "/ has no files");
wait_4_Esc();
break;
}
space.bmp_file_list = space.working_directory_list;
space.bmp_file_index = 0;
display_space();
if(space.number_of_frames() >= space.bmp_file_list.size())
{
for(size_t i = 0; i < space.number_of_frames(); i++)
space.frame_picker(i).subtract_bmp(space.bmp_file_list[i % space.bmp_file_list.size()].path().string());
}
else
{
LaserBoy_frame_set fs;
for(size_t i = 0; i < space.bmp_file_list.size(); i++)
{
fs += space.frame_picker(i % space.number_of_frames());
fs.back().subtract_bmp(space.bmp_file_list[i].path().string());
}
space = fs;
}
space.working_subdirectory = subdirectory_copy;
bad_key = false;
}
break;
//----------------------------------------------------------------
case '7': // open bmp palette into palette_set
space.clean_screen();
space.file_name.clear();
space.get_file_list(LASERBOY_BMP_SHARE, ".bmp");
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("bitmap file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".bmp";
space.TUI_clue = "loading " + space.file_name;
display_space();
switch(space.copy_palette_from_bmp(LASERBOY_BMP_SHARE + space.file_name, space.file_name.substr(0, space.file_name.size() - 4)))
{
default:
case LASERBOY_FILE_OPEN_FAILED:
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
case LASERBOY_PALETTE_ALREADY_DEFINED:
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " has already been loaded into the palette set");
wait_4_Esc();
break;
case LASERBOY_NO_PALETTES_FOUND:
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " is not a palette bmp");
wait_4_Esc();
break;
case LASERBOY_OK:
space.TUI_clue = "bmp palette" + space.file_name;
break;
}
bad_key = false;
break;
//----------------------------------------------------------------
case '8': // open as background
{
bool scale_to_screen = false;
space.clean_screen();
space.file_name.clear();
space.get_file_list(LASERBOY_BMP_SHARE, ".bmp");
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("bitmap file name");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".bmp";
space.TUI_clue = "loading " + space.file_name;
display_space();
scale_to_screen = display_prompt_and_echo_bool("scale bitmap to fit display? : (y | [any])");
if(!scale_to_screen)
space.background_bmp_scale = 1.00;
if(!space.load_background_bitmap(LASERBOY_BMP_SHARE + space.file_name,
scale_to_screen
)
)
{
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
}
}
space.TUI_clue = "background " + space.file_name;
bad_key = false;
break;
//----------------------------------------------------------------
case '9': // load bmp directory
{ // scope
bool scale_to_screen = false;
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_BMP_SHARE);
space.overlay_subdirectory_list();
while(!space.subdirectory_selected())
{
display_prompt_dir_with_auto_complete("bmp directory name");
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
}
if(space.working_subdirectory.size() == 0)
break;
space.get_file_list(LASERBOY_BMP_SHARE + space.working_subdirectory + '/', ".bmp");
if(space.working_directory_list.size() == 0)
{
space.display_error(LASERBOY_BMP_SHARE + space.working_subdirectory + "/ has no files");
wait_4_Esc();
break;
}
space.bmp_file_list = space.working_directory_list;
space.bmp_file_index = 0;
space.file_name = space.bmp_file_list.front().path().filename().string();
space.TUI_clue = "loading " + space.file_name;
display_space();
scale_to_screen = display_prompt_and_echo_bool("scale bitmap to fit display? : (y | [any])");
if(!scale_to_screen)
space.background_bmp_scale = 1.00;
if(!space.load_background_bitmap(space.bmp_file_list.front().path().string(),
scale_to_screen
)
)
{
space.display_error(space.bmp_file_list.front().path().string() + " failed to open");
wait_4_Esc();
break;
}
space.working_subdirectory = subdirectory_copy;
bad_key = false;
}
break;
//----------------------------------------------------------------
case '0': // clear background
space.bmp_file_list.clear();
space.bmp_file_index = -1;
space.clear_background_bitmap();
space.background_bmp_scale = 1.00;
space.TUI_clue = "clear background";
bad_key = false;
break;
//----------------------------------------------------------------
case 'a': // display bmp directory
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_BMP_SHARE);
space.overlay_subdirectory_list();
while(!space.subdirectory_selected())
{
display_prompt_dir_with_auto_complete("bmp directory name");
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
}
if(space.working_subdirectory.size() == 0)
break;
space.TUI_clue = "bmp display " + space.working_subdirectory;
display_space();
bool scale_to_screen = display_prompt_and_echo_bool("scale bmp files to screen ? : (y) | [any]");
space.clean_screen();
if(!display_bmp_directory(LASERBOY_BMP_SHARE + space.working_subdirectory, scale_to_screen))
{
space.display_error(LASERBOY_DXF_SHARE + space.working_subdirectory + "/ failed to open");
wait_4_Esc();
break;
}
space.TUI_clue = "end bmp display " + space.working_subdirectory;
space.working_subdirectory = subdirectory_copy;
bad_key = false;
}
break;
}
}
return true;
}
//############################################################################
void LaserBoy_SDL_GUI::save_as_file_menu()
{
bool bad_key = true;
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.render_space();
space.overlay_out_file_type_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit output file";
bad_key = false;
break;
//----------------------------------------------------------------
case '1':
space.current_menu_name = "save as ild";
if(ild_out_cd_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '2':
space.current_menu_name = "save as dxf";
if(save_as_dxf_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '3':
space.current_menu_name = "save as wav";
if(save_as_wav_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '4':
space.current_menu_name = "save as txt";
if(save_as_txt_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '5':
space.current_menu_name = "save as ctn";
if(save_as_ctn_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '6':
space.current_menu_name = "save as bmp";
if(save_as_bmp_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '7':
space.get_file_list(LASERBOY_WTF_SHARE, ".wtf");
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wtf file name [LaserBoy.wtf]", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = "LaserBoy.wtf";
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wtf";
if( file_exists(LASERBOY_WTF_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_WTF_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_wtf_file(LASERBOY_WTF_SHARE + space.file_name))
{
space.display_error(LASERBOY_WTF_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "wtf saved";
bad_key = false;
break;
//----------------------------------------------------------------
case '8':
{ // scope
space.current_menu_name = "save utf8";
space.get_file_list(LASERBOY_UTF8_SHARE, ".utf8");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new utf8 file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 6 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".utf8";
if( file_exists(LASERBOY_UTF8_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_UTF8_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
string report;
if(!space.save_utf8_frame_index(LASERBOY_UTF8_SHARE + space.file_name, report))
{
if(space.frame_set_error & LASERBOY_INVALID_UNICODE)
{
if(!display_prompt_and_echo_bool("use ffffffff for non unicode named frames ? : y | [any]"))
{
space.display_error(space.file_name.substr(0, space.file_name.size() - 4) + ".utf8 not saved!");
wait_4_Esc();
break;
}
else if(!space.save_utf8_frame_index(LASERBOY_UTF8_SHARE + space.file_name, report, true))
{
space.display_error(string("no unicode names found. ") + space.file_name.substr(0, space.file_name.size() - 4) + ".utf8 not saved!");
wait_4_Esc();
break;
}
}
else if(space.frame_set_error & LASERBOY_REDUNDANT_UNICODE)
{
if(!display_prompt_and_echo_bool("save unicode with redundant named frames ? : y | [any]"))
{
space.display_error(space.file_name.substr(0, space.file_name.size() - 4) + ".utf8 not saved!");
wait_4_Esc();
break;
}
else if(!space.save_utf8_frame_index(LASERBOY_UTF8_SHARE + space.file_name, report, true))
{
space.display_error(string("no unicode names found. ") + space.file_name.substr(0, space.file_name.size() - 4) + ".utf8 not saved!");
wait_4_Esc();
break;
}
}
else
{
space.display_error(report);
wait_4_Esc();
break;
}
} // end if(!space.save_utf8_frame_index(LASERBOY_UTF8_SHARE + space.file_name, report))
}
space.TUI_clue = "utf8 saved";
bad_key = false;
}
break;
} // end switch(event.key.keysym.unicode)
}
return;
}
//############################################################################
bool LaserBoy_SDL_GUI::ild_out_cd_menu()
{
bool bad_key = true;
prompt_escaped = false;
space.clean_screen();
while(bad_key)
{
space.clean_screen();
space.get_subdirectory_list(LASERBOY_ILD_SHARE); // folders from ./ild/
if(!space.subdirectory_selected())
space.working_subdirectory.clear();
space.overlay_ild_out_cd_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit output ild";
return false;
//----------------------------------------------------------------
case '1': // stay in current ild directory
space.TUI_clue = "save ild";
if(save_as_ild_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // go to root ild directory
space.clean_screen();
space.working_subdirectory.clear();
space.overlay_subdirectory_list();
space.TUI_clue = "ild cd root" + LASERBOY_ILD_SHARE + space.working_subdirectory;
if(save_as_ild_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // change current ild directory
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_ILD_SHARE); // folders from ./ild/
space.overlay_subdirectory_list();
while(!space.subdirectory_selected())
{
display_prompt_dir_with_auto_complete("cd to ild directory name");
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
}
if(space.working_subdirectory.size()) // not zero
space.working_subdirectory += "/";
else
break;
}
space.TUI_clue = "ild cd " + LASERBOY_ILD_SHARE + space.working_subdirectory;
if(save_as_ild_menu())
bad_key = false;
break;
//----------------------------------------------------------------
case '4': // create new ild directory
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_ILD_SHARE); // folders from ./ild/
space.overlay_subdirectory_list();
space.working_subdirectory = display_prompt_and_echo_name("new ild directory name", 64);
if(prompt_escaped || space.working_subdirectory.size() == 0)
{
space.working_subdirectory = subdirectory_copy;
break;
}
else
space.working_subdirectory += "/";
if(!directory_exists(LASERBOY_ILD_SHARE + space.working_subdirectory, space.absolute_path_of_LaserBoy))
{
#if defined __MINGW_LASERBOY__
mkdir((LASERBOY_ILD_SHARE + space.working_subdirectory).c_str());
#else
mkdir((LASERBOY_ILD_SHARE + space.working_subdirectory).c_str(), 0777);
#endif
if(save_as_ild_menu())
bad_key = false;
}
else
{
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + " already exists!");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
}
}
break;
//----------------------------------------------------------------
case '5': // split frame_set into new directory
{ // scope
bool temp_save_as_4_5 = false;
LaserBoy_ild_header_count counter;
if(!space.save_ild_fmt_4_5 && space.true_color_frames())
{
if(!display_prompt_and_echo_bool("save ild files with format-3 ? : y | [any]"))
{
if(display_prompt_and_echo_bool("save ild files as format-4 or 5 ? : y | [any]"))
{
space.save_ild_fmt_4_5 = true;
temp_save_as_4_5 = true;
}
else
{
space.display_message("NO ild file saved! see menu x option h");
wait_4_any_key();
break;
}
}
}
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_ILD_SHARE); // folders from ./ild/
space.overlay_subdirectory_list();
if( space.number_of_selected_frames() > 1
|| ( space.number_of_selected_frames() > 0
&& !space.frame_picker(0).is_selected
)
) // enough is selected
{
space.working_subdirectory = display_prompt_and_echo_name("new ild directory name", 64);
if(prompt_escaped || space.working_subdirectory.size() == 0)
{
space.working_subdirectory = subdirectory_copy;
break;
}
if(!directory_exists(LASERBOY_ILD_SHARE + space.working_subdirectory, space.absolute_path_of_LaserBoy))
{
#if defined __MINGW_LASERBOY__
mkdir((LASERBOY_ILD_SHARE + space.working_subdirectory).c_str());
#else
mkdir((LASERBOY_ILD_SHARE + space.working_subdirectory).c_str(), 0777);
#endif
{ // scope
u_int i,
j;
vector selected_frames_index;
LaserBoy_frame_set out;
char number[12];
//------------------------------------------------
selected_frames_index.push_back(0); // selected or not
for(i = 1; i < space.number_of_frames(); i++)
{
if(space.frame_picker(i).is_selected)
selected_frames_index.push_back(i);
}
//------------------------------------------------
for(i = 0; i < selected_frames_index.size() - 1; i++)
{
for(j = selected_frames_index[i]; j < selected_frames_index[i + 1]; j++)
out += space.frame_picker(j);
sprintf(number, "%05d", (int)i);
out.save_as_ild(LASERBOY_ILD_SHARE + space.working_subdirectory + string("/") + space.working_subdirectory + string("_") + number + string(".ild"), counter);
out.clear();
}
//------------------------------------------------
if(selected_frames_index[i] == (space.number_of_frames() - 1)) // last frame is selected
{
out = space.frame_picker(selected_frames_index[i]);
}
else
{
for(j = selected_frames_index[i]; j < space.number_of_frames(); j++)
out += space.frame_picker(j);
}
sprintf(number, "%05d", (int)i);
out.save_as_ild(LASERBOY_ILD_SHARE + space.working_subdirectory + string("/") + space.working_subdirectory + string("_") + number + string(".ild"), counter);
out.clear();
space.working_subdirectory += "/";
bad_key = false;
space.display_ild_file_stats(counter);
wait_4_Esc();
} // end scope
} // end if(!directory_exists(LASERBOY_ILD_SHARE + space.working_subdirectory, space.absolute_path_of_LaserBoy))
else
{
space.working_subdirectory += "/";
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + " already exists!");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
}
} // end if enough is selected
else
{
space.display_error("Not enough frames selected for split!");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
}
if(temp_save_as_4_5)
space.save_ild_fmt_4_5 = false;
}
break;
//----------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
//----------------------------------------------------------------
} // end while(bad_key)
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::save_as_ild_menu()
{
bool bad_key = true,
temp_save_as_4_5 = false;
LaserBoy_ild_header_count counter;
string last_ild_file = space.last_ild_file_name.substr( LASERBOY_ILD_SHARE.size()
+ space.working_subdirectory.size()
);
prompt_escaped = false;
space.get_file_list(LASERBOY_ILD_SHARE + space.working_subdirectory, ".ild");
while(bad_key)
{
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.overlay_out_ild_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit output ild";
return false;
//----------------------------------------------------------------
case '1': // save current frame
if(space.current_frame().size() > LASERBOY_MAX_SHORT)
{
space.display_error("Too many vertices, cannot be saved as ild!");
wait_4_Esc();
space.clean_screen();
if(display_prompt_and_echo_bool("save as unoptomized LaserBoy wav (one frame) ? : y | [any]"))
{
space.clean_screen();
space.render_space();
space.file_name.clear();
space.get_file_list(LASERBOY_WAV_SHARE, ".wav");
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(LASERBOY_WAV_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.current_frame().save_as_wav(LASERBOY_WAV_SHARE + space.file_name, false, false, false))
{
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.file_name))
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
}
bad_key = false;
break;
} // end if(space.current_frame().size() > LASERBOY_MAX_SHORT)
else
{
space.current_frame().sync_rgb_and_palette();
if(!space.save_ild_fmt_4_5 && space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
if(!display_prompt_and_echo_bool("save ild file containing format-3 ? : y | [any]"))
{
if(display_prompt_and_echo_bool("save ild file as format-4 or 5 ? : y | [any]"))
{
space.save_ild_fmt_4_5 = true;
temp_save_as_4_5 = true;
}
else
{
space.display_message("NO ild file saved! see menu x option h");
wait_4_any_key();
break;
}
}
}
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
if(space.last_ild_file_name.size())
space.file_name = display_prompt_and_echo_name("new ild file name [" + last_ild_file + "]", 64);
else
space.file_name = display_prompt_and_echo_name("new ild file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
{
if(last_ild_file.size())
space.file_name = last_ild_file;
else
break;
}
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".ild";
space.TUI_clue = "saving " + space.file_name;
display_space();
if( file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool(space.file_name + " exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
space.display_please_wait();
if(!space.current_frame().save_as_ild(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name, counter))
{
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "ild saved";
if(temp_save_as_4_5)
space.save_ild_fmt_4_5 = false;
bad_key = false;
space.display_ild_file_stats(counter);
wait_4_Esc();
break;
}
//----------------------------------------------------------------
case '2': // save selected frames
if(space.number_of_selected_frames()) // something is selected
{
if(space.selected_frames().is_ild_busted())
{
space.display_error("Too many vertices, cannot be saved as ild!");
wait_4_Esc();
space.clean_screen();
if(display_prompt_and_echo_bool("save as unoptomized LaserBoy wav each frame once ? : y | [any]"))
{
space.get_file_list(LASERBOY_WAV_SHARE, ".wav");
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(LASERBOY_WAV_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.selected_frames().save_as_wav(LASERBOY_WAV_SHARE + space.file_name, false, false))
{
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.file_name))
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
}
bad_key = false;
break;
}
else
{
if(!space.save_ild_fmt_4_5 && space.selected_frames().true_color_frames())
{
if(!display_prompt_and_echo_bool("save ild file containing format-3 ? : y | [any]"))
{
if(display_prompt_and_echo_bool("save ild file as format-4 or 5 ? : y | [any]"))
{
space.save_ild_fmt_4_5 = true;
temp_save_as_4_5 = true;
}
else
{
space.display_message("NO ild file saved! see menu x option h");
wait_4_any_key();
break;
}
}
}
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
if(space.last_ild_file_name.size())
space.file_name = display_prompt_and_echo_name("new ild file name [" + last_ild_file + "]", 64);
else
space.file_name = display_prompt_and_echo_name("new ild file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
{
if(last_ild_file.size())
space.file_name = last_ild_file;
else
break;
}
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".ild";
space.TUI_clue = "saving selected " + space.file_name;
display_space();
if( file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool(space.file_name + " exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
space.display_please_wait();
if(!space.selected_frames().save_as_ild(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name, counter))
{
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "selected ild saved";
bad_key = false;
space.display_ild_file_stats(counter);
wait_4_Esc();
}
}
else
{
space.display_error("no frames selected to save!");
space.file_name.clear();
wait_4_Esc();
}
if(temp_save_as_4_5)
space.save_ild_fmt_4_5 = false;
break;
//----------------------------------------------------------------
case '3': // save all frames
if(space.is_ild_busted())
{
space.display_error("Too many vertices, cannot be saved as ild!");
wait_4_Esc();
space.clean_screen();
if(display_prompt_and_echo_bool("save as unoptomized LaserBoy wav each frame once ? : y | [any]"))
{
space.get_file_list(LASERBOY_WAV_SHARE, ".wav");
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(LASERBOY_WAV_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_as_wav(LASERBOY_WAV_SHARE + space.file_name, false, false))
{
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.file_name))
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
}
bad_key = false;
break;
} // end if(space.is_ild_busted())
else
{
if(!space.save_ild_fmt_4_5 && space.true_color_frames())
{
if(!display_prompt_and_echo_bool("save ild file containing format-3 ? : y | [any]"))
{
if(display_prompt_and_echo_bool("save ild file as format-4 or 5 ? : y | [any]"))
{
space.save_ild_fmt_4_5 = true;
temp_save_as_4_5 = true;
}
else
{
space.display_message("NO ild file saved! see menu x option h");
wait_4_any_key();
break;
}
}
} // end if(!space.save_ild_fmt_4_5 && space.true_color_frames())
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
if(space.last_ild_file_name.size())
space.file_name = display_prompt_and_echo_name("new ild file name [" + last_ild_file + "]", 64);
else
space.file_name = display_prompt_and_echo_name("new ild file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
{
if(last_ild_file.size())
space.file_name = last_ild_file;
else
break;
}
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".ild";
space.TUI_clue = "saving " + space.file_name;
display_space();
if( file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool(space.file_name + " exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
space.display_please_wait();
if(!space.save_as_ild(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name, counter))
{
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "ild saved";
if(temp_save_as_4_5)
space.save_ild_fmt_4_5 = false;
space.display_ild_file_stats(counter);
wait_4_Esc();
bad_key = false;
break;
}
//----------------------------------------------------------------
case '4': // generate and save frame effect
space.clean_screen();
space.effect_name.clear();
space.overlay_frame_effects();
while(!space.f_effect_selected())
{
display_prompt_f_effect_with_auto_complete("frame effect name");
if(prompt_escaped)
break;
}
if(space.effect_name.size() == 0)
break;
space.TUI_clue = space.effect_name;
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new ild file name [no name no save] ? ", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = LASERBOY_NO_FILE_SAVED;
display_space();
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& ( space.file_name.size() < 5
|| !iends_with(space.file_name, space.current_extension)
)
)
space.file_name += ".ild";
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
LaserBoy_Bounds out_of_bounds = space.call_frame_effect();
if(out_of_bounds & LASERBOY_BOUNDS_MASK)
{
space.display_error(space.effect_name + " is out of bounds! NO FILE SAVED!");
wait_4_Esc();
break;
}
}
bad_key = false;
break;
//----------------------------------------------------------------
case '5': // generate and save selected frames effect
if(space.number_of_selected_frames())
{
space.clean_screen();
space.effect_name.clear();
space.overlay_selected_frames_effects();
while(!space.sf_effect_selected())
{
display_prompt_sf_effect_with_auto_complete("frame_set effect name");
if(prompt_escaped)
break;
}
if(space.effect_name.size() == 0)
break;
space.TUI_clue = space.effect_name;
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new ild file name [no name no save] ? ", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = LASERBOY_NO_FILE_SAVED;
display_space();
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& ( space.file_name.size() < 5
|| !iends_with(space.file_name, space.current_extension)
)
)
space.file_name += ".ild";
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
LaserBoy_Bounds out_of_bounds = space.call_selected_frames_effect();
if(out_of_bounds & LASERBOY_NOTHING_SELECTED)
{
space.display_error(space.effect_name + " requires selected frames");
wait_4_Esc();
break;
}
if(out_of_bounds & LASERBOY_BOUNDS_MASK)
{
space.display_error(space.effect_name + " is out of bounds! NO FILE SAVED!");
wait_4_Esc();
break;
}
}
bad_key = false;
break;
}
else
{
space.display_error("requires selected frames");
wait_4_Esc();
break;
}
//----------------------------------------------------------------
case '6': // generate and save frame_set effect
space.clean_screen();
space.effect_name.clear();
space.overlay_frame_set_effects();
while(!space.fs_effect_selected())
{
display_prompt_fs_effect_with_auto_complete("frame_set effect name");
if(prompt_escaped)
break;
}
if(space.effect_name.size() == 0)
break;
space.TUI_clue = space.effect_name;
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new ild file name [no name no save] ? ", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = LASERBOY_NO_FILE_SAVED;
display_space();
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& ( space.file_name.size() < 5
|| !iends_with(space.file_name, space.current_extension)
)
)
space.file_name += ".ild";
if( space.file_name != LASERBOY_NO_FILE_SAVED
&& file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
LaserBoy_Bounds out_of_bounds = space.call_frame_set_effect();
if(out_of_bounds & LASERBOY_NOTHING_SELECTED)
{
space.display_error(space.effect_name + " requires selected frames");
wait_4_Esc();
break;
}
if(out_of_bounds & LASERBOY_BOUNDS_MASK)
{
space.display_error(space.effect_name + " is out of bounds! NO FILE SAVED!");
wait_4_Esc();
break;
}
}
bad_key = false;
break;
//----------------------------------------------------------------
case '7': // ild save all frames and font index
if(space.working_subdirectory == "fonts/")
{
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new font name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".ild";
space.TUI_clue = "saving " + space.file_name;
display_space();
if( file_exists(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name)
&& !display_prompt_and_echo_bool(space.file_name + " exists! overwrite ? : y | [any]")
)
{
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
string report;
if(!space.save_utf8_frame_index(LASERBOY_UTF8_SHARE + space.file_name.substr(0, space.file_name.size() - 4) + ".utf8",
report
)
)
{
if(space.frame_set_error & LASERBOY_INVALID_UNICODE) // "is not a unicode name.";
{
space.display_error(report);
wait_4_Esc();
if(!display_prompt_and_echo_bool("skip non unicode named frames ? : y | [any]"))
{
space.display_error(space.file_name.substr(0, space.file_name.size() - 4) + ".utf8 not saved!");
wait_4_Esc();
break;
}
else if(!space.save_utf8_frame_index(LASERBOY_UTF8_SHARE + space.file_name.substr(0, space.file_name.size() - 4) + ".utf8",
report,
true
)
)
{
space.display_error(report);
wait_4_Esc();
break;
}
}
else
{
space.display_error(report);
wait_4_Esc();
break;
}
}
}
space.display_please_wait();
if(!space.save_as_ild(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name, counter))
{
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "font and index saved";
space.display_ild_file_stats(counter);
wait_4_Esc();
bad_key = false;
}
break;
//----------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
}
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::save_as_dxf_menu()
{
bool bad_key = true;
space.TUI_clue = "save dxf";
space.get_file_list(LASERBOY_DXF_SHARE, ".dxf");
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.render_space();
space.overlay_out_dxf_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit output dxf";
return false;
//----------------------------------------------------------------
case '1': // save current frame as DXF file
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new dxf file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".dxf";
space.TUI_clue = "saving dxf";
space.render_space();
display_space();
if( file_exists(LASERBOY_DXF_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_DXF_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.current_frame().save_as_dxf(LASERBOY_DXF_SHARE + space.file_name))
{
space.display_error(LASERBOY_DXF_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "dxf saved";
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // save selected frames as DXF directory
if(space.number_of_selected_frames()) // something is selected
{
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.render_space();
space.get_subdirectory_list(LASERBOY_DXF_SHARE);
space.overlay_subdirectory_list();
space.working_subdirectory = display_prompt_and_echo_name("new dxf directory name", 64);
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
space.TUI_clue = "saving dxf directory";
space.render_space();
display_space();
if(directory_exists(LASERBOY_DXF_SHARE + space.working_subdirectory, space.absolute_path_of_LaserBoy))
{
space.clean_screen();
space.render_space();
space.overlay_subdirectory_list();
space.display_error(LASERBOY_DXF_SHARE + space.working_subdirectory + " exists! can not be overwritten! file(s) NOT saved!");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
break;
}
else
{
if(!space.selected_frames().save_as_dxf_directory(LASERBOY_DXF_SHARE, space.working_subdirectory))
{
space.display_error(LASERBOY_DXF_SHARE + space.working_subdirectory + " failed to save");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
break;
}
space.TUI_clue = "dxf directory saved";
space.working_subdirectory = subdirectory_copy;
}
bad_key = false;
}
else
{
space.display_error("no frames selected to save!");
space.file_name.clear();
wait_4_Esc();
}
break;
//----------------------------------------------------------------
case '3': // save all frames as DXF directory
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.render_space();
space.get_subdirectory_list(LASERBOY_DXF_SHARE);
space.overlay_subdirectory_list();
space.working_subdirectory = display_prompt_and_echo_name("new dxf directory name", 64);
if(prompt_escaped)
{
space.working_subdirectory = subdirectory_copy;
break;
}
space.TUI_clue = "saving dxf";
space.render_space();
display_space();
if(directory_exists(LASERBOY_DXF_SHARE + space.working_subdirectory, space.absolute_path_of_LaserBoy))
{
space.clean_screen();
space.render_space();
space.overlay_subdirectory_list();
space.display_error(LASERBOY_DXF_SHARE + space.working_subdirectory + " exists! can not be overwritten! file(s) NOT saved!");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
break;
}
else
{
if(!space.save_as_dxf_directory(LASERBOY_DXF_SHARE, space.working_subdirectory))
{
space.display_error(LASERBOY_DXF_SHARE + space.working_subdirectory + " failed to save");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
break;
}
}
space.working_subdirectory = subdirectory_copy;
space.TUI_clue = "dxf directory saved";
bad_key = false;
}
break;
} // end switch(event.key.keysym.unicode)
}
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::save_as_wav_menu()
{
bool bad_key = true;
string directory = LASERBOY_WAV_SHARE;
space.TUI_clue = "save as wav";
if( space.wav_channel_map.find('r') == string::npos
&& space.wav_channel_map.find('g') == string::npos
&& space.wav_channel_map.find('b') == string::npos
&& space.wav_channel_map.find('i') == string::npos
)
directory = LASERBOY_UNFORMATTED_SHARE;
else
{
directory += (space.wav_channel_map + string("/"));
replace(directory.begin(), directory.end(), '?', '_');
if(!is_directory(directory))
#if defined __MINGW_LASERBOY__
mkdir(directory.c_str());
#else
mkdir(directory.c_str(), 0777);
#endif
}
space.get_file_list(directory, ".wav");
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.render_space();
space.overlay_out_wav_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit output wav";
return false;
//----------------------------------------------------------------
case '1': // optimized wav of current frame once
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(directory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(directory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.current_frame().save_as_wav(directory + space.file_name, true, false, false))
{
space.display_error(directory + space.file_name + " failed to save");
wait_4_Esc();
break;
}
if(space.auto_apply_offsets && space.have_nonzero_offsets())
space.apply_wav_offsets_prep(directory + space.file_name);
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(directory + space.file_name))
space.display_error(directory + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
bad_key = false;
break;
//----------------------------------------------------------------
case '2': // optimized wav of current frame for duration
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(directory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(directory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.current_frame().save_as_wav(directory + space.file_name, true, true, false))
{
space.display_error(directory + space.file_name + " failed to save");
wait_4_Esc();
break;
}
if(space.auto_apply_offsets && space.have_nonzero_offsets())
space.apply_wav_offsets_prep(directory + space.file_name);
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(directory + space.file_name))
space.display_error(directory + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
bad_key = false;
break;
//----------------------------------------------------------------
case '3': // optimized wav each frame once
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(directory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(directory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_as_wav(directory + space.file_name, true, false))
{
space.display_error(directory + space.file_name + " failed to save");
wait_4_Esc();
break;
}
if(space.auto_apply_offsets && space.have_nonzero_offsets())
space.apply_wav_offsets_prep(directory + space.file_name);
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(directory + space.file_name))
space.display_error(directory + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
bad_key = false;
break;
//----------------------------------------------------------------
case '4': // optimized wav at fps
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(directory + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(directory + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_as_wav(directory + space.file_name, true, true))
{
space.display_error(directory + space.file_name + " failed to save");
wait_4_Esc();
break;
}
if(space.auto_apply_offsets && space.have_nonzero_offsets())
space.apply_wav_offsets_prep(directory + space.file_name);
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(directory + space.file_name))
space.display_error(directory + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
bad_key = false;
break;
//----------------------------------------------------------------
// LASERBOY_CLIPS_SHARE
//----------------------------------------------------------------
case '5': // optimized wav clip of current frame
space.get_file_list(LASERBOY_CLIPS_SHARE, ".wav");
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
{
space.get_file_list(directory, ".wav");
break;
}
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(LASERBOY_CLIPS_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.current_frame().save_as_wav(LASERBOY_CLIPS_SHARE + space.file_name, true, false, true))
{
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(LASERBOY_CLIPS_SHARE + space.file_name))
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
bad_key = false;
break;
//----------------------------------------------------------------
case '6': // unoptimized wav of current frame once
space.get_file_list(LASERBOY_CLIPS_SHARE, ".wav");
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
{
space.get_file_list(directory, ".wav");
break;
}
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(LASERBOY_CLIPS_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.current_frame().save_as_wav(LASERBOY_CLIPS_SHARE + space.file_name, false, false, false))
{
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(LASERBOY_CLIPS_SHARE + space.file_name))
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
bad_key = false;
break;
//----------------------------------------------------------------
case '7': // unoptimized wav current frame for duration
space.get_file_list(LASERBOY_CLIPS_SHARE, ".wav");
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
{
space.get_file_list(directory, ".wav");
break;
}
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(LASERBOY_CLIPS_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.current_frame().save_as_wav(LASERBOY_CLIPS_SHARE + space.file_name, false, true, false))
{
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(LASERBOY_CLIPS_SHARE + space.file_name))
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
bad_key = false;
break;
//----------------------------------------------------------------
case '8': // unoptimized wav all frames once
space.get_file_list(LASERBOY_CLIPS_SHARE, ".wav");
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
{
space.get_file_list(directory, ".wav");
break;
}
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(LASERBOY_CLIPS_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_as_wav(LASERBOY_CLIPS_SHARE + space.file_name, false, false))
{
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(LASERBOY_CLIPS_SHARE + space.file_name))
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
bad_key = false;
break;
//----------------------------------------------------------------
case '9': // unoptimized wav all frames at fps
space.get_file_list(LASERBOY_CLIPS_SHARE, ".wav");
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wav file name", 64);
if(prompt_escaped)
{
space.get_file_list(directory, ".wav");
break;
}
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving wav";
if( file_exists(LASERBOY_CLIPS_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_as_wav(LASERBOY_CLIPS_SHARE + space.file_name, false, true))
{
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "wav saved";
space.clean_screen();
space.render_space();
if(!space.overlay_wav_header_stats(LASERBOY_CLIPS_SHARE + space.file_name))
space.display_error(LASERBOY_CLIPS_SHARE + space.file_name + " failed to open");
else
display_space();
wait_4_Esc();
}
bad_key = false;
break;
//----------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
}
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::save_as_txt_menu()
{
bool bad_key = true;
space.TUI_clue = "save ASCII";
space.get_file_list(LASERBOY_TXT_SHARE, ".txt");
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.render_space();
space.overlay_out_txt_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit output txt";
return false;
//----------------------------------------------------------------
case '1':
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new txt file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.TUI_clue = "saving txt";
if( file_exists(LASERBOY_TXT_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.current_frame().save_as_txt(LASERBOY_TXT_SHARE + space.file_name))
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
space.TUI_clue = "txt saved";
}
bad_key = false;
break;
//----------------------------------------------------------------
case '2':
if(space.number_of_selected_frames())
{
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new txt file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.TUI_clue = "saving txt";
if( file_exists(LASERBOY_TXT_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.selected_frames().save_as_txt(LASERBOY_TXT_SHARE + space.file_name))
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "txt saved";
bad_key = false;
}
else
{
space.display_error("no frames selected to save!");
space.file_name.clear();
wait_4_Esc();
}
break;
//----------------------------------------------------------------
case '3':
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new txt file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.TUI_clue = "saving txt";
if( file_exists(LASERBOY_TXT_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_as_txt(LASERBOY_TXT_SHARE + space.file_name))
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "txt saved";
bad_key = false;
break;
//----------------------------------------------------------------
case '4':
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new palette file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.TUI_clue = "saving txt";
if( file_exists(LASERBOY_TXT_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(space.current_frame().palette_index == LASERBOY_TRUE_COLOR)
{
if(!space.current_frame().save_as_txt_table(LASERBOY_TXT_SHARE + space.file_name))
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
else if(!space.palette_picker(space.current_frame().palette_index).save_as_txt(LASERBOY_TXT_SHARE + space.file_name))
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "txt saved";
bad_key = false;
break;
//----------------------------------------------------------------
case '5':
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new palette file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".txt";
space.TUI_clue = "saving txt";
if( file_exists(LASERBOY_TXT_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.palette_picker(space.target_palette_index).save_as_txt(LASERBOY_TXT_SHARE + space.file_name))
{
space.display_error(LASERBOY_TXT_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "txt saved";
bad_key = false;
break;
//----------------------------------------------------------------
case '6':
{ // scope
double gamma = 0.0;
LaserBoy_Rescale_Error_Code rescale_file_error = LASERBOY_OK;
space.get_file_list(LASERBOY_RESCALE_SHARE, ".txt");
space.clean_screen();
space.file_name.clear();
space.overlay_file_list();
space.overlay_color_rescale_stats(false);
prompt_escaped = false;
while(gamma <= 0.0 && !prompt_escaped)
gamma = display_prompt_and_echo_double("gamma > 0.0 [1.0]", 1.0);
if(prompt_escaped)
break;
if((rescale_file_error = space.save_gamma_index_as_txt(gamma)))
{
space.display_rescale_file_error(rescale_file_error);
wait_4_Esc();
}
else
{
space.display_message(LASERBOY_RESCALE_SHARE + string("gamma_") + to_string(gamma) + ".txt saved successfully");
wait_4_any_key();
break;
}
} // end scope
break;
//----------------------------------------------------------------
case '7':
space.get_file_list(LASERBOY_WAV_SHARE, ".wav");
space.file_name.clear();
space.overlay_file_list();
while(!space.file_selected())
{
display_prompt_file_with_auto_complete("wav file name to save rescales to txt");
if(prompt_escaped)
break;
}
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wav";
space.TUI_clue = "saving txt rescales";
space.clean_screen();
space.render_space();
display_space();
if(space.save_wav_rescales_as_txt(LASERBOY_WAV_SHARE + space.file_name,
LASERBOY_RESCALE_SHARE + space.file_name.substr(0, space.file_name.size() - 4))
)
{
space.TUI_clue = "wav stats";
if(!space.overlay_wav_header_stats(LASERBOY_WAV_SHARE + space.file_name))
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to open");
else
display_space();
}
else
space.display_error(LASERBOY_WAV_SHARE + space.file_name + " failed to open");
wait_4_Esc();
break;
//----------------------------------------------------------------
case '8':
space.get_file_list(LASERBOY_WTF_SHARE, ".wtf");
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new wtf file name [LaserBoy.wtf]", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = "LaserBoy.wtf";
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wtf";
if( file_exists(LASERBOY_WTF_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_WTF_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_wtf_file(LASERBOY_WTF_SHARE + space.file_name))
{
space.display_error(LASERBOY_WTF_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "wtf saved";
bad_key = false;
break;
} // end switch(event.key.keysym.unicode)
}
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::save_as_ctn_menu()
{
bool bad_key = true;
space.get_file_list(LASERBOY_CTN_SHARE, ".ctn");
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.render_space();
space.overlay_out_ctn_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit output ctn";
return false;
//----------------------------------------------------------------
case '1':
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new ctn file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".ctn";
space.TUI_clue = "saving ctn";
display_space();
if( file_exists(LASERBOY_CTN_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_CTN_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.current_frame().save_as_ctn(LASERBOY_CTN_SHARE + space.file_name))
{
space.display_error(LASERBOY_CTN_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "ctn saved";
bad_key = false;
break;
//----------------------------------------------------------------
case '2':
if(space.number_of_selected_frames())
{
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new ctn file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".ctn";
space.TUI_clue = "saving ctn";
display_space();
if( file_exists(LASERBOY_CTN_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_CTN_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.selected_frames().save_as_ctn(LASERBOY_CTN_SHARE + space.file_name))
{
space.display_error(LASERBOY_CTN_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "ctn saved";
bad_key = false;
}
else
{
space.display_error("no frames selected to save!");
space.file_name.clear();
wait_4_Esc();
}
break;
//----------------------------------------------------------------
case '3':
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new ctn file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".ctn";
space.TUI_clue = "saving ctn";
display_space();
if( file_exists(LASERBOY_CTN_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_CTN_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_as_ctn(LASERBOY_CTN_SHARE + space.file_name))
{
space.display_error(LASERBOY_CTN_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.TUI_clue = "ctn saved";
bad_key = false;
break;
} // end switch(event.key.keysym.unicode)
}
return true;
}
//############################################################################
bool LaserBoy_SDL_GUI::save_as_bmp_menu()
{
bool bad_key = true;
space.TUI_clue = "save bmp";
space.get_file_list(LASERBOY_BMP_SHARE, ".bmp");
prompt_escaped = false;
while(bad_key)
{
space.clean_screen();
space.render_space();
space.overlay_out_bmp_menu();
display_space();
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while(event.type != SDL_KEYDOWN);
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
default:
space.TUI_clue = "bad key";
break;
//----------------------------------------------------------------
case SDLK_RSHIFT:
case SDLK_LSHIFT:
space.TUI_clue = "";
break;
//----------------------------------------------------------------
case SDLK_ESCAPE:
space.TUI_clue = "exit output bmp";
return false;
//----------------------------------------------------------------
case '1': // save current frame as bmp file
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new bitmap file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".bmp";
space.TUI_clue = "saving bitmap";
if( file_exists(LASERBOY_BMP_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
remove(LASERBOY_BMP_SHARE + space.file_name);
space.current_frame().save_as_bmp(LASERBOY_BMP_SHARE + space.file_name);
space.TUI_clue = "bitmap saved";
bad_key = false;
break;
}
//----------------------------------------------------------------
case '2': // save selected frames as directory of bmp
if(space.number_of_selected_frames())
{
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_BMP_SHARE); // folders from ./ild/
space.overlay_subdirectory_list();
space.working_subdirectory = display_prompt_and_echo_name("new bitmap directory name", 64);
if(prompt_escaped)
break;
if(space.working_subdirectory.size() == 0)
break;
space.TUI_clue = "saving bitmap directory";
if(directory_exists(LASERBOY_BMP_SHARE + space.working_subdirectory, space.absolute_path_of_LaserBoy))
{
space.clean_screen();
space.render_space();
space.overlay_subdirectory_list();
space.display_error(LASERBOY_BMP_SHARE + space.working_subdirectory + " exists! can not be overwritten! file(s) NOT saved!");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
break;
}
else
{
space.selected_frames().save_as_bmp_directory(LASERBOY_BMP_SHARE + space.working_subdirectory, space.working_subdirectory);
space.working_subdirectory = subdirectory_copy;
space.TUI_clue = "bitmap directory saved";
bad_key = false;
}
}
else
{
space.display_error("no frames selected to save!");
space.file_name.clear();
wait_4_Esc();
}
break;
//----------------------------------------------------------------
case '3': // save all frames as directory of bmp
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_BMP_SHARE); // folders from ./bmp/
space.overlay_subdirectory_list();
space.working_subdirectory = display_prompt_and_echo_name("new bitmap directory name", 64);
if(prompt_escaped)
break;
if(space.working_subdirectory.size() == 0)
break;
space.TUI_clue = "saving bitmap directory";
if(directory_exists(LASERBOY_BMP_SHARE + space.working_subdirectory, space.absolute_path_of_LaserBoy))
{
space.clean_screen();
space.render_space();
space.overlay_subdirectory_list();
space.display_error(LASERBOY_BMP_SHARE + space.working_subdirectory + " exists! can not be overwritten! file(s) NOT saved!");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
break;
}
else
{
space.save_as_bmp_directory(LASERBOY_BMP_SHARE + space.working_subdirectory, space.working_subdirectory);
space.working_subdirectory = subdirectory_copy;
space.TUI_clue = "bitmap directory saved";
bad_key = false;
}
}
break;
//----------------------------------------------------------------
case '4': // save current frame as bmp file
space.clean_screen();
space.render_space();
space.file_name.clear();
space.overlay_file_list();
space.file_name = display_prompt_and_echo_name("new bitmap file name", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0) // [esc]
break;
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".bmp";
space.TUI_clue = "saving bitmap";
if( file_exists(LASERBOY_BMP_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_BMP_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
space.save_as_bmp_view(space.frame_index, LASERBOY_BMP_SHARE + space.file_name);
space.TUI_clue = "bitmap saved";
bad_key = false;
break;
//----------------------------------------------------------------
case '5': // save selected frames as directory of bmp
if(space.number_of_selected_frames())
{
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_BMP_SHARE); // folders from ./bmp/
space.overlay_subdirectory_list();
space.working_subdirectory = display_prompt_and_echo_name("new bitmap directory name", 64);
if(prompt_escaped)
break;
if(space.working_subdirectory.size() == 0)
break;
space.TUI_clue = "saving bitmap directory";
if(directory_exists(LASERBOY_BMP_SHARE + space.working_subdirectory, space.absolute_path_of_LaserBoy))
{
space.clean_screen();
space.render_space();
space.overlay_subdirectory_list();
space.display_error(LASERBOY_BMP_SHARE + space.working_subdirectory + " exists! can not be overwritten! file(s) NOT saved!");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
break;
}
else
{
space.selected_frames().save_as_bmp_directory_view(LASERBOY_BMP_SHARE + space.working_subdirectory, space.working_subdirectory);
space.working_subdirectory = subdirectory_copy;
space.TUI_clue = "bitmap directory saved";
bad_key = false;
}
}
else
{
space.display_error("no frames selected to save!");
space.file_name.clear();
wait_4_Esc();
}
break;
//----------------------------------------------------------------
case '6': // save all frames as directory of bmp
{ // scope
string subdirectory_copy = space.working_subdirectory;
space.clean_screen();
space.working_subdirectory.clear();
space.get_subdirectory_list(LASERBOY_BMP_SHARE); // folders from ./bmp/
space.overlay_subdirectory_list();
space.working_subdirectory = display_prompt_and_echo_name("new bitmap directory name", 64);
if(prompt_escaped)
break;
if(space.working_subdirectory.size() == 0)
break;
space.TUI_clue = "saving bitmap directory";
if(directory_exists(LASERBOY_BMP_SHARE + space.working_subdirectory, space.absolute_path_of_LaserBoy))
{
space.clean_screen();
space.render_space();
space.overlay_subdirectory_list();
space.display_error(LASERBOY_BMP_SHARE + space.working_subdirectory + " exists! can not be overwritten! file(s) NOT saved!");
space.working_subdirectory = subdirectory_copy;
wait_4_Esc();
break;
}
else
{
space.save_as_bmp_directory_view(LASERBOY_BMP_SHARE + space.working_subdirectory, space.working_subdirectory);
space.working_subdirectory = subdirectory_copy;
space.TUI_clue = "bitmap directory saved";
bad_key = false;
}
}
break;
} // end switch(event.key.keysym.unicode)
}
return true;
}
/*
//############################################################################
void LaserBoy_SDL_GUI::display_rescale_file_error(LaserBoy_Rescale_Error_Code error)
{
switch(error)
{
case LASERBOY_RESCALE_INCOMPLETE_DATA:
space.display_error("Not enough data");
break;
case LASERBOY_RESCALE_IMPROPER_DATA:
space.display_error("Data out of range");
break;
case LASERBOY_RESCALE_ODD_DATA:
space.display_error("Data contains odd numbers");
break;
case LASERBOY_RESCALE_NONZERO_ZERO:
space.display_error("First value is not zero");
break;
case LASERBOY_RESCALE_REDUNDANT_DATA:
space.display_error("Redundant data elements");
break;
case LASERBOY_RESCALE_FILE_FAILED:
space.display_error("File open failed");
break;
}
return;
}
*/
//############################################################################
void LaserBoy_SDL_GUI::Laserboy_terminating()
{
space.TUI_clue = "LaserBoy terminated";
display_space();
SDL_Delay(500);
return;
}
//############################################################################
int LaserBoy_SDL_GUI::start_menu_loop()
{
long int bytes_skipped = 0;
ostringstream output_message;
LaserBoy_ild_header_count counter;
string version_string;
//------------------------------------------------------------------------
srand(time(NULL));
running = true;
if( !LaserBoy_version_check(version_string, space.install_GUID, space.app_runs_count) // zero means we got a version_string
&& (version_string.size() == 19)
&& (version_string != LASERBOY_VERSION)
&& (version_string.substr(0, 9) == "LaserBoy-")
)
{
space.display_message(version_string + string(" is now available (README.txt)"));
wait_4_any_key();
}
//------------------------------------------------------------------------
space.TUI_clue = "NO DATA!";
space.working_subdirectory.clear();
space.file_name = "in.ild";
space.from_ild_file(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name, bytes_skipped, counter);
if( is_directory(space.absolute_path_of_LaserBoy + "/ild")
&& is_directory(space.absolute_path_of_LaserBoy + "/bmp")
&& is_directory(space.absolute_path_of_LaserBoy + "/ctn")
&& is_directory(space.absolute_path_of_LaserBoy + "/dxf")
&& is_directory(space.absolute_path_of_LaserBoy + "/txt")
&& is_directory(space.absolute_path_of_LaserBoy + "/utf8")
&& is_directory(space.absolute_path_of_LaserBoy + "/wav")
&& is_directory(space.absolute_path_of_LaserBoy + "/wtf")
)
{
if(space.frame_set_error == LASERBOY_OK)
space.TUI_clue = LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name;
else if(space.frame_set_error & LASERBOY_COLOR_VERTEX_MISSMATCH)
{
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " table to frame quantity mismatch");
wait_4_Esc();
}
else if(space.frame_set_error & LASERBOY_NO_FRAMES_FOUND)
{
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " no frames found");
wait_4_Esc();
}
else if(space.frame_set_error & LASERBOY_FILE_OPEN_FAILED)
{
space.display_error(LASERBOY_ILD_SHARE + space.working_subdirectory + space.file_name + " failed to open");
wait_4_Esc();
}
}
else
{
space.display_error("one or more necessary directory is missing!");
wait_4_Esc();
space.display_error(space.absolute_path_of_LaserBoy + " is probably not the working directory of the executable!");
wait_4_Esc();
}
//--------------------------------------------------------------------
if(bytes_skipped > 0)
{
space.clean_screen();
output_message << LASERBOY_ILD_SHARE
<< space.working_subdirectory
<< space.file_name
<< " : "
<< bytes_skipped
<< " bytes unrecognized data";
space.display_error(output_message.str());
wait_4_Esc();
}
//--------------------------------------------------------------------
display_space();
space.display_ild_file_stats(counter);
wait_4_Esc();
while(running)
{
space.clean_screen();
space.set_current_menu_name("main menu", 0x00000000);
space.render_space();
if(space.show_menu)
space.overlay_main_menu();
display_space();
prompt_escaped = false;
//----------------------------------------------------------------
do
{
SDL_WaitEvent(&event);
} while((event.type != SDL_KEYDOWN));
//----------------------------------------------------------------
#ifdef __WITH_SDL2__
switch(SDL_Keysym_to_char(&event.key.keysym))
#else
switch(event.key.keysym.unicode)
#endif
{
//----------------------------------------------------------------
case SDLK_ESCAPE:
{ // scope
bool show_background_bitmap_was = space.show_background_bitmap;
LaserBoy_color bg_was = space.bg_color,
white_text_was = space.white_text;
space.white_text = LaserBoy_color(255, 255, 255);
space.bg_color = LaserBoy_color(255, 0, 0);
space.show_background_bitmap = false;
space.TUI_clue = "terminating";
bmp_fill(&(space.bmp), 255, 0, 0);
//----------------------------------------------------------------
if(display_prompt_and_echo_bool("Do you really want to terminate LaserBoy? : y | [any]"))
{
space.white_text = white_text_was;
space.bg_color = bg_was;
space.clean_screen();
if( space.report_wtf_changes()
&& display_prompt_and_echo_bool("Settings differ from LaserBoy.wtf. Save new .wtf ? : y | [any]")
)
{
space.file_name = display_prompt_and_echo_name("new wtf file name [LaserBoy.wtf]", 64);
if(prompt_escaped)
break;
if(space.file_name.size() == 0)
space.file_name = "LaserBoy.wtf";
else if(space.file_name.size() < 5 || !iends_with(space.file_name, space.current_extension))
space.file_name += ".wtf";
if( file_exists(LASERBOY_WTF_SHARE + space.file_name)
&& !display_prompt_and_echo_bool("file exists! overwrite ? : y | [any]")
)
{
space.clean_screen();
space.render_space();
space.overlay_file_list();
space.display_error(LASERBOY_WTF_SHARE + space.file_name + " not overwritten! file NOT saved!");
wait_4_Esc();
break;
}
else
{
if(!space.save_wtf_file(LASERBOY_WTF_SHARE + space.file_name))
{
space.display_error(LASERBOY_WTF_SHARE + space.file_name + " failed to save");
wait_4_Esc();
break;
}
}
space.display_message(LASERBOY_WTF_SHARE + space.file_name + " saved");
space.TUI_clue = "wtf saved";
running = false;
}
else
{
if(prompt_escaped)
break;
space.display_message("LaserBoy terminated.");
space.TUI_clue = "terminated";
running = false;
}
}
else
{
space.white_text = white_text_was;
space.bg_color = bg_was;
space.TUI_clue = "terminate canceled";
space.show_background_bitmap = show_background_bitmap_was;
space.clean_screen();
space.render_space();
}
}
break;
//----------------------------------------------------------------
case SDLK_RETURN:
space.show_menu = !space.show_menu;
if(!space.show_menu)
space.TUI_clue = "[Enter] show menu";
else
space.TUI_clue = "[Enter] hide menu";
break;
//----------------------------------------------------------------
case SDLK_BACKSPACE:
case SDLK_DELETE:
space.delete_current_frame();
space.TUI_clue = "deleted";
break;
//----------------------------------------------------------------
default:
#ifdef __WITH_SDL2__
check_for_nav_keys(&event.key.keysym);
check_for_digit_keys(&event.key.keysym);
#else
check_for_nav_keys(event.key.keysym.sym);
check_for_digit_keys(event.key.keysym.sym);
#endif
break;
//----------------------------------------------------------------
case '`':
animate_forward();
break;
//----------------------------------------------------------------
case '~':
animate_reverse();
break;
//----------------------------------------------------------------
case '-':
rotate_forward();
break;
//----------------------------------------------------------------
case '_':
rotate_reverse();
break;
//----------------------------------------------------------------
case '=':
animate_rotate_forward();
break;
//----------------------------------------------------------------
case '+':
animate_rotate_reverse();
break;
//----------------------------------------------------------------
case '/': // show frame_set stats
space.show_frame_set_stats = !space.show_frame_set_stats;
break;
//----------------------------------------------------------------
case '?': // show frame stats
space.show_frame_stats = !space.show_frame_stats;
break;
//----------------------------------------------------------------
case ';': // toggle bitmap background
space.show_background_bitmap = !space.show_background_bitmap;
if(space.show_background_bitmap)
space.TUI_clue = "show bitmap";
else
space.TUI_clue = "hide bitmap";
break;
//----------------------------------------------------------------
case ':': // negative bitmap background
space.show_background_bitmap = true;
space.background_bmp_negative = !space.background_bmp_negative;
space.reload_background_bitmap();
space.TUI_clue = "negative bitmap";
break;
//----------------------------------------------------------------
case 'q':
space.view_offset.x += space.displacement_step;
space.TUI_clue = "+ pan X";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'Q':
space.view_offset.x -= space.displacement_step;
space.TUI_clue = "- pan X";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'w':
space.view_offset.y += space.displacement_step;
space.TUI_clue = "+ pan Y";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'W':
space.view_offset.y -= space.displacement_step;
space.TUI_clue = "- pan Y";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'e':
space.view_offset += space.displacement_step;
space.TUI_clue = "+ pan XY";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'E':
space.view_offset -= space.displacement_step;
space.TUI_clue = "- pan XY";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'r':
case 'R':
space.view_offset = 0;
space.TUI_clue = "on center";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'a':
space.view_scale.x *= space.magnitude_step_up;
space.TUI_clue = "+ zoom X";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'A':
space.view_scale.x *= space.magnitude_step_dn;
space.TUI_clue = "- zoom X";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 's':
space.view_scale.y *= space.magnitude_step_up;
space.TUI_clue = "+ zoom Y";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'S':
space.view_scale.y *= space.magnitude_step_dn;
space.TUI_clue = "- zoom Y";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'd':
space.view_scale *= space.magnitude_step_up;
space.TUI_clue = "+ zoom XY";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'D':
space.view_scale *= space.magnitude_step_dn;
space.TUI_clue = "- zoom XY";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'f':
case 'F':
space.view_scale = 1.00;
space.TUI_clue = "no zoom";
space.view_has_changed = true;
break;
//----------------------------------------------------------------
case 'g':
space.clean_screen();
space.render_space();
space.report_wtf_changes();
display_space();
wait_4_Esc();
break;
//------------------------------------------------------------
case 'v':
if(!space.current_frame().apply_view())
{
space.view_angle = 0.0;
space.view_offset = 0;
space.view_scale = 1.0;
space.TUI_clue = "set view frame";
space.view_has_changed = true;
}
else
space.TUI_clue = "out of bounds!";
break;
//------------------------------------------------------------
case 'V':
space.TUI_clue = "setting all";
space.render_space();
display_space();
{ // scope
LaserBoy_frame_set current(space);
if(!space.apply_view())
{
space.view_angle = 0.0;
space.view_offset = 0;
space.view_scale = 1.0;
space.TUI_clue = "set view frame";
space.view_has_changed = true;
}
else
{
space = current;
space.display_error("out of bounds!");
wait_4_Esc();
}
}
break;
//----------------------------------------------------------------
case 'y': // go to frame index
{
u_int temp_u_int;
space.TUI_clue = "go to index";
temp_u_int = display_prompt_and_echo_u_int( "frame index"
, 0
, space.number_of_frames() - 1
);
if(prompt_escaped)
break;
space.frame_index = temp_u_int % space.number_of_frames();
break;
}
//----------------------------------------------------------------
case 'Y': // go to frame unicode
{
int frame_index;
string unihex;
space.TUI_clue = "go to unicode";
unihex = display_prompt_and_echo_unicode("frame unicode");
if(prompt_escaped)
break;
frame_index = space.index_of_name(unihex);
if(frame_index >= 0)
space.frame_index = frame_index;
else
{
space.display_error(unihex + " not found.");
wait_4_Esc();
}
break;
}
//----------------------------------------------------------------
case 'z': // +100 frames
if(space.number_of_frames() > 100)
{
if( space.loop_animation
|| (space.frame_index <= (space.number_of_frames() - 101))
)
space.frame_index += 100;
while(space.frame_index >= space.number_of_frames())
space.frame_index = space.frame_index - space.number_of_frames();
space.TUI_clue = "+100 frames";
}
break;
//----------------------------------------------------------------
case 'Z': // -100 frames
if(space.number_of_frames() > 100)
{
if(space.frame_index >= 100)
space.frame_index -= 100;
else if( space.loop_animation
&& (space.frame_index < 100)
)
{
space.frame_index = space.number_of_frames() + space.frame_index;
space.frame_index -= 100;
}
space.TUI_clue = "-100 frames";
}
break;
//----------------------------------------------------------------
// call out to another menu loop
//----------------------------------------------------------------
case 'c':
case 'C':
space.set_current_menu_name("frames to hues", 0x00200040, true);
frame_color_trans_menu();
break;
//----------------------------------------------------------------
case 'p':
case 'P':
space.set_current_menu_name("palette set edit", 0x00303000, true);
palette_set_trans_menu();
break;
//----------------------------------------------------------------
case 'h':
case 'H':
space.set_current_menu_name("frame transforms", 0x00202020, true);
frame_transforms_menu();
break;
//----------------------------------------------------------------
case 'j':
case 'J':
space.set_current_menu_name("frame_set transforms", 0x00400020, true);
frame_set_transforms_menu();
break;
//----------------------------------------------------------------
case 'k':
case 'K':
space.set_current_menu_name("draw color blank", 0x00200040, true);
draw_color_blank_menu();
break;
//----------------------------------------------------------------
case 'l':
case 'L':
space.set_current_menu_name("move scale rotate", 0x00204000, true);
move_scale_rotate_menu();
break;
//----------------------------------------------------------------
case 'm':
case 'M':
space.set_current_menu_name("render segments", 0x00402000, true);
direct_draw_segments_menu();
break;
//----------------------------------------------------------------
case 'n':
case 'N':
space.set_current_menu_name("effect functions", 0x00402000, true);
effect_functions_menu();
break;
//----------------------------------------------------------------
case 'b':
case 'B':
space.set_current_menu_name("wav utilities", 0x00002040, true);
wav_utilities_menu();
break;
//----------------------------------------------------------------
case 'i':
case 'I':
space.set_current_menu_name("input file", 0x00004020, true);
file_open_menu();
break;
//----------------------------------------------------------------
case 'o':
case 'O':
space.set_current_menu_name("output file", 0x00204020, true);
save_as_file_menu();
break;
//----------------------------------------------------------------
} // end switch(event.key.keysym.unicode)
//----------------------------------------------------------------
} // end while(running)
//------------------------------------------------------------------------
Laserboy_terminating();
return 0;
}
//############################################################################
//////////////////////////////////////////////////////////////////////////////
//############################################################################