You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
5.9 KiB
214 lines
5.9 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose:
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#ifndef PUBLISH_FILE_DIALOG_H
|
||
|
#define PUBLISH_FILE_DIALOG_H
|
||
|
#ifdef _WIN32
|
||
|
#pragma once
|
||
|
#endif
|
||
|
|
||
|
#include <vgui_controls/Frame.h>
|
||
|
#include <vgui_controls/ImageList.h>
|
||
|
#include <vgui_controls/SectionedListPanel.h>
|
||
|
#include <vgui_controls/PHandle.h>
|
||
|
#include <vgui_controls/BitmapImagePanel.h>
|
||
|
#include <filesystem.h>
|
||
|
#include "vgui/MouseCode.h"
|
||
|
#include "vgui/IScheme.h"
|
||
|
#include "steam/steam_api.h"
|
||
|
#include "utlmap.h"
|
||
|
#include "bitmap/bitmap.h"
|
||
|
#include "workshop/ugc_utils.h"
|
||
|
|
||
|
struct PublishedFileDetails_t
|
||
|
{
|
||
|
SteamUGCDetails_t publishedFileDetails;
|
||
|
const char *lpszFilename;
|
||
|
};
|
||
|
|
||
|
#define APPID_PORTAL2 852
|
||
|
|
||
|
using namespace vgui;
|
||
|
|
||
|
class CBitmapPanel;
|
||
|
|
||
|
enum FileOpenMode_t {
|
||
|
FILEOPEN_NONE,
|
||
|
FILEOPEN_MAIN_FILE,
|
||
|
FILEOPEN_PREVIEW
|
||
|
};
|
||
|
|
||
|
struct EntityToTagMap_t
|
||
|
{
|
||
|
const char *lpszEntityName;
|
||
|
const char *lpszTagName;
|
||
|
const char *lpszKey;
|
||
|
const char *lpszValue;
|
||
|
};
|
||
|
|
||
|
enum PublishedFileDetailsField_t
|
||
|
{
|
||
|
PFILE_FIELD_TITLE = (1<<0),
|
||
|
PFILE_FIELD_DESCRIPTION = (1<<1),
|
||
|
PFILE_FIELD_FILE = (1<<2),
|
||
|
PFILE_FIELD_PREVIEW = (1<<3),
|
||
|
};
|
||
|
|
||
|
enum eFilterType_t
|
||
|
{
|
||
|
IMPORT_FILTER_NONE = 0,
|
||
|
IMPORT_FILTER_COSMETIC,
|
||
|
IMPORT_FILTER_OTHER,
|
||
|
IMPORT_FILTER_MAP,
|
||
|
};
|
||
|
|
||
|
// TODO: Move to P2 version
|
||
|
#define TAG_GAME_MODE_SINGLEPLAYER "Singleplayer"
|
||
|
#define TAG_GAME_MODE_COOP "Co-Op"
|
||
|
//
|
||
|
|
||
|
// This is the size for the preview for P2 map preview images
|
||
|
#define PREVIEW_WIDTH 225
|
||
|
#define PREVIEW_HEIGHT 152
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Main dialog for media browser
|
||
|
//-----------------------------------------------------------------------------
|
||
|
class CPrepareFileThread;
|
||
|
class CFilePublishDialog : public Frame
|
||
|
{
|
||
|
DECLARE_CLASS_SIMPLE( CFilePublishDialog, Frame );
|
||
|
|
||
|
public:
|
||
|
|
||
|
enum ErrorCode_t
|
||
|
{
|
||
|
kNoError,
|
||
|
kFailedToPublishFile,
|
||
|
kFailedToUpdateFile,
|
||
|
kFailedToPrepareFile,
|
||
|
kSteamCloudNotAvailable,
|
||
|
kSteamExceededCloudQuota,
|
||
|
kFailedToWriteToSteamCloud,
|
||
|
kFileNotFound,
|
||
|
kNeedTitleAndDescription,
|
||
|
kFailedFileValidation,
|
||
|
kFailedFileTooLarge,
|
||
|
kFailedFileNotFound,
|
||
|
kFailedUserModifiedFile,
|
||
|
kInvalidMapName
|
||
|
};
|
||
|
|
||
|
enum StatusCode_t
|
||
|
{
|
||
|
kPublishing,
|
||
|
kUpdating,
|
||
|
};
|
||
|
|
||
|
CFilePublishDialog( Panel *parent, const char *name, PublishedFileDetails_t *pDetails );
|
||
|
virtual ~CFilePublishDialog();
|
||
|
|
||
|
virtual void PerformLayout();
|
||
|
|
||
|
virtual void SetFile( const char *lpszFilename, bool bImported = false );
|
||
|
|
||
|
protected:
|
||
|
virtual void OnCommand( const char *command );
|
||
|
virtual void ApplySchemeSettings( vgui::IScheme *pScheme );
|
||
|
virtual void OnTick( void );
|
||
|
|
||
|
// Override these functions to publish files for different app types
|
||
|
virtual ErrorCode_t ValidateFile( const char *lpszFilename );
|
||
|
virtual AppId_t GetTargetAppID( void ) { return APPID_PORTAL2; }
|
||
|
virtual unsigned int DesiredPreviewHeight( void ) { return PREVIEW_HEIGHT; }
|
||
|
virtual unsigned int DesiredPreviewWidth( void ) { return PREVIEW_WIDTH; }
|
||
|
// Decides which type to use for publishing this file
|
||
|
virtual EWorkshopFileType WorkshipFileTypeForFile( const char *pszFileName ) { return k_EWorkshopFileTypeCommunity; }
|
||
|
virtual bool BForceSquarePreviewImage( void ) { return false; } // Force preview images to be square
|
||
|
virtual const char *GetPreviewFileTypes( void ) { return "*.jpg"; }
|
||
|
virtual const char *GetPreviewFileTypeDescriptions( void ) { return "JPEG Files (*.jpg)"; }
|
||
|
virtual const char *GetFileTypes( eFilterType_t eType = IMPORT_FILTER_NONE ) { return "*.bsp"; }
|
||
|
virtual const char *GetFileTypeDescriptions( eFilterType_t eType = IMPORT_FILTER_NONE ) { return "BSP Files (*.bsp)"; }
|
||
|
virtual const char *GetResFile() const { return "PublishFileDialog.res"; }
|
||
|
virtual void ErrorMessage( ErrorCode_t errorCode, KeyValues *pkvTokens = NULL );
|
||
|
virtual void PopulateTags( SteamParamStringArray_t &strArray ) {}
|
||
|
virtual const char* GetStatusString( StatusCode_t statusCode );
|
||
|
virtual void ShowStatusWindow( StatusCode_t statusCode );
|
||
|
virtual void HideStatusWindow( void );
|
||
|
|
||
|
virtual void PopulateEditFields( void );
|
||
|
void DownloadPreviewImage( void );
|
||
|
|
||
|
void SetPublishButtonState( void );
|
||
|
|
||
|
bool UpdateFile( void );
|
||
|
bool UpdateFileInternal( void );
|
||
|
void GetPreviewFilename( char *szOut, size_t outLen );
|
||
|
|
||
|
bool PublishFile();
|
||
|
void SetPreviewImage( const char *lpszFilename );
|
||
|
|
||
|
void PerformSquarize();
|
||
|
Bitmap_t &GetPreviewBitmap();
|
||
|
|
||
|
void ErrorMessage( const char *lpszText );
|
||
|
|
||
|
void StartPrepareFile();
|
||
|
|
||
|
void OnFilePrepared( bool bSucceeded );
|
||
|
|
||
|
inline bool IsSourceImageSquare() const
|
||
|
{
|
||
|
// We must know the size
|
||
|
Assert( m_imgSource.IsValid() );
|
||
|
return
|
||
|
m_imgSource.Width()*99 < m_imgSource.Height()*100
|
||
|
&& m_imgSource.Height()*99 < m_imgSource.Width()*100;
|
||
|
}
|
||
|
|
||
|
FileOpenMode_t m_fileOpenMode;
|
||
|
|
||
|
bool m_bValidFile;
|
||
|
bool m_bValidJpeg;
|
||
|
|
||
|
CBitmapPanel *m_pCroppedTextureImagePanel;
|
||
|
|
||
|
Bitmap_t m_imgSource; // original resolution and aspect
|
||
|
Bitmap_t m_imgSquare;
|
||
|
Bitmap_t m_imgTemp;
|
||
|
|
||
|
PublishedFileId_t m_nFileID;
|
||
|
PublishedFileDetails_t m_FileDetails;
|
||
|
unsigned int m_nFileDetailsChanges;
|
||
|
|
||
|
vgui::MessageBox *m_pStatusBox;
|
||
|
vgui::TextEntry *m_pFileTitle;
|
||
|
vgui::TextEntry *m_pFileDescription;
|
||
|
vgui::Label *m_pFilename;
|
||
|
vgui::Button *m_pPublishButton;
|
||
|
|
||
|
CCallResult<CFilePublishDialog, CreateItemResult_t> m_callbackCreateItem;
|
||
|
void Steam_OnCreateItem( CreateItemResult_t *pResult, bool bError );
|
||
|
|
||
|
CCallResult<CFilePublishDialog, SubmitItemUpdateResult_t> m_callbackPublishFile;
|
||
|
void Steam_OnPublishFile( SubmitItemUpdateResult_t *pResult, bool bError );
|
||
|
|
||
|
// TODO Switch to using the auto-downloaded ISteamUGC previews
|
||
|
CUGCFileRequest m_UGCPreviewFileRequest;
|
||
|
bool m_bPreviewDownloadPending;
|
||
|
bool m_bAddingNewFile;
|
||
|
|
||
|
CPrepareFileThread *m_pPrepareFileThread;
|
||
|
|
||
|
MESSAGE_FUNC_CHARPTR( OnFileSelected, "FileSelected", fullpath );
|
||
|
};
|
||
|
|
||
|
|
||
|
extern CFilePublishDialog *g_pSteamFilePublishDialog;
|
||
|
|
||
|
|
||
|
#endif // PUBLISH_FILE_DIALOG_H
|