Corrected multi-location opening function. 'Starters' can be opened,

but no attempt to delete can be made. ("Erase" button deactivated.)
Saving after loading a starter creates a new work.
This commit is contained in:
William Kendrick 2004-09-04 10:42:32 +00:00
parent 863823b931
commit ff7317cbfb

View file

@ -21,12 +21,12 @@
along with this program; if not, write to the Free Software along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
June 14, 2002 - August 19, 2004 June 14, 2002 - September 4, 2004
*/ */
#define VER_VERSION "0.9.14" #define VER_VERSION "0.9.14"
#define VER_DATE "2004-08-23" #define VER_DATE "2004-09-04"
/* #define DEBUG */ /* #define DEBUG */
@ -548,6 +548,11 @@ char * savedir;
int RGBtoYUV[65536]; int RGBtoYUV[65536];
typedef struct dirent2 {
struct dirent f;
int place;
} dirent2;
/* Local function prototypes: */ /* Local function prototypes: */
@ -608,7 +613,7 @@ void reset_avail_tools(void);
void update_screen(int x1, int y1, int x2, int y2); void update_screen(int x1, int y1, int x2, int y2);
Uint8 alpha(Uint8 c1, Uint8 c2, Uint8 a); Uint8 alpha(Uint8 c1, Uint8 c2, Uint8 a);
int compare_strings(char * * s1, char * * s2); int compare_strings(char * * s1, char * * s2);
int compare_dirents(struct dirent * f1, struct dirent * f2); int compare_dirent2s(struct dirent2 * f1, struct dirent2 * f2);
void draw_tux_text(int which_tux, char * str, void draw_tux_text(int which_tux, char * str,
int force_locale_font, int want_right_to_left); int force_locale_font, int want_right_to_left);
void wordwrap_text(TTF_Font * font, char * str, SDL_Color color, void wordwrap_text(TTF_Font * font, char * str, SDL_Color color,
@ -7351,13 +7356,16 @@ int compare_strings(char * * s1, char * * s2)
/* For qsort() call in do_open()... */ /* For qsort() call in do_open()... */
int compare_dirents(struct dirent * f1, struct dirent * f2) int compare_dirent2s(struct dirent2 * f1, struct dirent2 * f2)
{ {
#ifdef DEBUG #ifdef DEBUG
printf("compare_dirents: %s\t%s\n", f1->d_name, f2->d_name); printf("compare_dirents: %s\t%s\n", f1->f.d_name, f2->f.d_name);
#endif #endif
return (strcmp(f1->d_name, f2->d_name)); if (f1->place == f2->place)
return (strcmp(f1->f.d_name, f2->f.d_name));
else
return (f1->place - f2->place);
} }
@ -9450,6 +9458,8 @@ int do_quit(void)
#define PLACE_STARTERS_DIR 0 #define PLACE_STARTERS_DIR 0
#define PLACE_SAVED_DIR 1 #define PLACE_SAVED_DIR 1
#define NUM_PLACES_TO_LOOK 2
int do_open(int want_new_tool) int do_open(int want_new_tool)
{ {
@ -9458,11 +9468,12 @@ int do_open(int want_new_tool)
SDL_Surface * * thumbs = NULL; SDL_Surface * * thumbs = NULL;
DIR * d; DIR * d;
struct dirent * f; struct dirent * f;
#ifndef __BEOS__ struct dirent2 * fs;
struct dirent * fs; int place;
#endif char * dirname[NUM_PLACES_TO_LOOK];
char * dirname, * rfname; char * rfname;
char * * d_names = NULL, * * d_exts = NULL; char * * d_names = NULL, * * d_exts = NULL;
int * d_places;
FILE * fi; FILE * fi;
char fname[1024]; char fname[1024];
char * tmp_fname; char * tmp_fname;
@ -9474,9 +9485,6 @@ int do_open(int want_new_tool)
Uint32 last_click_time; Uint32 last_click_time;
int last_click_which, last_click_button; int last_click_which, last_click_button;
int places_to_look; int places_to_look;
#ifdef __BEOS__
char * dot = NULL;
#endif
@ -9486,226 +9494,92 @@ int do_open(int want_new_tool)
/* Allocate some space: */ /* Allocate some space: */
things_alloced = 32; things_alloced = 32;
#ifndef __BEOS__
fs = (struct dirent *) malloc(sizeof(struct dirent) * things_alloced); fs = (struct dirent2 *) malloc(sizeof(struct dirent2) * things_alloced);
#else
thumbs = (SDL_Surface * *) malloc(sizeof(SDL_Surface *) * things_alloced);
d_names = (char * *) malloc(sizeof(char *) * things_alloced);
d_exts = (char * *) malloc(sizeof(char *) * things_alloced);
#endif
num_files = 0; num_files = 0;
cur = 0; cur = 0;
which = 0; which = 0;
num_files_in_dirs = 0; num_files_in_dirs = 0;
thumbs = (SDL_Surface * *) malloc(sizeof(SDL_Surface *) * 1);
d_names = (char * *) malloc(sizeof(char *) * 1);
d_exts = (char * *) malloc(sizeof(char *) * 1);
/* Open directories of images: */ /* Open directories of images: */
for (places_to_look = 0; places_to_look < 2; places_to_look++) for (places_to_look = 0;
places_to_look < NUM_PLACES_TO_LOOK;
places_to_look++)
{ {
if (places_to_look == PLACE_STARTERS_DIR) if (places_to_look == PLACE_STARTERS_DIR)
{ {
/* Check for coloring-book style 'starter' images first: */ /* Check for coloring-book style 'starter' images first: */
dirname = strdup("/usr/local/share/tuxpaint/starters"); /* FIXME: On Windows, MacOSX, BeOS, etc. -- do it their way! */
dirname[places_to_look] = strdup("/usr/local/share/tuxpaint/starters");
} }
else else
{ {
/* Then check for saved-images: */ /* Then check for saved-images: */
dirname = get_fname("saved"); dirname[places_to_look] = get_fname("saved");
} }
/* Read directory of images and build thumbnails: */ /* Read directory of images and build thumbnails: */
d = opendir(dirname); d = opendir(dirname[places_to_look]);
if (d != NULL) if (d != NULL)
{ {
/* Gather list of files (for sorting): */ /* Gather list of files (for sorting): */
#ifdef __BEOS__
/* FIXME: I tried to keep this in sync for BeOS, but cannot test! */
/* Shard, can you check to see that this works like the other OSes? */
/* -bjk 2004.06.01 */
do
{
f = readdir(d);
if (f && (dot = strstr(f->d_name, FNAME_EXTENSION)) != NULL)
{
if( strstr(f->d_name, "-t") == NULL)
{
d_exts[num_files_in_dirs] = strdup(dot);
*dot = 0;
d_names[num_files_in_dirs] = strdup(f->d_name);
/* Try to load thumbnail first: */
snprintf(fname, sizeof(fname), "%s/%s-t%s",
dirname, d_names[num_files], FNAME_EXTENSION);
img = IMG_Load(fname);
if (img != NULL)
{
/* Found the thumbnail - load it! */
show_progress_bar();
thumbs[num_files] = SDL_DisplayFormat(img);
SDL_FreeSurface(img);
if (thumbs[num_files] == NULL)
{
fprintf(stderr,
"\nError: Couldn't create a thumbnail of "
"saved image!\n"
"%s\n", fname);
}
}
else
{
/* No thumbnail - load original: */
snprintf(fname, sizeof(fname), "%s/%s%s",
dirname, d_names[num_files], FNAME_EXTENSION);
img = IMG_Load(fname);
show_progress_bar();
if (img != NULL)
{
/* Turn it into a thumbnail: */
img1 = SDL_DisplayFormat(img);
img2 = thumbnail(img1, THUMB_W - 20, THUMB_H - 20, 0);
SDL_FreeSurface(img1);
show_progress_bar();
thumbs[num_files] = SDL_DisplayFormat(img2);
SDL_FreeSurface(img2);
if (thumbs[num_files] == NULL)
{
fprintf(stderr,
"\nError: Couldn't create a thumbnail of "
"saved image!\n"
"%s\n", fname);
}
SDL_FreeSurface(img);
show_progress_bar();
/* Let's save this thumbnail, so we don't have to create it
again next time 'Open' is called: */
if (places_to_look != PLACE_STARTERS_DIR)
{
debug("Saving thumbnail for this one!");
snprintf(fname, sizeof(fname), "%s/%s-t%s",
dirname, d_names[num_files],
FNAME_EXTENSION);
fi = fopen(fname, "wb");
if (fi == NULL)
{
fprintf(stderr,
"\nError: Couldn't save thumbnail of "
"saved image!\n"
"%s\n"
"The error that occurred was:\n"
"%s\n\n",
fname, strerror(errno));
}
else
{
do_png_save(fi, fname, thumbs[num_files]);
/* NOTE: fi is closed there so no need to fclose it here */
}
}
else
{
/* Starters SHOULD come with thunbnails! */
/* We probably can't save there, anyway! */
}
}
}
show_progress_bar();
num_files++;
*dot = '.';
num_files_in_dirs++;
if (num_files_in_dirs > things_alloced)
{
things_alloced = things_alloced + 32;
thumbs = (SDL_Surface * *)
realloc(thumbs, sizeof(SDL_Surface *) * things_alloced);
d_names = (char * *)
realloc(d_names, sizeof(char *) * things_alloced);
d_exts = (char * *)
realloc(d_exts, sizeof(char *) * things_alloced);
}
}
}
}
while (f != NULL && num_files_in_dirs < MAX_FILES);
#else
do do
{ {
f = readdir(d); f = readdir(d);
if (f != NULL) if (f != NULL)
{ {
memcpy(&(fs[num_files_in_dirs]), f, sizeof(struct dirent)); memcpy(&(fs[num_files_in_dirs].f), f, sizeof(struct dirent));
fs[num_files_in_dirs].place = places_to_look;
num_files_in_dirs++; num_files_in_dirs++;
if (num_files_in_dirs >= things_alloced) if (num_files_in_dirs >= things_alloced)
{ {
things_alloced = things_alloced + 32; things_alloced = things_alloced + 32;
fs = (struct dirent *) realloc(fs, sizeof(struct dirent) * things_alloced); fs = (struct dirent2 *) realloc(fs,
sizeof(struct dirent2) *
things_alloced);
} }
} }
} }
while (f != NULL); while (f != NULL);
#endif
closedir(d); closedir(d);
} }
}
/* (Re)allocate space for the information about these files: */ /* (Re)allocate space for the information about these files: */
thumbs = (SDL_Surface * *) realloc(thumbs, sizeof(SDL_Surface *) * num_files_in_dirs); thumbs = (SDL_Surface * *) malloc(sizeof(SDL_Surface *) *
d_names = (char * *) realloc(d_names, sizeof(char *) * num_files_in_dirs); num_files_in_dirs);
d_exts = (char * *) realloc(d_exts, sizeof(char *) * num_files_in_dirs); d_places = (int *) malloc(sizeof(int) * num_files_in_dirs);
d_names = (char * *) malloc(sizeof(char *) * num_files_in_dirs);
d_exts = (char * *) malloc(sizeof(char *) * num_files_in_dirs);
/* Sort: */ /* Sort: */
qsort(fs, num_files_in_dirs, sizeof(struct dirent), qsort(fs, num_files_in_dirs, sizeof(struct dirent2),
(int(*)(const void *, const void *))compare_dirents); (int(*)(const void *, const void *))compare_dirent2s);
/* Read directory of images and build thumbnails: */ /* Read directory of images and build thumbnails: */
for (j = 0; j < num_files_in_dirs; j++) for (j = 0; j < num_files_in_dirs; j++)
{ {
f = &(fs[j]); f = &(fs[j].f);
place = fs[j].place;
show_progress_bar(); show_progress_bar();
@ -9713,7 +9587,8 @@ int do_open(int want_new_tool)
{ {
debug(f->d_name); debug(f->d_name);
if (strstr(f->d_name, "-t") == NULL) if (strstr(f->d_name, "-t.") == NULL &&
strstr(f->d_name, "-front.") == NULL)
{ {
if (strstr(f->d_name, FNAME_EXTENSION) != NULL if (strstr(f->d_name, FNAME_EXTENSION) != NULL
#ifndef SAVE_AS_BMP #ifndef SAVE_AS_BMP
@ -9737,10 +9612,11 @@ int do_open(int want_new_tool)
d_exts[num_files] = strdup(".bmp"); d_exts[num_files] = strdup(".bmp");
} }
#endif #endif
d_names[num_files] = strdup(fname); d_names[num_files] = strdup(fname);
d_places[num_files] = place;
/* Is it the 'current' file we just loaded? /* Is it the 'current' file we just loaded?
We'll make it the current selection! */ We'll make it the current selection! */
@ -9748,13 +9624,21 @@ int do_open(int want_new_tool)
{ {
which = num_files; which = num_files;
cur = (which / 4) * 4; cur = (which / 4) * 4;
/* Center the cursor (useful for when the last item is
selected first!) */
if (cur - 8 >= 0)
cur = cur - 8;
else if (cur - 4 >= 0)
cur = cur - 4;
} }
/* Try to load thumbnail first: */ /* Try to load thumbnail first: */
snprintf(fname, sizeof(fname), "%s/.thumbs/%s-t.png", snprintf(fname, sizeof(fname), "%s/.thumbs/%s-t.png",
dirname, d_names[num_files]); dirname[d_places[num_files]], d_names[num_files]);
debug(fname); debug(fname);
img = IMG_Load(fname); img = IMG_Load(fname);
@ -9762,16 +9646,19 @@ int do_open(int want_new_tool)
{ {
/* No thumbnail in the new location ("saved/.thumbs"), /* No thumbnail in the new location ("saved/.thumbs"),
try the old locatin ("saved/"): */ try the old locatin ("saved/"): */
snprintf(fname, sizeof(fname), "%s/%s-t.png", dirname, snprintf(fname, sizeof(fname), "%s/%s-t.png",
dirname[d_places[num_files]],
d_names[num_files]); d_names[num_files]);
debug(fname); debug(fname);
img = IMG_Load(fname); img = IMG_Load(fname);
} }
if (img != NULL) if (img != NULL)
{ {
/* Loaded the thumbnail from one or the other location */
show_progress_bar(); show_progress_bar();
thumbs[num_files] = SDL_DisplayFormat(img); thumbs[num_files] = SDL_DisplayFormat(img);
@ -9784,11 +9671,10 @@ int do_open(int want_new_tool)
"saved image!\n" "saved image!\n"
"%s\n", fname); "%s\n", fname);
} }
num_files++; num_files++;
} }
else
if (img == NULL)
{ {
/* No thumbnail - load original: */ /* No thumbnail - load original: */
/* (Make sure we have a .../saved/.thumbs/ directory:) */ /* (Make sure we have a .../saved/.thumbs/ directory:) */
@ -9807,10 +9693,10 @@ int do_open(int want_new_tool)
} }
free(tmp_fname); free(tmp_fname);
snprintf(fname, sizeof(fname), "%s/%s", snprintf(fname, sizeof(fname), "%s/%s",
dirname, f->d_name); dirname[d_places[num_files]], f->d_name);
debug(fname); debug(fname);
#ifdef SAVE_AS_BMP #ifdef SAVE_AS_BMP
img = SDL_LoadBMP(fname); img = SDL_LoadBMP(fname);
@ -9860,30 +9746,33 @@ int do_open(int want_new_tool)
/* Let's save this thumbnail, so we don't have to /* Let's save this thumbnail, so we don't have to
create it again next time 'Open' is called: */ create it again next time 'Open' is called: */
debug("Saving thumbnail for this one!"); if (d_places[num_files] == PLACE_SAVED_DIR)
snprintf(fname, sizeof(fname), "%s/.thumbs/%s-t.png",
dirname, d_names[num_files]);
fi = fopen(fname, "wb");
if (fi == NULL)
{ {
fprintf(stderr, debug("Saving thumbnail for this one!");
"\nError: Couldn't save thumbnail of "
"saved image!\n" snprintf(fname, sizeof(fname), "%s/.thumbs/%s-t.png",
"%s\n" dirname[d_places[num_files]], d_names[num_files]);
"The error that occurred was:\n"
"%s\n\n", fi = fopen(fname, "wb");
fname, strerror(errno)); if (fi == NULL)
} {
else fprintf(stderr,
{ "\nError: Couldn't save thumbnail of "
do_png_save(fi, fname, thumbs[num_files]); "saved image!\n"
} "%s\n"
"The error that occurred was:\n"
show_progress_bar(); "%s\n\n",
fname, strerror(errno));
}
else
{
do_png_save(fi, fname, thumbs[num_files]);
}
show_progress_bar();
}
num_files++; num_files++;
} }
@ -9892,13 +9781,12 @@ int do_open(int want_new_tool)
} }
else else
{ {
/* It was a thumbnail file ("...-t.png") */ /* It was a thumbnail file ("...-t.png") or immutable scene starter's
overlay layer ("...-front.png") */
} }
} }
} }
free(dirname);
}
#ifdef DEBUG #ifdef DEBUG
@ -10023,13 +9911,14 @@ int do_open(int want_new_tool)
/* "Erase" button: */ /* "Erase" button: */
/* FIXME: Deactivate if an immutable file ("starter") is
selected. Reactivate when clicking a normal (saved) file. */
dest.x = WINDOW_WIDTH - 96 - 48 - 48; dest.x = WINDOW_WIDTH - 96 - 48 - 48;
dest.y = (48 * 7 + 40 + HEIGHTOFFSET) - 48; dest.y = (48 * 7 + 40 + HEIGHTOFFSET) - 48;
SDL_BlitSurface(img_erase, NULL, screen, &dest);
if (d_places[which] != PLACE_STARTERS_DIR)
SDL_BlitSurface(img_erase, NULL, screen, &dest);
else
SDL_BlitSurface(img_btn_off, NULL, screen, &dest);
dest.x = WINDOW_WIDTH - 96 - 48 - 48 + (48 - img_openlabels_erase->w) / 2; dest.x = WINDOW_WIDTH - 96 - 48 - 48 + (48 - img_openlabels_erase->w) / 2;
dest.y = (48 * 7 + 40 + HEIGHTOFFSET) - img_openlabels_erase->h; dest.y = (48 * 7 + 40 + HEIGHTOFFSET) - img_openlabels_erase->h;
@ -10139,6 +10028,7 @@ int do_open(int want_new_tool)
(event.key.keysym.mod & KMOD_CTRL || (event.key.keysym.mod & KMOD_CTRL ||
event.key.keysym.mod & KMOD_LCTRL || event.key.keysym.mod & KMOD_LCTRL ||
event.key.keysym.mod & KMOD_RCTRL) && event.key.keysym.mod & KMOD_RCTRL) &&
d_places[which] != PLACE_STARTERS_DIR &&
!noshortcuts) !noshortcuts)
{ {
/* Delete! */ /* Delete! */
@ -10241,7 +10131,8 @@ int do_open(int want_new_tool)
else if (event.button.x >= (WINDOW_WIDTH - 96 - 48 - 48) && else if (event.button.x >= (WINDOW_WIDTH - 96 - 48 - 48) &&
event.button.x < (WINDOW_WIDTH - 48 - 96) && event.button.x < (WINDOW_WIDTH - 48 - 96) &&
event.button.y >= (48 * 7 + 40 + HEIGHTOFFSET) - 48 && event.button.y >= (48 * 7 + 40 + HEIGHTOFFSET) - 48 &&
event.button.y < (48 * 7 + 40 + HEIGHTOFFSET)) event.button.y < (48 * 7 + 40 + HEIGHTOFFSET) &&
d_places[which] != PLACE_STARTERS_DIR)
{ {
/* Erase */ /* Erase */
@ -10275,7 +10166,8 @@ int do_open(int want_new_tool)
(event.button.x >= (WINDOW_WIDTH - 96 - 48) && (event.button.x >= (WINDOW_WIDTH - 96 - 48) &&
event.button.x < (WINDOW_WIDTH - 96)) || event.button.x < (WINDOW_WIDTH - 96)) ||
(event.button.x >= (WINDOW_WIDTH - 96 - 48 - 48) && (event.button.x >= (WINDOW_WIDTH - 96 - 48 - 48) &&
event.button.x < (WINDOW_WIDTH - 48 - 96))) && event.button.x < (WINDOW_WIDTH - 48 - 96) &&
d_places[which] != PLACE_STARTERS_DIR)) &&
event.button.y >= (48 * 7 + 40 + HEIGHTOFFSET) - 48 && event.button.y >= (48 * 7 + 40 + HEIGHTOFFSET) - 48 &&
event.button.y < (48 * 7 + 40 + HEIGHTOFFSET)) event.button.y < (48 * 7 + 40 + HEIGHTOFFSET))
{ {
@ -10345,6 +10237,7 @@ int do_open(int want_new_tool)
d_names[i] = d_names[i + 1]; d_names[i] = d_names[i + 1];
d_exts[i] = d_exts[i + 1]; d_exts[i] = d_exts[i + 1];
thumbs[i] = thumbs[i + 1]; thumbs[i] = thumbs[i + 1];
d_places[i] = d_places[i + 1];
} }
num_files--; num_files--;
@ -10411,15 +10304,13 @@ int do_open(int want_new_tool)
} }
/* BEGIN FIXME: Determine if this was a 'starter' image, and /* Figure out filename: */
use a different path if so... */
snprintf(fname, sizeof(fname), "saved/%s%s", snprintf(fname, sizeof(fname), "%s/%s%s",
dirname[d_places[which]],
d_names[which], d_exts[which]); d_names[which], d_exts[which]);
rfname = get_fname(fname);
/* -- END FIXME -- */ rfname = get_fname(fname);
#ifdef SAVE_AS_BMP #ifdef SAVE_AS_BMP
@ -10458,17 +10349,28 @@ int do_open(int want_new_tool)
oldest_undo = 0; oldest_undo = 0;
newest_undo = 0; newest_undo = 0;
/* FIXME: Set values so that we don't try to if (d_places[which] == PLACE_SAVED_DIR)
re-save immutable images */ {
/* Saved image: */
been_saved = 1;
been_saved = 1;
strcpy(file_id, d_names[which]);
}
else
{
/* Immutable image; we'll need to save a new one: */
been_saved = 1;
file_id[0] = '\0';
}
reset_avail_tools(); reset_avail_tools();
tool_avail[TOOL_NEW] = 1; tool_avail[TOOL_NEW] = 1;
tool_avail_bak[TOOL_UNDO] = 0; tool_avail_bak[TOOL_UNDO] = 0;
tool_avail_bak[TOOL_REDO] = 0; tool_avail_bak[TOOL_REDO] = 0;
strcpy(file_id, d_names[which]);
want_new_tool = 1; want_new_tool = 1;
} }
@ -10493,8 +10395,12 @@ int do_open(int want_new_tool)
free(d_exts[i]); free(d_exts[i]);
} }
for (i = 0; i < NUM_PLACES_TO_LOOK; i++)
free(dirname[i]);
free(d_names); free(d_names);
free(d_exts); free(d_exts);
free(d_places);
return(want_new_tool); return(want_new_tool);
} }