mirror of
https://github.com/id-Software/Quake-2-Tools.git
synced 2026-03-20 09:00:02 +01:00
The Quake 2 tools as originally released under the GPL license.
This commit is contained in:
496
texpaint/win_main.c
Normal file
496
texpaint/win_main.c
Normal file
@@ -0,0 +1,496 @@
|
||||
/*
|
||||
===========================================================================
|
||||
Copyright (C) 1997-2006 Id Software, Inc.
|
||||
|
||||
This file is part of Quake 2 Tools source code.
|
||||
|
||||
Quake 2 Tools source code 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 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
Quake 2 Tools source code 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 Quake 2 Tools source code; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
===========================================================================
|
||||
*/
|
||||
|
||||
#include "texpaint.h"
|
||||
|
||||
HINSTANCE main_instance;
|
||||
|
||||
int screen_width, screen_height;
|
||||
|
||||
HWND mainwindow;
|
||||
HWND camerawindow;
|
||||
HWND palettewindow;
|
||||
HWND skinwindow;
|
||||
|
||||
/*
|
||||
=================
|
||||
Sys_Error
|
||||
|
||||
For abnormal program terminations
|
||||
=================
|
||||
*/
|
||||
void Sys_Error (char *error, ...)
|
||||
{
|
||||
va_list argptr;
|
||||
char text[1024];
|
||||
char text2[1024];
|
||||
int err;
|
||||
|
||||
err = GetLastError ();
|
||||
|
||||
va_start (argptr,error);
|
||||
vsprintf (text, error,argptr);
|
||||
va_end (argptr);
|
||||
|
||||
sprintf (text2, "%s\nGetLastError() = %i", text, err);
|
||||
MessageBox(mainwindow, text2, "Error", 0 /* MB_OK */ );
|
||||
|
||||
exit (1);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
======================================================================
|
||||
|
||||
FILE DIALOGS
|
||||
|
||||
======================================================================
|
||||
*/
|
||||
|
||||
qboolean modified;
|
||||
qboolean modified_past_autosave;
|
||||
|
||||
qboolean ConfirmModified (void)
|
||||
{
|
||||
if (!modified)
|
||||
return true;
|
||||
|
||||
if (MessageBox (mainwindow, "This will lose changes to the skin"
|
||||
, "warning", MB_OKCANCEL) == IDCANCEL)
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
OPENFILENAME ofn; /* common dialog box structure */
|
||||
char szDirName[MAX_PATH]; /* directory string */
|
||||
char szFile[260]; /* filename string */
|
||||
char szFileTitle[260]; /* file title string */
|
||||
char szSkinFilter[260] = /* filter string */
|
||||
"Skin texture (*.lbm *.pcx)\0*.lbm;*.pcx\0\0";
|
||||
char szFrameFilter[260] = /* filter string */
|
||||
"Model frame (*.tri)\0*.tri\0\0";
|
||||
char chReplace; /* string separator for szFilter */
|
||||
int i, cbString; /* integer count variables */
|
||||
HANDLE hf; /* file handle */
|
||||
|
||||
void OpenSkinDialog (void)
|
||||
{
|
||||
// strcpy (szDirName, ValueForKey (project_entity, "basepath") );
|
||||
// strcat (szDirName, "\\maps");
|
||||
|
||||
/* Place the terminating null character in the szFile. */
|
||||
|
||||
szFile[0] = '\0';
|
||||
|
||||
/* Set the members of the OPENFILENAME structure. */
|
||||
|
||||
ofn.lStructSize = sizeof(OPENFILENAME);
|
||||
ofn.hwndOwner = mainwindow;
|
||||
ofn.lpstrFilter = szSkinFilter;
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrFile = szFile;
|
||||
ofn.nMaxFile = sizeof(szFile);
|
||||
ofn.lpstrFileTitle = szFileTitle;
|
||||
ofn.nMaxFileTitle = sizeof(szFileTitle);
|
||||
ofn.lpstrInitialDir = szDirName;
|
||||
ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
|
||||
OFN_FILEMUSTEXIST;
|
||||
|
||||
/* Display the Open dialog box. */
|
||||
|
||||
if (!GetOpenFileName(&ofn))
|
||||
return; // canceled
|
||||
|
||||
Skin_LoadFile (ofn.lpstrFile);
|
||||
}
|
||||
|
||||
void OpenFrameDialog (void)
|
||||
{
|
||||
// strcpy (szDirName, ValueForKey (project_entity, "basepath") );
|
||||
// strcat (szDirName, "\\maps");
|
||||
|
||||
/* Place the terminating null character in the szFile. */
|
||||
|
||||
szFile[0] = '\0';
|
||||
|
||||
/* Set the members of the OPENFILENAME structure. */
|
||||
|
||||
ofn.lStructSize = sizeof(OPENFILENAME);
|
||||
ofn.hwndOwner = mainwindow;
|
||||
ofn.lpstrFilter = szFrameFilter;
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrFile = szFile;
|
||||
ofn.nMaxFile = sizeof(szFile);
|
||||
ofn.lpstrFileTitle = szFileTitle;
|
||||
ofn.nMaxFileTitle = sizeof(szFileTitle);
|
||||
ofn.lpstrInitialDir = szDirName;
|
||||
ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
|
||||
OFN_FILEMUSTEXIST;
|
||||
|
||||
/* Display the Open dialog box. */
|
||||
|
||||
if (!GetOpenFileName(&ofn))
|
||||
return; // canceled
|
||||
|
||||
LoadTriFile (ofn.lpstrFile);
|
||||
}
|
||||
|
||||
void SaveSkinDialog (void)
|
||||
{
|
||||
// strcpy (szDirName, ValueForKey (project_entity, "basepath") );
|
||||
// strcat (szDirName, "\\maps");
|
||||
|
||||
/* Place the terminating null character in the szFile. */
|
||||
|
||||
szFile[0] = '\0';
|
||||
|
||||
/* Set the members of the OPENFILENAME structure. */
|
||||
|
||||
ofn.lStructSize = sizeof(OPENFILENAME);
|
||||
ofn.hwndOwner = mainwindow;
|
||||
ofn.lpstrFilter = szSkinFilter;
|
||||
ofn.nFilterIndex = 1;
|
||||
ofn.lpstrFile = szFile;
|
||||
ofn.nMaxFile = sizeof(szFile);
|
||||
ofn.lpstrFileTitle = szFileTitle;
|
||||
ofn.nMaxFileTitle = sizeof(szFileTitle);
|
||||
ofn.lpstrInitialDir = szDirName;
|
||||
ofn.Flags = OFN_SHOWHELP | OFN_PATHMUSTEXIST |
|
||||
OFN_FILEMUSTEXIST;
|
||||
|
||||
/* Display the Open dialog box. */
|
||||
|
||||
if (!GetSaveFileName(&ofn))
|
||||
return; // canceled
|
||||
|
||||
DefaultExtension (ofn.lpstrFile, ".lbm");
|
||||
Skin_SaveFile (ofn.lpstrFile);
|
||||
strcpy (skin_filename, ofn.lpstrFile);
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
|
||||
BOOL bSetupPixelFormat(HDC hDC)
|
||||
{
|
||||
static PIXELFORMATDESCRIPTOR pfd = {
|
||||
sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd
|
||||
1, // version number
|
||||
PFD_DRAW_TO_WINDOW | // support window
|
||||
PFD_SUPPORT_OPENGL | // support OpenGL
|
||||
PFD_DOUBLEBUFFER, // double buffered
|
||||
PFD_TYPE_RGBA, // RGBA type
|
||||
24, // 24-bit color depth
|
||||
0, 0, 0, 0, 0, 0, // color bits ignored
|
||||
0, // no alpha buffer
|
||||
0, // shift bit ignored
|
||||
0, // no accumulation buffer
|
||||
0, 0, 0, 0, // accum bits ignored
|
||||
32, // 32-bit z-buffer
|
||||
0, // no stencil buffer
|
||||
0, // no auxiliary buffer
|
||||
PFD_MAIN_PLANE, // main layer
|
||||
0, // reserved
|
||||
0, 0, 0 // layer masks ignored
|
||||
};
|
||||
int pixelformat = 0;
|
||||
PIXELFORMATDESCRIPTOR newp;
|
||||
|
||||
if ( (pixelformat = ChoosePixelFormat(hDC, &pfd)) == 0 )
|
||||
{
|
||||
printf("%d",GetLastError());
|
||||
Error ("ChoosePixelFormat failed");
|
||||
}
|
||||
if (!SetPixelFormat(hDC, pixelformat, &pfd))
|
||||
Error ("SetPixelFormat failed");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==============================================================================
|
||||
|
||||
MENU
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
|
||||
/* handle all WM_COMMAND messages here */
|
||||
LONG WINAPI CommandHandler (
|
||||
HWND hWnd,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
unsigned short cmd;
|
||||
|
||||
cmd = LOWORD(wParam);
|
||||
|
||||
switch (cmd)
|
||||
{
|
||||
//
|
||||
// file menu
|
||||
//
|
||||
case ID_FILE_RESAMPLESKIN:
|
||||
ResampleSkin ();
|
||||
break;
|
||||
|
||||
case ID_FILE_NEWSKIN:
|
||||
NewSkin ();
|
||||
break;
|
||||
|
||||
case ID_FILE_OPENFRAME:
|
||||
OpenFrameDialog ();
|
||||
break;
|
||||
|
||||
case ID_FILE_OPENSKIN:
|
||||
if (!ConfirmModified())
|
||||
break;
|
||||
OpenSkinDialog ();
|
||||
break;
|
||||
|
||||
case ID_FILE_RELOADSKIN:
|
||||
if (!ConfirmModified())
|
||||
break;
|
||||
Skin_LoadFile (skin_filename);
|
||||
break;
|
||||
|
||||
case ID_FILE_SAVESKIN:
|
||||
Skin_SaveFile (skin_filename);
|
||||
break;
|
||||
|
||||
case ID_FILE_SAVESKINAS:
|
||||
SaveSkinDialog ();
|
||||
break;
|
||||
case ID_FILE_EXIT:
|
||||
if (!ConfirmModified())
|
||||
break;
|
||||
PostQuitMessage (0);
|
||||
break;
|
||||
|
||||
//
|
||||
// edit menu
|
||||
//
|
||||
case ID_EDIT_UNDO:
|
||||
Undo();
|
||||
break;
|
||||
case ID_EDIT_REDO:
|
||||
Redo();
|
||||
break;
|
||||
|
||||
//
|
||||
// view menu
|
||||
//
|
||||
case ID_VIEW_MODELLINES:
|
||||
model_lines ^= 1;
|
||||
CheckMenuItem ( GetSubMenu (GetMenu(mainwindow), MENU_VIEW)
|
||||
, ID_VIEW_MODELLINES
|
||||
, MF_BYCOMMAND | (model_lines ? MF_CHECKED : MF_UNCHECKED) );
|
||||
InvalidateRect (camerawindow, NULL, false);
|
||||
break;
|
||||
case ID_VIEW_TEXTURELINES:
|
||||
skin_lines ^= 1;
|
||||
CheckMenuItem ( GetSubMenu (GetMenu(mainwindow), MENU_VIEW)
|
||||
, ID_VIEW_TEXTURELINES
|
||||
, MF_BYCOMMAND | (skin_lines ? MF_CHECKED : MF_UNCHECKED) );
|
||||
InvalidateRect (skinwindow, NULL, false);
|
||||
break;
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
============
|
||||
WMAIN_WndProc
|
||||
============
|
||||
*/
|
||||
LONG WINAPI WMAIN_WndProc (
|
||||
HWND hWnd,
|
||||
UINT uMsg,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam)
|
||||
{
|
||||
LONG lRet = 1;
|
||||
RECT rect;
|
||||
HDC maindc;
|
||||
|
||||
GetClientRect(hWnd, &rect);
|
||||
|
||||
switch (uMsg)
|
||||
{
|
||||
case WM_CREATE:
|
||||
maindc = GetDC(hWnd);
|
||||
bSetupPixelFormat(maindc);
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
lRet = CommandHandler (hWnd, wParam, lParam);
|
||||
break;
|
||||
|
||||
case WM_CLOSE:
|
||||
if (!ConfirmModified())
|
||||
break;
|
||||
PostQuitMessage (0);
|
||||
break;
|
||||
default:
|
||||
/* pass all unhandled messages to DefWindowProc */
|
||||
lRet = DefWindowProc (hWnd, uMsg, wParam, lParam);
|
||||
break;
|
||||
}
|
||||
|
||||
/* return 1 if handled message, 0 if not */
|
||||
return lRet;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
==============
|
||||
Main_Create
|
||||
==============
|
||||
*/
|
||||
void Main_Create (HINSTANCE hInstance)
|
||||
{
|
||||
WNDCLASS wc;
|
||||
|
||||
/* Register the class */
|
||||
memset (&wc, 0, sizeof(wc));
|
||||
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = (WNDPROC)WMAIN_WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = 0;
|
||||
wc.hCursor = LoadCursor (NULL,IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU2);
|
||||
wc.lpszClassName = "TEXPAINT_MAIN";
|
||||
|
||||
if (!RegisterClass (&wc) )
|
||||
Error ("WCam_Register: failed");
|
||||
|
||||
|
||||
mainwindow = CreateWindow ("TEXPAINT_MAIN" ,
|
||||
"Texpaint",
|
||||
WS_OVERLAPPEDWINDOW |
|
||||
WS_CLIPSIBLINGS |
|
||||
WS_CLIPCHILDREN,
|
||||
0,0,screen_width,screen_height, // size
|
||||
0,
|
||||
NULL, // no menu
|
||||
hInstance,
|
||||
NULL);
|
||||
if (!mainwindow)
|
||||
Error ("Couldn't create main window");
|
||||
|
||||
// GetWindowInfo("mainwindow", &SavedInfo, NULL);
|
||||
ShowWindow (mainwindow, SW_SHOWDEFAULT);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
BOOL SaveWindowInfo(const char *pszName, void *pvBuf, long lSize)
|
||||
{
|
||||
LONG lres;
|
||||
DWORD dwDisp;
|
||||
HKEY hKeyId;
|
||||
|
||||
lres = RegCreateKeyEx(HKEY_CURRENT_USER, "Software\\id\\Texpaint", 0, NULL,
|
||||
REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKeyId, &dwDisp);
|
||||
|
||||
if (lres != ERROR_SUCCESS)
|
||||
return FALSE;
|
||||
|
||||
lres = RegSetValueEx(hKeyId, pszName, 0, REG_BINARY, pvBuf, lSize);
|
||||
|
||||
RegCloseKey(hKeyId);
|
||||
|
||||
if (lres != ERROR_SUCCESS)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
BOOL GetWindowInfo(const char *pszName, void *pvBuf, long *plSize)
|
||||
{
|
||||
HKEY hKey;
|
||||
long lres, lType, lSize;
|
||||
|
||||
if (plSize == NULL)
|
||||
plSize = &lSize;
|
||||
|
||||
lres = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\id\\Texpaint", 0, KEY_READ, &hKey);
|
||||
|
||||
if (lres != ERROR_SUCCESS)
|
||||
return FALSE;
|
||||
|
||||
lres = RegQueryValueEx(hKey, pszName, NULL, &lType, pvBuf, plSize);
|
||||
|
||||
RegCloseKey(hKey);
|
||||
|
||||
if (lres != ERROR_SUCCESS)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
BOOL SaveWindowState(HWND hWnd, const char *pszName)
|
||||
{
|
||||
RECT rc;
|
||||
|
||||
GetWindowRect(hWnd, &rc);
|
||||
MapWindowPoints(NULL, mainwindow, (POINT *)&rc, 2);
|
||||
return SaveWindowInfo(pszName, &rc, sizeof(rc));
|
||||
}
|
||||
|
||||
|
||||
BOOL RestoreWindowState(HWND hWnd, const char *pszName)
|
||||
{
|
||||
RECT rc;
|
||||
LONG lSize = sizeof(rc);
|
||||
|
||||
if (GetWindowInfo(pszName, &rc, &lSize))
|
||||
{
|
||||
if (rc.left < 0)
|
||||
rc.left = 0;
|
||||
if (rc.top < 0)
|
||||
rc.top = 0;
|
||||
if (rc.right < rc.left + 16)
|
||||
rc.right = rc.left + 16;
|
||||
if (rc.bottom < rc.top + 16)
|
||||
rc.bottom = rc.top + 16;
|
||||
|
||||
MoveWindow(hWnd, rc.left, rc.top, rc.right - rc.left,
|
||||
rc.bottom - rc.top, FALSE);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user