#if 0 /* To check for memory leaks */ #define VLD_MAX_DATA_DUMP 80 #include #endif #include #include #include #include #include #include "iup.h" #include "iupcontrols.h" #include "iupgl.h" #include "iupim.h" #include "iup_str.h" #include "iup_object.h" #include "iup_image.h" /* #define STOCK_TEST "24" */ /* #define STOCK_TEST "48" */ #define MAX_NAMES 5000 #ifdef USE_IM #include "iupim.h" #endif static int close_cb(void) { return IUP_CLOSE; } static int about_cb(void) { IupMessage("About", " IupView\n\n" "Show dialogs and popup menus\n" "defined in LED files.\n" "Can show all defined images.\n" "Can import and export images.\n" ); return IUP_DEFAULT; } static int inactivetoggle_cb(Ihandle* self, int v) { Ihandle* tabs = (Ihandle*)IupGetAttribute(self, "TABS"); Ihandle* child = IupGetNextChild(tabs, NULL); while(child) { IupSetAttribute(child, "ACTIVE", v?"NO":"YES"); child = IupGetNextChild(tabs, child); } return IUP_DEFAULT; } static int imagebutton_cb(Ihandle* self) { Ihandle* label = (Ihandle*)IupGetAttribute(self, "_INFO_LABEL"); IupSetAttribute(label, "TITLE", IupGetAttribute(self, "_INFO")); return IUP_DEFAULT; } static int compare_image_names(const void* i1, const void* i2) { Ihandle* ih1 = *((Ihandle**)i1); Ihandle* ih2 = *((Ihandle**)i2); char* name1 = IupGetName(ih1); char* name2 = IupGetName(ih2); return strcmp(name1, name2); } static int showallimages_cb(Ihandle* ih) { Ihandle *dialog, *box, *files, *tabs, *toggle, *label; Ihandle* params[500]; char *names[MAX_NAMES]; Ihandle* images[MAX_NAMES]; int i, n = 0, num_images, num_names = IupGetAllNames(names, MAX_NAMES); files = IupUser(); num_images = 0; for (i = 0; i < num_names; i++) { Ihandle* elem = IupGetHandle(names[i]); if (elem->iclass->nativetype == IUP_TYPEIMAGE) { /* show only loaded images */ char* file_title = IupGetAttribute(elem, "_FILE_TITLE"); if (!file_title) continue; images[num_images] = elem; num_images++; } } if (num_images == 0) { IupMessage("Error", "No images."); return IUP_DEFAULT; } qsort(images, num_images, sizeof(Ihandle*), compare_image_names); for (i = 0; i < num_images; i++) { Ihandle *tbox, *lbox, *button, *elem; char* name; char* file_title; elem = images[i]; name = IupGetName(elem); /* show only loaded images */ file_title = IupGetAttribute(elem, "_FILE_TITLE"); if (!file_title) continue; tbox = (Ihandle*)IupGetAttribute(files, file_title); if (!tbox) { tbox = IupVbox(NULL); IupSetAttribute(files, file_title, (char*)tbox); IupSetAttribute(tbox, "TABTITLE", file_title); #ifdef STOCK_TEST params[n] = IupBackgroundBox(tbox); IupSetStrAttribute(params[n], "BGCOLOR", IupGetAttribute(IupGetDialog(ih), "BGCOLOR")); #else params[n] = tbox; #endif n++; } lbox = (Ihandle*)IupGetAttribute(tbox, file_title); if (!lbox || IupGetInt(lbox, "LINE_COUNT") == 10) { lbox = IupHbox(NULL); IupAppend(tbox, lbox); IupSetAttribute(tbox, file_title, (char*)lbox); IupSetAttribute(lbox, "LINE_COUNT", "0"); } button = IupButton("", NULL); #ifdef STOCK_TEST IupSetAttribute(button, "FLAT", "Yes"); #endif IupSetStrAttribute(button, "IMAGE", name); IupSetfAttribute(button, "_INFO", "%s [%d,%d]", name, IupGetInt(elem, "WIDTH"), IupGetInt(elem, "HEIGHT")); IupSetCallback(button, "ACTION", (Icallback)imagebutton_cb); IupAppend(lbox, button); IupSetfAttribute(lbox, "LINE_COUNT", "%d", IupGetInt(lbox, "LINE_COUNT")+1); } params[n] = NULL; box = IupVbox(toggle = IupToggle("INACTIVE", NULL), tabs = IupTabsv(params), label = IupLabel(""), NULL); IupSetAttribute(box, "MARGIN", "10x10"); IupSetAttribute(box, "GAP", "10"); IupSetAttribute(tabs, "ALIGNMENT", "NW"); IupSetAttribute(tabs, "SIZE", "150x80"); IupSetCallback(toggle, "ACTION", (Icallback)inactivetoggle_cb); IupSetAttribute(toggle, "TABS", (char*)tabs); IupSetAttribute(label, "EXPAND", "HORIZONTAL"); dialog = IupDialog(box); IupSetAttribute(dialog, "TITLE", "All Images"); IupSetCallback(dialog, "CLOSE_CB", (Icallback)close_cb); IupSetAttribute(dialog, "_INFO_LABEL", (char*)label); IupSetAttributeHandle(dialog, "PARENTDIALOG", IupGetDialog(ih)); IupPopup(dialog, IUP_CENTER, IUP_CENTER); IupDestroy(dialog); IupDestroy(files); return IUP_DEFAULT; } static char* getfileformat(int all) { #define NUM_FORMATS 7 int ret, count = NUM_FORMATS; static char *options[NUM_FORMATS] = { "LED", "LUA", "C", "ICO", "BMP", "GIF", "PNG" }; if (!all) count = 3; ret = IupListDialog(1,"File Format",count,options,1,9,count+1,NULL); if (ret == -1) return NULL; else return options[ret]; } static char* getfolder(void) { static char folder[10240]; Ihandle *filedlg = IupFileDlg(); IupSetAttribute(filedlg, "DIALOGTYPE", "DIR"); IupSetAttribute(filedlg, "TITLE", "Select Folder for Images"); IupPopup(filedlg, IUP_CENTER, IUP_CENTER); if (IupGetInt(filedlg, "STATUS") != -1) { strcpy(folder, IupGetAttribute(filedlg, "VALUE")); IupDestroy(filedlg); return folder; } IupDestroy(filedlg); return NULL; } static char* StrLower(const char* sstr) { static char buf[10]; iupStrLower(buf, sstr); return buf; } static int saveallimages_cb(void) { char *names[MAX_NAMES]; char* folder; int i, n = 0, num_names = IupGetAllNames(names, MAX_NAMES); char* imgtype = getfileformat(1); if (!imgtype) return IUP_DEFAULT; folder = getfolder(); if (!folder) return IUP_DEFAULT; for (i = 0; i < num_names; i++) { Ihandle* elem = IupGetHandle(names[i]); if (elem->iclass->nativetype == IUP_TYPEIMAGE) { char filename[10240] = ""; /* save only loaded images */ char* file_title = IupGetAttribute(elem, "_FILE_TITLE"); if (!file_title) continue; strcpy(filename, folder); strcat(filename, "/"); strcat(filename, file_title); strcat(filename, "_"); strcat(filename, names[i]); strcat(filename, "."); strcat(filename, StrLower(imgtype)); if (!IupSaveImageAsText(elem, filename, imgtype, names[i])) { #ifdef USE_IM if (!IupSaveImage(elem, filename, imgtype)) { char* err_msg = IupGetGlobal("IUPIM_LASTERROR"); if (err_msg) IupMessage("Error", err_msg); return IUP_DEFAULT; } #else IupMessage("Error", "Failed to save the image."); return IUP_DEFAULT; #endif } n++; } } if (n == 0) { IupMessage("Error", "No images."); return IUP_DEFAULT; } return IUP_DEFAULT; } static int GetSaveAsFile(char* file, const char* imgtype) { Ihandle *gf; int ret; char *value; gf = IupFileDlg(); IupSetAttribute(gf, "DIALOGTYPE", "SAVE"); IupSetfAttribute(gf, "TITLE", "Save %s File", imgtype); IupSetfAttribute(gf, "FILTER", "*.%s", StrLower(imgtype)); IupSetAttribute(gf, "FILE", file); IupPopup(gf, IUP_CENTER, IUP_CENTER); value = IupGetAttribute( gf, "VALUE" ); if (value) strcpy( file, value ); ret = IupGetInt( gf, "STATUS" ); IupDestroy(gf); return ret; } static void replaceDot(char* filename) { /* replace all "." by "_" */ /* replace all "-" by "_" */ while(*filename) { if (*filename == '.') *filename = '_'; if (*filename == '-') *filename = '_'; filename++; } } static char* strdup_free(const char* str, char* str_ptr) { int len = (int)strlen(str); char* tmp = malloc(len+1); memcpy(tmp, str, len+1); free(str_ptr); return tmp; } static char* mainGetFileTitle(const char* filename) { int i, last = 1, len = (int)strlen(filename); char* file_title = malloc(len+1); char* dot, *ft_str = file_title; memcpy(file_title, filename, len+1); dot = strchr(file_title, '.'); if (dot) *dot = 0; for(i = len-1; i >= 0; i--) { if (last && file_title[i] == '.') { /* cut last "." forward */ file_title[i] = 0; last = 0; } if (file_title[i] == '\\' || file_title[i] == '/') { replaceDot(file_title+i+1); return strdup_free(file_title+i+1, ft_str); } } replaceDot(file_title); return strdup_free(file_title, ft_str); } static char* iStrGetNoReserved(const char* p_name) { static char name[128]; strcpy(name, p_name); iupStrReplaceReserved(name, '_'); return name; } static int saveallimagesone_cb(void) { char filename[10240] = "*."; char *names[MAX_NAMES]; int i, n = 0, num_names = IupGetAllNames(names, MAX_NAMES); FILE* packfile = NULL; char* imgtype = getfileformat(0); if (!imgtype) return IUP_DEFAULT; strcat(filename, StrLower(imgtype)); if (GetSaveAsFile(filename, imgtype) == -1) return IUP_DEFAULT; for (i = 0; i < num_names; i++) { Ihandle* elem = IupGetHandle(names[i]); if (elem->iclass->nativetype == IUP_TYPEIMAGE) { /* save only loaded images */ char* file_title = IupGetAttribute(elem, "_FILE_TITLE"); if (!file_title) { names[i] = NULL; continue; } if (!packfile) { packfile = fopen(filename, "wb"); if (!packfile) { IupMessage("Error", "Failed to open the file."); return IUP_DEFAULT; } if (iupStrEqualNoCase(imgtype, "C")) { fprintf(packfile, "/* Generated by IupView export to C. */\n\n"); fprintf(packfile, "#include \n"); fprintf(packfile, "#include \n\n"); } else if (iupStrEqualNoCase(imgtype, "LUA")) { fprintf(packfile, "-- Generated by IupView export to Lua.\n\n"); } else { fprintf(packfile, "# Generated by IupView export to LED.\n\n"); } } if (!iupImageExportToFile(elem, packfile, imgtype, names[i])) { fclose(packfile); IupMessage("Error", "Failed to write to the file."); return IUP_DEFAULT; } n++; } else names[i] = NULL; } if (packfile) { if (iupStrEqualNoCase(imgtype, "C")) { char* title = mainGetFileTitle(filename); iupStrReplaceReserved(title, '_'); fprintf(packfile, "void create_images_%s(void)\n{\n", title); free(title); for (i = 0; i < num_names; i++) { if (names[i]) fprintf(packfile, " IupSetHandle(\"%s\", create_image_%s());\n", names[i], iStrGetNoReserved(names[i])); } fprintf(packfile, "}\n\n"); } else if (iupStrEqualNoCase(imgtype, "LUA")) { char* title = mainGetFileTitle(filename); iupStrReplaceReserved(title, '_'); fprintf(packfile, "function create_images_%s()\n\n", title); free(title); for (i = 0; i < num_names; i++) { if (names[i]) fprintf(packfile, " iup.SetHandle(\"%s\", create_image_%s())\n", names[i], iStrGetNoReserved(names[i])); } fprintf(packfile, "end\n\n"); } fclose(packfile); } if (n == 0) { IupMessage("Error", "No images."); return IUP_DEFAULT; } return IUP_DEFAULT; } static int saveimage_cb(Ihandle* self) { Ihandle* list = (Ihandle*)IupGetAttribute(self, "mainList"); char* name = IupGetAttribute(list, IupGetAttribute(list, "VALUE")); if (name) /* the list may be empty */ { Ihandle* elem = IupGetHandle(name); if (elem->iclass->nativetype == IUP_TYPEIMAGE) { char filename[10240]; char* imgtype = getfileformat(1); if (!imgtype) return IUP_DEFAULT; sprintf(filename, "%s.%s", name, StrLower(imgtype)); if (GetSaveAsFile(filename, imgtype) != -1) { if (!IupSaveImageAsText(elem, filename, imgtype, name)) { #ifdef USE_IM if (!IupSaveImage(elem, filename, imgtype)) { char* err_msg = IupGetGlobal("IUPIM_LASTERROR"); if (err_msg) IupMessage("Error", err_msg); return IUP_DEFAULT; } #else IupMessage("Error", "Failed to save the image."); #endif } } } else IupMessage("Error", "Not an image."); } else IupMessage("Error", "No elements."); return IUP_DEFAULT; } static int hideelem_cb(Ihandle* self) { Ihandle* list = (Ihandle*)IupGetAttribute(self, "mainList"); char* name = IupGetAttribute(list, IupGetAttribute(list, "VALUE")); if (name) /* the list may be empty */ { Ihandle* elem = IupGetHandle(name); char* type = IupGetClassName(elem); if (iupStrEqual(type, "dialog")) IupHide(elem); else { Ihandle* dialog = IupGetDialog(elem); if (dialog) IupHide(dialog); else IupMessage("Error", "Will only hide dialogs."); } } else IupMessage("Error", "No elements."); return IUP_DEFAULT; } static int layoutdlg_cb(Ihandle* self) { Ihandle* list = (Ihandle*)IupGetAttribute(self, "mainList"); char* name = IupGetAttribute(list, IupGetAttribute(list, "VALUE")); if (name) /* the list may be empty */ { Ihandle* elem = IupGetHandle(name); char* type = IupGetClassName(elem); if (iupStrEqual(type, "dialog")) IupShow(IupLayoutDialog(elem)); else { Ihandle* dialog = IupGetDialog(elem); if (dialog) IupShow(IupLayoutDialog(dialog)); else IupMessage("Error", "The element must be a dialog or be inside a dialog."); } } else IupMessage("Error", "No elements."); return IUP_DEFAULT; } static int propertiesdlg_cb(Ihandle* self) { Ihandle* list = (Ihandle*)IupGetAttribute(self, "mainList"); char* name = IupGetAttribute(list, IupGetAttribute(list, "VALUE")); if (name) /* the list may be empty */ { Ihandle* elem = IupGetHandle(name); Ihandle* dlg = IupElementPropertiesDialog(IupGetDialog(list), elem); IupPopup(dlg, IUP_CENTERPARENT, IUP_CENTERPARENT); IupDestroy(dlg); } else IupMessage("Error", "No elements."); return IUP_DEFAULT; } static int showelem_cb(Ihandle* self) { Ihandle* list = (Ihandle*)IupGetAttribute(self, "mainList"); char* name = IupGetAttribute(list, IupGetAttribute(list, "VALUE")); if (name) /* the list may be empty */ { Ihandle* elem = IupGetHandle(name); char* type = IupGetClassName(elem); if (iupStrEqual(type, "dialog")) IupShow(elem); else { Ihandle* dialog = IupGetDialog(elem); if (dialog) IupShow(dialog); else { if (iupStrEqual(type, "menu")) IupPopup(elem, IUP_MOUSEPOS, IUP_MOUSEPOS); else IupMessage("Error", "Will only show dialogs and independent menus."); } } } else IupMessage("Error", "No elements."); return IUP_DEFAULT; } static int list_dbclick_cb(Ihandle* self, int i, char *t) { (void)i; (void)t; showelem_cb(self); return IUP_DEFAULT; } static int list_cb(Ihandle* self, char *t, int i, int v) { if (v == 1) { char str_elem[100]; Ihandle* elem = IupGetHandle(t); Ihandle* label = (Ihandle*)IupGetAttribute(self, "mainLabel"); sprintf(str_elem, "FileTitle: %s - Type: %s", IupGetAttribute(elem, "_FILE_TITLE"), IupGetClassName(elem)); IupStoreAttribute(label, "TITLE", str_elem); } (void)i; return IUP_DEFAULT; } static void mainUpdateInternals(void) { char *names[MAX_NAMES]; int i, num_names = IupGetAllNames(names, MAX_NAMES); for (i = 0; i < num_names; i++) { Ihandle* elem = IupGetHandle(names[i]); if (!IupGetAttribute(elem, "_FILE_TITLE")) IupSetAttribute(elem, "_INTERNAL", "YES"); } } static int checkArray(Ihandle* *ih_array, int count, Ihandle* ih) { int i; for (i = 0; i < count; i++) { if (ih_array[i] == ih) return 0; } return 1; } static int destroyall_cb(Ihandle* self) { char *names[MAX_NAMES]; Ihandle* ih; Ihandle* ih_names[MAX_NAMES]; Ihandle* list = (Ihandle*)IupGetAttribute(self, "mainList"); int i, j=0, num_names = IupGetAllNames(names, MAX_NAMES); memset(ih_names, 0, MAX_NAMES * sizeof(Ihandle*)); for (i = 0; i < num_names; i++) { ih = IupGetHandle(names[i]); if (iupObjectCheck(ih) && IupGetInt(ih, "_INTERNAL") == 0) { ih = IupGetDialog(ih); if (checkArray(ih_names, j, ih)) { ih_names[j] = ih; j++; } } } num_names = j; for (i = 0; i < num_names; i++) { Ihandle* elem = ih_names[i]; if (iupObjectCheck(elem)) { char* type = IupGetClassName(elem); if (iupStrEqual(type, "dialog")) IupDestroy(elem); else { Ihandle* dialog = IupGetDialog(elem); if (!dialog) IupDestroy(elem); } } } IupSetAttribute(list, "1", NULL); IupSetAttribute(list, "VALUE", "1"); return IUP_DEFAULT; } static void mainUpdateList(Ihandle* self, const char* filename) { char *names[MAX_NAMES]; char str_item[20]; Ihandle* list = (Ihandle*)IupGetAttribute(self, "mainList"); int i, n = 0, num_names = IupGetAllNames(names, MAX_NAMES); char* file_title = mainGetFileTitle(filename); for (i = 0; i < num_names; i++) { Ihandle* elem = IupGetHandle(names[i]); if (IupGetInt(elem, "_INTERNAL") == 0) { sprintf(str_item, "%d", n+1); IupSetAttribute(list, str_item, names[i]); if (!IupGetAttribute(elem, "_FILE_TITLE")) IupStoreAttribute(elem, "_FILE_TITLE", file_title); n++; } } sprintf(str_item, "%d", n+1); IupSetAttribute(list, str_item, NULL); if (n != 0) { IupSetAttribute(list, "VALUE", "1"); list_cb(list, IupGetAttribute(list, "1"), -1, 1); } free(file_title); } static int loadimagelib_cb(Ihandle* self) { mainUpdateInternals(); iupImageStockLoadAll(); mainUpdateList(self, "ImageLib"); return IUP_DEFAULT; } static int loadbuffer_cb(Ihandle* self) { char buffer[10240] = ""; if (IupGetText("LED", buffer, 10240)) { char* error; mainUpdateInternals(); error = IupLoadBuffer(buffer); if (error) IupMessage("Error", error); else mainUpdateList(self, ""); } return IUP_DEFAULT; } static int loadled_cb(Ihandle* self) { char filename[10240] = "./*.led"; int ret = IupGetFile(filename); if (ret == 0) { char* error; mainUpdateInternals(); error = IupLoad(filename); if (error) IupMessage("Error", error); else mainUpdateList(self, filename); } return IUP_DEFAULT; } #ifdef USE_IM #ifdef WIN32 static char* ParseFile(const char* dir, const char* FileName, int *offset) { const char* file = FileName; while (*file != 0 && *file != '|') file++; if (file == FileName) return NULL; { int size = (int)(file - FileName) + 1; int dir_size = (int)strlen(dir); char* filename = malloc(size+dir_size+1); memcpy(filename, dir, dir_size); filename[dir_size] = '\\'; memcpy(filename+dir_size+1, FileName, size-1); filename[size+dir_size] = 0; *offset += size; return filename; } } static char* ParseDir(const char* FileName, int *offset) { const char* file = FileName; while (*file != 0 && *file != '|') file++; if (*file == 0) return NULL; { int size = (int)(file - FileName) + 1; char* dir = malloc(size); memcpy(dir, FileName, size-1); dir[size-1] = 0; *offset = size; return dir; } } #endif static void LoadImageFile(Ihandle* self, const char* filename) { Ihandle* new_image = IupLoadImage(filename); if (new_image) { char* file_title = mainGetFileTitle(filename); IupSetHandle(file_title, new_image); free(file_title); mainUpdateList(self, filename); } else { char* err_msg = IupGetGlobal("IUPIM_LASTERROR"); if (err_msg) IupMessage("Error", err_msg); } } static int getOpenFileName(char* file) { Ihandle *gf; int ret; char *value; gf = IupFileDlg(); IupSetAttribute(gf, "DIALOGTYPE", "OPEN"); IupSetAttribute(gf, "TITLE", "Load Image File(s)"); IupSetAttribute(gf, "MULTIPLEFILES", "YES"); IupPopup(gf, IUP_CENTER, IUP_CENTER); value = IupGetAttribute(gf, "VALUE"); if (value) strcpy(file, value); ret = IupGetInt(gf, "STATUS"); IupDestroy(gf); return ret; } static int loadimage_cb(Ihandle* self) { char FileName[2000] = "*.*"; /* Retrieve a file name */ if (getOpenFileName(FileName) == -1) return IUP_DEFAULT; mainUpdateInternals(); #ifdef WIN32 /* parse multiple files */ { int offset; char* filename; char* dir = ParseDir(FileName, &offset); if (dir) { while ((filename = ParseFile(dir, FileName + offset, &offset)) != NULL) { LoadImageFile(self, filename); free(filename); } free(dir); } else LoadImageFile(self, FileName); } #else LoadImageFile(self, FileName); #endif return IUP_DEFAULT; } #endif static int dropfile_cb(Ihandle *self, char* filename) { char* error; mainUpdateInternals(); error = IupLoad(filename); if (error) IupMessage("Error", error); else mainUpdateList(self, filename); return IUP_DEFAULT; } static int use_utf8_cb(Ihandle *self) { (void)self; if (IupGetInt(NULL, "UTF8MODE")) IupSetGlobal("UTF8MODE", "No"); else IupSetGlobal("UTF8MODE", "Yes"); return IUP_DEFAULT; } static Ihandle* mainDialog(void) { Ihandle *main_dialog, *box, *menu, *list, *label; menu = IupMenu( IupSubmenu("File", IupMenu( IupSetCallbacks(IupItem("Load Buffer...", NULL), "ACTION", (Icallback)loadbuffer_cb, NULL), IupSetCallbacks(IupItem("Load Led...", NULL), "ACTION", (Icallback)loadled_cb, NULL), IupSeparator(), IupSetCallbacks(IupItem("Load Image Lib", NULL), "ACTION", (Icallback)loadimagelib_cb, NULL), #ifdef USE_IM IupSetCallbacks(IupItem("Import Image(s)...", NULL), "ACTION", (Icallback)loadimage_cb, NULL), #endif IupSeparator(), IupSetCallbacks(IupSetAttributes(IupItem("Use UTF-8", NULL), "AUTOTOGGLE=Yes"), "ACTION", (Icallback)use_utf8_cb, NULL), IupSetCallbacks(IupItem("Exit", NULL), "ACTION", (Icallback)close_cb, NULL), NULL)), IupSubmenu("Element", IupMenu( IupSetCallbacks(IupItem("Show...", NULL), "ACTION", (Icallback)showelem_cb, NULL), IupSetCallbacks(IupItem("Hide Dialog", NULL), "ACTION", (Icallback)hideelem_cb, NULL), IupSetCallbacks(IupItem("Dialog Layout...", NULL), "ACTION", (Icallback)layoutdlg_cb, NULL), IupSetCallbacks(IupItem("Element Properties...", NULL), "ACTION", (Icallback)propertiesdlg_cb, NULL), IupSeparator(), IupSetCallbacks(IupItem("Destroy All...", NULL), "ACTION", (Icallback)destroyall_cb, NULL), IupSetCallbacks(IupItem("Show All Images...", NULL), "ACTION", (Icallback)showallimages_cb, NULL), IupSeparator(), IupSetCallbacks(IupItem("Save Image...", NULL), "ACTION", (Icallback)saveimage_cb, NULL), IupSetCallbacks(IupItem("Save All Images...", NULL), "ACTION", (Icallback)saveallimages_cb, NULL), IupSetCallbacks(IupItem("Save All Images (One File)...", NULL), "ACTION", (Icallback)saveallimagesone_cb, NULL), NULL)), IupSubmenu("Help", IupMenu( IupSetCallbacks(IupItem("About...", NULL), "ACTION", (Icallback)about_cb, NULL), NULL)), NULL ); IupSetHandle("mainMenu", menu); box = IupVbox( IupLabel("Elements:"), list = IupList(NULL), IupSetAttributes(IupFill(), "SIZE=2"), IupFrame(label = IupLabel("")), NULL); IupSetAttribute(box, "MARGIN", "10x10"); IupSetAttribute(list, "SORT", "YES"); IupSetCallback(list, "ACTION", (Icallback)list_cb); IupSetCallback(list, "DBLCLICK_CB", (Icallback)list_dbclick_cb); IupSetAttribute(list, "SIZE", "150x80"); IupSetAttribute(list, "EXPAND", "YES"); IupSetAttribute(label, "EXPAND", "HORIZONTAL"); main_dialog = IupDialog(box); IupSetAttribute(main_dialog, "TITLE", "IupView"); IupSetAttribute(main_dialog, "MENU", "mainMenu"); IupSetAttribute(main_dialog, "mainList", (char*)list); IupSetAttribute(main_dialog, "mainLabel", (char*)label); IupSetCallback(main_dialog, "CLOSE_CB", (Icallback)close_cb); IupSetCallback(main_dialog, "DROPFILES_CB", (Icallback)dropfile_cb); IupSetAttribute(main_dialog, "_INTERNAL", "YES"); IupSetAttribute(menu, "mainList", (char*)list); IupSetAttribute(menu, "mainLabel", (char*)label); return main_dialog; } static int converter_usage(void) { fprintf(stderr, "iupview [-h] [-t type] [-o out_file] in_files\n" " IUP version: %s\n" " Converts image files to source code that creates an IupImage.\n" " Can pack several files in a single output file.\n" " Each image will correspond to a function called create_image_,\n" " where is the file name of the input image without path.\n" " -h print this help\n" " -t output format, can be LED, LUA or C (default: C)\n" " -o out_file place output in file (default: images.c)\n" , IupVersion()); return -1; } static void replace_dots(char* sstr) { for (; *sstr; sstr++) { if (*sstr == '.') *sstr = '_'; } } static int image_converter(int argc, char **argv) { char* outname = NULL; char* imgtype = NULL; char* intitle; FILE* outfile; while (argc > 1) { char *op = *(argv+1); if (op[0] != '-') break; argc--; argv++; switch (op[1]) { case 'h': return converter_usage(); case 'o': if (argc>1) { argc--; argv++; outname = *argv; break; } else return converter_usage(); case 't': if (argc>1) { argc--; argv++; imgtype = *argv; break; } else return converter_usage(); default: return converter_usage(); } } if (!outname) outname = "images.c"; if (!imgtype) imgtype = "C"; outfile = fopen(outname, "wb"); if (!outfile) { printf("Error: Failed to open the output file."); return -1; } IupOpen(&argc, &argv); while (--argc > 0) { char* inname = *++argv; Ihandle* image = IupLoadImage(inname); if (!image) { printf("Error: %s\n", IupGetGlobal("IUPIM_LASTERROR")); fclose(outfile); IupClose(); return -1; } intitle = iupStrFileGetTitle(inname); replace_dots(intitle); if (!iupImageExportToFile(image, outfile, imgtype, intitle)) { printf("Error: Failed to write to the output file."); free(intitle); IupDestroy(image); fclose(outfile); IupClose(); return -1; } free(intitle); IupDestroy(image); } fclose(outfile); IupClose(); return 0; } int main (int argc, char **argv) { if (argc < 2) { Ihandle* main_dialog; IupOpen(&argc, &argv); IupImageLibOpen(); IupControlsOpen(); IupImOpen(); #ifndef USE_NO_OPENGL IupGLCanvasOpen(); #endif #ifdef STOCK_TEST IupSetGlobal("IMAGESTOCKSIZE", STOCK_TEST); IupSetGlobal("IMAGESTOCKAUTOSCALE", "NO"); #endif IupSetGlobal("GLOBALLAYOUTDLGKEY", "Yes"); /* IupSetGlobal("UTF8MODE", "YES"); */ mainUpdateInternals(); main_dialog = mainDialog(); IupShow(main_dialog); IupMainLoop(); IupClose(); return 0; } else return image_converter(argc, argv); }