view 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 source

#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;
}