Mercurial > msvpvf
diff src/iup.c @ 88:af4ed765c1ac
*: add IUP GUI
a lot simpler than win32, but I assume there's more going on in
the background that I don't know about :)
author | Paper <paper@tflc.us> |
---|---|
date | Mon, 14 Jul 2025 02:39:24 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/iup.c Mon Jul 14 02:39:24 2025 -0400 @@ -0,0 +1,231 @@ +#include "common.h" + +#include <iup.h> +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> + +struct msvpvf { + struct { + Ihandle *main; /* main window */ + Ihandle *program; /* listbox, which program (Vegas Pro/Movie Studio) */ + Ihandle *ver; /* which version */ + Ihandle *vbox; /* main window vbox */ + Ihandle *ofilebtn; /* open file button */ + Ihandle *sfilebtn; /* save file button */ + Ihandle *info; /* opened file info */ + Ihandle *about_button; /* about button */ + Ihandle *about; /* about dialog */ + Ihandle *about_text; /* about text */ + } dlg; + + /* XXX this should be FILE *, so we can't randomly lose the file */ + char *open_file; + + uint8_t version; + enum types type; +}; + +static int msvpvf_info_update(struct msvpvf *m) +{ + uint8_t ver; + enum types type; + char *a; + + if (!m) return -1; + + { + FILE *i; + + i = fopen(m->open_file, "rb"); + if (!i) return 0; + + get_file_information(i, &ver, &type); + fclose(i); + } + + a = msvpvf_asprintf("File version: %s %d", type_names[type], (int)ver); + if (!a) return 0; + IupSetStrAttribute(m->dlg.info, "VALUE", a); + free(a); + + return 1; +} + +static int open_file(Ihandle *ih) +{ + /* why is IupGetAttribute not void * */ + struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf"); + const char *ofile; + Ihandle *dlg = IupFileDlg(); + + IupSetAttribute(dlg, "DIALOGTYPE", "OPEN"); + IupSetAttribute(dlg, "TITLE", "Vegas Pro / Movie Studio version spoofer"); + IupSetAttributes(dlg, "FILTER = \"*.veg;*.vf\", FILTERINFO = \"Project files\""); + + IupPopup(dlg, IUP_CURRENT, IUP_CURRENT); + + if (IupGetInt(dlg, "STATUS") != -1) { + m->open_file = str_dup(IupGetAttribute(dlg, "VALUE")); + if (!msvpvf_info_update(m)) + free(m->open_file); + } + + IupDestroy(dlg); + return 0; +} + +static int save_file(Ihandle *ih) +{ + struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf"); + Ihandle *dlg; + + if (!m->open_file) + return 0; + + dlg = IupFileDlg(); + + IupSetAttribute(dlg, "DIALOGTYPE", "SAVE"); + IupSetAttribute(dlg, "TITLE", "Vegas Pro / Movie Studio version spoofer"); + /* FIXME add *.vf here */ + IupSetAttributes(dlg, "FILTER = \"*.veg;*.vf\", FILTERINFO = \"Project files\""); + IupSetAttribute(dlg, "EXTDEFAULT", (m->type == TYPES_VF ? "vf" : "veg")); + + IupPopup(dlg, IUP_CURRENT, IUP_CURRENT); + + if (IupGetInt(dlg, "STATUS") != -1) { + FILE *i, *o; + const char *sname; + + sname = IupGetAttribute(dlg, "VALUE"); + + i = fopen(m->open_file, "rb"); + o = fopen(sname, "wb"); + + if (i && o && (copy_file(i, o) >= 0)) + set_file_information(o, m->version, m->type); + + if (i) fclose(i); + if (o) fclose(o); + } + + IupDestroy(dlg); + return 0; +} + +static int type_cb(Ihandle *ih, char *text, int item, int state) +{ + struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf"); + + switch (item) { + case 1: m->type = TYPES_VEG; break; + case 2: m->type = TYPES_VF; break; + default: abort(); + } + + return 0; +} + +static int ver_cb(Ihandle *ih) +{ + struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf"); + + /* epic */ + m->version = IupGetIntId(ih, "SPINVALUE", 11); + + return 0; +} + +static int about_cb(Ihandle *ih) +{ + struct msvpvf *m = (struct msvpvf *)IupGetAttribute(ih, "msvpvf"); + + IupPopup(m->dlg.about, IUP_CURRENT, IUP_CURRENT); + + return 0; +} + +int main(int argc, char *argv[]) +{ + struct msvpvf msvpvf; + static const char about_text[] = { +#embed "../LICENSE" + , 0 /* nul terminate */ + }; + + IupOpen(&argc, &argv); + IupSetLanguage("ENGLISH"); + + // FIXME: use UTF-8 filenames on Windows + + msvpvf.dlg.ofilebtn = IupButton("Open File", NULL); + IupSetAttribute(msvpvf.dlg.ofilebtn, "msvpvf", (char *)&msvpvf); + IupSetCallback(msvpvf.dlg.ofilebtn, "ACTION", open_file); + + msvpvf.dlg.info = IupText(NULL); + IupSetAttribute(msvpvf.dlg.info, "READONLY", "YES"); + IupSetAttribute(msvpvf.dlg.info, "VISIBLECOLUMNS", "15"); + IupSetAttribute(msvpvf.dlg.info, "VALUE", "No file opened!"); + IupSetAttribute(msvpvf.dlg.info, "ALIGNMENT", "ACENTER"); + IupSetAttribute(msvpvf.dlg.info, "CANFOCUS", "NO"); + IupSetAttribute(msvpvf.dlg.info, "BORDER", "NO"); + + msvpvf.dlg.program = IupList(NULL); + IupSetAttribute(msvpvf.dlg.program, "msvpvf", (char *)&msvpvf); + IupSetAttribute(msvpvf.dlg.program, "ALIGNMENT", "ACENTER"); + IupSetAttribute(msvpvf.dlg.program, "1", "Vegas Pro"); + IupSetAttribute(msvpvf.dlg.program, "2", "Movie Studio"); + IupSetAttribute(msvpvf.dlg.program, "3", NULL); + IupSetAttribute(msvpvf.dlg.program, "VALUE", "1"); + IupSetAttribute(msvpvf.dlg.program, "EXPAND", "YES"); + IupSetCallback(msvpvf.dlg.program, "ACTION", (Icallback)type_cb); + msvpvf.type = TYPES_VEG; + + msvpvf.dlg.ver = IupText(NULL); + IupSetAttribute(msvpvf.dlg.ver, "msvpvf", (char *)&msvpvf); + IupSetAttribute(msvpvf.dlg.ver, "SPIN", "YES"); + IupSetAttribute(msvpvf.dlg.ver, "SPINMAX", "21"); + IupSetAttribute(msvpvf.dlg.ver, "SPINMIN", "8"); + IupSetAttribute(msvpvf.dlg.ver, "SPINVALUE", "11"); /* default */ + IupSetCallback(msvpvf.dlg.ver, "ACTION", ver_cb); + msvpvf.version = 11; + + msvpvf.dlg.sfilebtn = IupButton("Save File", NULL); + IupSetAttribute(msvpvf.dlg.sfilebtn, "msvpvf", (char *)&msvpvf); + IupSetCallback(msvpvf.dlg.sfilebtn, "ACTION", save_file); + + msvpvf.dlg.about_button = IupButton("About msvpvf", NULL); + IupSetAttribute(msvpvf.dlg.about_button, "msvpvf", (char *)&msvpvf); + IupSetCallback(msvpvf.dlg.about_button, "ACTION", about_cb); + + msvpvf.dlg.vbox = IupVbox(msvpvf.dlg.ofilebtn, msvpvf.dlg.info, msvpvf.dlg.program, msvpvf.dlg.ver, msvpvf.dlg.sfilebtn, msvpvf.dlg.about_button, NULL); + IupSetAttribute(msvpvf.dlg.vbox, "ALIGNMENT", "ACENTER"); + IupSetAttribute(msvpvf.dlg.vbox, "GAP", "10"); + IupSetAttribute(msvpvf.dlg.vbox, "MARGIN", "10x10"); + IupSetAttribute(msvpvf.dlg.vbox, "EXPAND", "YES"); + + msvpvf.dlg.main = IupDialog(msvpvf.dlg.vbox); + IupSetAttribute(msvpvf.dlg.main, "TITLE", "Vegas Pro / Movie Studio version spoofer"); + //IupSetAttribute(msvpvf.dlg.main, "MINSIZE", "225x200"); + + msvpvf.dlg.about_text = IupText(NULL); + IupSetAttribute(msvpvf.dlg.about_text, "READONLY", "YES"); + IupSetAttribute(msvpvf.dlg.about_text, "VALUE", about_text); + IupSetAttribute(msvpvf.dlg.about_text, "CANFOCUS", "NO"); + IupSetAttribute(msvpvf.dlg.about_text, "BORDER", "NO"); + IupSetAttribute(msvpvf.dlg.about_text, "MULTILINE", "YES"); + IupSetAttribute(msvpvf.dlg.about_text, "EXPAND", "YES"); + IupSetAttribute(msvpvf.dlg.about_text, "PADDING", "10x10"); + + msvpvf.dlg.about = IupDialog(msvpvf.dlg.about_text); + IupSetAttribute(msvpvf.dlg.about, "TITLE", "About Vegas Pro / Movie Studio version spoofer"); + IupSetAttribute(msvpvf.dlg.about, "MINSIZE", "500x300"); + + IupShowXY(msvpvf.dlg.main, IUP_CENTER, IUP_CENTER); + + IupMainLoop(); + + IupClose(); + + return 0; +}