12 Commits

Author SHA1 Message Date
Michael J. Seiferling
0ed067e36f Updated readme for v1.1.4 2018-08-23 13:27:53 -06:00
Michael J. Seiferling
bca2fe2239 Removed ico compression for issue #146 2018-08-23 12:42:28 -06:00
Michael J. Seiferling
fa5d03ef52 Fixed sort logic for issue #145 2018-08-23 10:26:50 -06:00
Michael J. Seiferling
998a680999 Removed icon file extraction 2018-08-22 11:18:58 -06:00
Michael J. Seiferling
f5972da9eb Prevent file locking of custom icons 2018-08-22 10:26:19 -06:00
MikeMaximus
794b0f9908 Stop useless manifest conflict checks 2018-08-01 10:02:46 -06:00
Michael J. Seiferling
daa5f928bf Fixes and changes for issue #142 2018-07-30 08:44:39 -06:00
Michael J. Seiferling
72e3ccb661 Fixed precision of total hours on session viewer 2018-07-29 16:00:57 -06:00
Michael J. Seiferling
9e7a4b5efc Tweaks to icon extraction and error handling 2018-07-29 09:06:33 -06:00
Michael J. Seiferling
692deaaef9 Changes for issue #142 2018-07-25 09:21:50 -06:00
Michael J. Seiferling
a3572abb3d Add special folder verification for issue #144 2018-07-24 13:53:52 -06:00
MikeMaximus
2680f857a9 Update README.md 2018-07-08 09:43:18 -06:00
12 changed files with 168 additions and 61 deletions
+4 -4
View File
@@ -382,7 +382,7 @@ Public Class frmGameManager
If sNewPath <> String.Empty Then If sNewPath <> String.Empty Then
txtIcon.Text = sNewPath txtIcon.Text = sNewPath
If IO.File.Exists(sNewPath) Then If IO.File.Exists(sNewPath) Then
pbIcon.Image = Image.FromFile(sNewPath) pbIcon.Image = mgrCommon.SafeIconFromFile(sNewPath)
End If End If
End If End If
End Sub End Sub
@@ -794,7 +794,7 @@ Public Class frmGameManager
For Each oBackup In oBackupData For Each oBackup In oBackupData
'Delete the specific remote manifest entry 'Delete the specific remote manifest entry
mgrManifest.DoManifestDeletebyManifestID(oBackup, mgrSQLite.Database.Remote) mgrManifest.DoManifestDeleteByManifestID(oBackup, mgrSQLite.Database.Remote)
'Delete referenced backup file from the backup folder 'Delete referenced backup file from the backup folder
mgrCommon.DeleteFile(BackupFolder & oBackup.FileName) mgrCommon.DeleteFile(BackupFolder & oBackup.FileName)
'Check for sub-directory and delete if empty (we need to do this every pass just in case the user had a mix of settings at one point) 'Check for sub-directory and delete if empty (we need to do this every pass just in case the user had a mix of settings at one point)
@@ -802,7 +802,7 @@ Public Class frmGameManager
Next Next
'Delete local manifest entry 'Delete local manifest entry
mgrManifest.DoManifestDeletebyMonitorID(CurrentBackupItem, mgrSQLite.Database.Local) mgrManifest.DoManifestDeleteByMonitorID(CurrentBackupItem, mgrSQLite.Database.Local)
LoadBackupData() LoadBackupData()
FillData() FillData()
@@ -868,7 +868,7 @@ Public Class frmGameManager
'Icon 'Icon
If IO.File.Exists(oApp.Icon) Then If IO.File.Exists(oApp.Icon) Then
pbIcon.Image = Image.FromFile(oApp.Icon) pbIcon.Image = mgrCommon.SafeIconFromFile(oApp.Icon)
Else Else
pbIcon.Image = Icon_Unknown pbIcon.Image = Icon_Unknown
End If End If
+33 -8
View File
@@ -526,7 +526,7 @@ Public Class frmMain
sIcon = fbBrowser.FileName sIcon = fbBrowser.FileName
If File.Exists(sIcon) Then If File.Exists(sIcon) Then
oProcess.GameInfo.Icon = sIcon oProcess.GameInfo.Icon = sIcon
pbIcon.Image = Image.FromFile(sIcon) pbIcon.Image = mgrCommon.SafeIconFromFile(sIcon)
mgrMonitorList.DoListUpdate(oProcess.GameInfo) mgrMonitorList.DoListUpdate(oProcess.GameInfo)
End If End If
End If End If
@@ -577,6 +577,25 @@ Public Class frmMain
End If End If
End Sub End Sub
Private Sub SetGameIcon()
Dim ic As Icon
Dim oBitmap As Bitmap
Try
'Grab icon from the executable
ic = System.Drawing.Icon.ExtractAssociatedIcon(oProcess.FoundProcess.MainModule.FileName)
oBitmap = New Bitmap(ic.ToBitmap)
ic.Dispose()
'Set the icon, we need to use an intermediary object to prevent file locking
pbIcon.Image = oBitmap
Catch ex As Exception
UpdateLog(mgrCommon.FormatString(frmMain_ErrorGameIcon), False, ToolTipIcon.Error)
UpdateLog(mgrCommon.FormatString(App_GenericError, ex.Message), False,, False)
End Try
End Sub
Private Sub SetGameInfo(Optional ByVal bMulti As Boolean = False) Private Sub SetGameInfo(Optional ByVal bMulti As Boolean = False)
Dim sFileName As String = String.Empty Dim sFileName As String = String.Empty
Dim sFileVersion As String = String.Empty Dim sFileVersion As String = String.Empty
@@ -586,19 +605,19 @@ Public Class frmMain
lblStatus1.Text = String.Empty lblStatus1.Text = String.Empty
lblStatus2.Text = String.Empty lblStatus2.Text = String.Empty
lblStatus3.Text = String.Empty lblStatus3.Text = String.Empty
pbIcon.Image = Icon_Unknown
'Set Game Icon
If Not mgrCommon.IsUnix Then SetGameIcon()
'Get Process Information
Try Try
Dim ic As Icon = System.Drawing.Icon.ExtractAssociatedIcon(oProcess.FoundProcess.MainModule.FileName)
pbIcon.Image = ic.ToBitmap
'Set Game Details 'Set Game Details
sFileName = oProcess.FoundProcess.MainModule.FileName sFileName = oProcess.FoundProcess.MainModule.FileName
sFileVersion = oProcess.FoundProcess.MainModule.FileVersionInfo.FileVersion sFileVersion = oProcess.FoundProcess.MainModule.FileVersionInfo.FileVersion
sCompanyName = oProcess.FoundProcess.MainModule.FileVersionInfo.CompanyName sCompanyName = oProcess.FoundProcess.MainModule.FileVersionInfo.CompanyName
Catch ex As Exception Catch ex As Exception
pbIcon.Image = Icon_Unknown UpdateLog(mgrCommon.FormatString(frmMain_ErrorGameDetails), False, ToolTipIcon.Error)
UpdateLog(mgrCommon.FormatString(App_GenericError, ex.Message), False,, False)
End Try End Try
'Get Game Details 'Get Game Details
@@ -621,7 +640,7 @@ Public Class frmMain
'Check for a custom icon & details 'Check for a custom icon & details
If File.Exists(oProcess.GameInfo.Icon) Then If File.Exists(oProcess.GameInfo.Icon) Then
pbIcon.Image = Image.FromFile(oProcess.GameInfo.Icon) pbIcon.Image = mgrCommon.SafeIconFromFile(oProcess.GameInfo.Icon)
End If End If
If sFileName = String.Empty Then If sFileName = String.Empty Then
If oProcess.GameInfo.ProcessPath <> String.Empty Then If oProcess.GameInfo.ProcessPath <> String.Empty Then
@@ -1051,6 +1070,12 @@ Public Class frmMain
Exit Sub Exit Sub
End If End If
'Check Special Paths
If Not mgrPath.CheckSpecialPaths Then
bInitFail = True
Exit Sub
End If
'Local Database Check 'Local Database Check
VerifyDBVersion(mgrSQLite.Database.Local) VerifyDBVersion(mgrSQLite.Database.Local)
LocalDatabaseCheck() LocalDatabaseCheck()
+15 -3
View File
@@ -68,7 +68,7 @@ Public Class frmSessions
dgSessions.Rows.Add(New Object() {dr("MonitorID"), dr("Name"), dr("Start"), dStart, dr("End"), dEnd, dHours}) dgSessions.Rows.Add(New Object() {dr("MonitorID"), dr("Name"), dr("Start"), dStart, dr("End"), dEnd, dHours})
Next Next
lblTotalHours.Text = mgrCommon.FormatString(frmSessions_lblTotalHours, dTotalHours) lblTotalHours.Text = mgrCommon.FormatString(frmSessions_lblTotalHours, Math.Round(dTotalHours, 2))
dgSessions.AutoResizeColumns() dgSessions.AutoResizeColumns()
End Sub End Sub
@@ -290,9 +290,21 @@ Public Class frmSessions
Select Case iDataTypeCol Select Case iDataTypeCol
Case iDataType.DecimalType Case iDataType.DecimalType
iCompareResult = If(CDec(dgRow1.Cells(iSortCol).Value) < CDec(dgRow2.Cells(iSortCol).Value), -1, 1) If (CDec(dgRow1.Cells(iSortCol).Value) = CDec(dgRow2.Cells(iSortCol).Value)) Then
iCompareResult = 0
ElseIf (CDec(dgRow1.Cells(iSortCol).Value) < CDec(dgRow2.Cells(iSortCol).Value)) Then
iCompareResult = -1
Else
iCompareResult = 1
End If
Case iDataType.IntType Case iDataType.IntType
iCompareResult = If(CInt(dgRow1.Cells(iSortCol).Value) < CInt(dgRow2.Cells(iSortCol).Value), -1, 1) If (CInt(dgRow1.Cells(iSortCol).Value) = CInt(dgRow2.Cells(iSortCol).Value)) Then
iCompareResult = 0
ElseIf (CInt(dgRow1.Cells(iSortCol).Value) < CInt(dgRow2.Cells(iSortCol).Value)) Then
iCompareResult = -1
Else
iCompareResult = 1
End If
Case iDataType.StringType Case iDataType.StringType
iCompareResult = String.Compare(CStr(dgRow1.Cells(iSortCol).Value), CStr(dgRow2.Cells(iSortCol).Value)) iCompareResult = String.Compare(CStr(dgRow1.Cells(iSortCol).Value), CStr(dgRow2.Cells(iSortCol).Value))
Case iDataType.DateTimeType Case iDataType.DateTimeType
+3
View File
@@ -143,12 +143,15 @@ Public Class mgrBackup
End If End If
End If End If
'A manifest check is only required when "Save Multiple Backups" is disabled
If Not oGame.AppendTimeStamp Then
If mgrRestore.CheckManifest(oGame.ID) Then If mgrRestore.CheckManifest(oGame.ID) Then
If mgrCommon.ShowMessage(mgrBackup_ConfirmManifestConflict, oGame.Name, MsgBoxStyle.YesNo) = MsgBoxResult.No Then If mgrCommon.ShowMessage(mgrBackup_ConfirmManifestConflict, oGame.Name, MsgBoxStyle.YesNo) = MsgBoxResult.No Then
RaiseEvent UpdateLog(mgrBackup_ErrorManifestConflict, False, ToolTipIcon.Error, True) RaiseEvent UpdateLog(mgrBackup_ErrorManifestConflict, False, ToolTipIcon.Error, True)
Return False Return False
End If End If
End If End If
End If
If oSettings.ShowOverwriteWarning And File.Exists(sBackupFile) And Not oGame.AppendTimeStamp Then If oSettings.ShowOverwriteWarning And File.Exists(sBackupFile) And Not oGame.AppendTimeStamp Then
If oGame.AbsolutePath Then If oGame.AbsolutePath Then
+12
View File
@@ -65,6 +65,18 @@ Public Class mgrCommon
Return oFormatter.Deserialize(oStream) Return oFormatter.Deserialize(oStream)
End Function End Function
Public Shared Function SafeIconFromFile(ByVal sPath As String) As Image
Dim oImage As Image
Dim oReturnImage As Image
Dim oImageSize As Size = New Size(48, 48)
oImage = Image.FromFile(sPath)
oReturnImage = New Bitmap(oImage, oImageSize)
oImage.Dispose()
Return oReturnImage
End Function
Public Shared Function IsAddress(ByVal sURL As String) As Boolean Public Shared Function IsAddress(ByVal sURL As String) As Boolean
If (sURL.IndexOf("http://", 0, StringComparison.CurrentCultureIgnoreCase) > -1) Or (sURL.IndexOf("https://", 0, StringComparison.CurrentCultureIgnoreCase) > -1) Then If (sURL.IndexOf("http://", 0, StringComparison.CurrentCultureIgnoreCase) > -1) Or (sURL.IndexOf("https://", 0, StringComparison.CurrentCultureIgnoreCase) > -1) Then
Return True Return True
+40 -12
View File
@@ -202,6 +202,28 @@ Public Class mgrPath
Return sResult Return sResult
End Function End Function
Public Shared Function CheckSpecialPaths() As Boolean
Dim hshEnvs As New Hashtable
Dim bNoError As Boolean = True
hshEnvs.Add("Documents", Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
hshEnvs.Add("AppDataRoaming", Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData))
hshEnvs.Add("AppDataLocal", Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData))
If Not mgrCommon.IsUnix Then
hshEnvs.Add("UserData", Environment.GetFolderPath(Environment.SpecialFolder.UserProfile))
hshEnvs.Add("PublicDocuments", Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments))
End If
For Each de As DictionaryEntry In hshEnvs
If de.Value = String.Empty Then
mgrCommon.ShowMessage(mgrPath_SpecialPathError, de.Key, MsgBoxStyle.Critical)
bNoError = False
End If
Next
Return bNoError
End Function
Public Shared Function ReplaceSpecialPaths(sValue As String) As String Public Shared Function ReplaceSpecialPaths(sValue As String) As String
Dim sMyDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) Dim sMyDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Dim sPublicDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments) Dim sPublicDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments)
@@ -246,39 +268,45 @@ Public Class mgrPath
Public Shared Function ReverseSpecialPaths(sValue As String) As String Public Shared Function ReverseSpecialPaths(sValue As String) As String
Dim sMyDocs As String = "*mydocs*" Dim sMyDocs As String = "*mydocs*"
Dim sEnvMyDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
Dim sPublicDocs As String = "*publicdocs*" Dim sPublicDocs As String = "*publicdocs*"
Dim sAppDataRoaming As String = "*appdatalocal*" Dim sEnvPublicDocs As String = Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments)
Dim sAppDataLocal As String = "*appdataroaming*" Dim sAppDataLocal As String = "*appdatalocal*"
Dim sEnvAppDataLocal As String = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
Dim sAppDataRoaming As String = "*appdataroaming*"
Dim sEnvAppDataRoaming As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
Dim sCurrentUser As String = "*currentuser*" Dim sCurrentUser As String = "*currentuser*"
Dim sEnvCurrentUser As String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
Dim oCustomVariable As clsPathVariable Dim oCustomVariable As clsPathVariable
For Each oCustomVariable In hshCustomVariables.Values For Each oCustomVariable In hshCustomVariables.Values
If sValue.Contains(oCustomVariable.Path) Then If sValue.Contains(oCustomVariable.Path) Then
Return sValue.Replace(oCustomVariable.Path, oCustomVariable.FormattedName) Return sValue.Replace(oCustomVariable.Path, oCustomVariable.FormattedName)
End If End If
Next Next
If sValue.Contains(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)) Then If sValue.Contains(sEnvAppDataRoaming) Then
Return sValue.Replace(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), sAppDataLocal) Return sValue.Replace(sEnvAppDataRoaming, sAppDataRoaming)
End If End If
If sValue.Contains(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)) Then If sValue.Contains(sEnvAppDataLocal) Then
Return sValue.Replace(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), sAppDataRoaming) Return sValue.Replace(sEnvAppDataLocal, sAppDataLocal)
End If End If
'This needs to be tested last for Unix compatability 'This needs to be tested last for Unix compatability
If sValue.Contains(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)) Then If sValue.Contains(sEnvMyDocs) Then
Return sValue.Replace(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), sMyDocs) Return sValue.Replace(sEnvMyDocs, sMyDocs)
End If End If
'Don't use these in Unix 'Don't use these in Unix
If Not mgrCommon.IsUnix Then If Not mgrCommon.IsUnix Then
If sValue.Contains(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments)) Then If sValue.Contains(sEnvPublicDocs) Then
Return sValue.Replace(Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), sPublicDocs) Return sValue.Replace(sEnvPublicDocs, sPublicDocs)
End If End If
If sValue.Contains(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)) Then If sValue.Contains(sEnvCurrentUser) Then
Return sValue.Replace(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), sCurrentUser) Return sValue.Replace(sEnvCurrentUser, sCurrentUser)
End If End If
End If End If
+2 -2
View File
@@ -33,7 +33,7 @@ Imports System.Runtime.InteropServices
' by using the '*' as shown below: ' by using the '*' as shown below:
' <Assembly: AssemblyVersion("1.0.*")> ' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.1.3.*")> <Assembly: AssemblyVersion("1.1.4.*")>
<Assembly: AssemblyFileVersion("1.1.3.0")> <Assembly: AssemblyFileVersion("1.1.4.0")>
<Assembly: NeutralResourcesLanguageAttribute("en")> <Assembly: NeutralResourcesLanguageAttribute("en")>
+27 -9
View File
@@ -2877,15 +2877,6 @@ Namespace My.Resources
End Get End Get
End Property End Property
'''<summary>
''' Looks up a localized string similar to This tool removes orphaned backup information from the local manifest based on the current backup folder. Data can become orphaned when backups are deleted by various computers that share the same backup folder on a cloud or network.[BR][BR]When alternating between different backup folders you should NOT use this tool.[BR][BR]Do you wish to proceed?.
'''</summary>
Friend ReadOnly Property frmMain_ConfirmManifestClean() As String
Get
Return ResourceManager.GetString("frmMain_ConfirmManifestClean", resourceCulture)
End Get
End Property
'''<summary> '''<summary>
''' Looks up a localized string similar to Do you wish to cancel the monitoring of [PARAM]?[BR][BR]Warning: When monitoring is cancelled, session time is NOT saved.. ''' Looks up a localized string similar to Do you wish to cancel the monitoring of [PARAM]?[BR][BR]Warning: When monitoring is cancelled, session time is NOT saved..
'''</summary> '''</summary>
@@ -3084,6 +3075,24 @@ Namespace My.Resources
End Get End Get
End Property End Property
'''<summary>
''' Looks up a localized string similar to An error occured while obtaining the details of the detected game..
'''</summary>
Friend ReadOnly Property frmMain_ErrorGameDetails() As String
Get
Return ResourceManager.GetString("frmMain_ErrorGameDetails", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to An error occured while extracting the executable icon..
'''</summary>
Friend ReadOnly Property frmMain_ErrorGameIcon() As String
Get
Return ResourceManager.GetString("frmMain_ErrorGameIcon", resourceCulture)
End Get
End Property
'''<summary> '''<summary>
''' Looks up a localized string similar to An unexpected error occured while initializing GBM.[BR][BR][PARAM][BR][BR]Do you wish to continue anyway? (Not Recommended). ''' Looks up a localized string similar to An unexpected error occured while initializing GBM.[BR][BR][PARAM][BR][BR]Do you wish to continue anyway? (Not Recommended).
'''</summary> '''</summary>
@@ -6060,6 +6069,15 @@ Namespace My.Resources
End Get End Get
End Property End Property
'''<summary>
''' Looks up a localized string similar to An error occured while determining a required system path. [BR][BR]The environment value for [PARAM] is empty.[BR][BR]The application will now exit..
'''</summary>
Friend ReadOnly Property mgrPath_SpecialPathError() As String
Get
Return ResourceManager.GetString("mgrPath_SpecialPathError", resourceCulture)
End Get
End Property
'''<summary> '''<summary>
''' Looks up a localized string similar to [PARAM] backup restored.. ''' Looks up a localized string similar to [PARAM] backup restored..
'''</summary> '''</summary>
+9 -3
View File
@@ -133,9 +133,6 @@
<data name="frmMain_ManifestTotalRemoved" xml:space="preserve"> <data name="frmMain_ManifestTotalRemoved" xml:space="preserve">
<value>[PARAM] entries were removed from the local manifest.</value> <value>[PARAM] entries were removed from the local manifest.</value>
</data> </data>
<data name="frmMain_ConfirmManifestClean" xml:space="preserve">
<value>This tool removes orphaned backup information from the local manifest based on the current backup folder. Data can become orphaned when backups are deleted by various computers that share the same backup folder on a cloud or network.[BR][BR]When alternating between different backup folders you should NOT use this tool.[BR][BR]Do you wish to proceed?</value>
</data>
<data name="frmMain_ConfirmRebuild" xml:space="preserve"> <data name="frmMain_ConfirmRebuild" xml:space="preserve">
<value>This will rebuild all databases and shrink them to an optimal size.[BR]This should only be used if your gbm.s3db files are becoming very large.[BR][BR]Do you wish to continue?</value> <value>This will rebuild all databases and shrink them to an optimal size.[BR]This should only be used if your gbm.s3db files are becoming very large.[BR][BR]Do you wish to continue?</value>
</data> </data>
@@ -2191,4 +2188,13 @@
<data name="mgrBackup_ConfirmOverwriteRelative" xml:space="preserve"> <data name="mgrBackup_ConfirmOverwriteRelative" xml:space="preserve">
<value>A file with the same name already exists in the backup folder.[BR][BR]This game stores saves in a relative location, you may need to restore the current backup if the game was recently re-installed.[BR][BR]Do you want to overwrite this file?</value> <value>A file with the same name already exists in the backup folder.[BR][BR]This game stores saves in a relative location, you may need to restore the current backup if the game was recently re-installed.[BR][BR]Do you want to overwrite this file?</value>
</data> </data>
<data name="mgrPath_SpecialPathError" xml:space="preserve">
<value>An error occured while determining a required system path. [BR][BR]The environment value for [PARAM] is empty.[BR][BR]The application will now exit.</value>
</data>
<data name="frmMain_ErrorGameDetails" xml:space="preserve">
<value>An error occured while obtaining the details of the detected game.</value>
</data>
<data name="frmMain_ErrorGameIcon" xml:space="preserve">
<value>An error occured while extracting the executable icon.</value>
</data>
</root> </root>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 358 KiB

+16 -15
View File
@@ -1,24 +1,25 @@
Game Backup Monitor v1.1.3 Readme Game Backup Monitor v1.1.4 Readme
http://mikemaximus.github.io/gbm-web/ http://mikemaximus.github.io/gbm-web/
gamebackupmonitor@gmail.com gamebackupmonitor@gmail.com
July 5th, 2018 August 25th, 2018
New in 1.1.3 New in 1.1.4
All Platforms: All Platforms:
- Game tags are now sorted alphanumerically on the Game Manager and in XML exports. - Changed method of handling required OS environment paths and added a new path check on startup.
- GBM now displays a unique backup overwrite warning for games that use a relative saved game path. - Incorrect conflict warnings will no longer be shown in some situations when running a backup configuration with "Save Multiple Backups" enabled.
- The "Save Multiple Backups" setting now allows infinite backups when "Backup Limit" is set to 0. This is now the default for new configurations. - Fixed the precision of "Total Hours" on the Session Viewer, it now always rounds to 2 decimal places.
- "Save Multiple Backups" and "Backup Limit" are now core fields, they are synced by default and included in the Import/Export.
- The Game Manager will now clean up it's own manifest when backup files are deleted outside of GBM. As to not affect performance, this only occurs when the "Backup Data" field is accessed. Windows:
- When a single game is selected, the Game Manager now restores the currently selected backup, instead of always restoring the latest backup.
- If possible, GBM now displays the full path of the detected process when multiple configurations are triggered. - GBM will no longer keep an open file handle on detected processes and custom icons.
- Fixed an issue that could cause the certain controls to become enabled incorrectly on the Game Manager.
- Fixed an issue that caused GBM not to remove empty sub-folders unless the "Use Game ID for files and folders" setting was enabled when the folder was created. Linux:
- Fixed an issue that caused GBM not to rename backup files or sub-folders unless the "Use Game ID for files and folders" setting was enabled.
- Fixed an issue that caused GBM to only rename the most current backup file when modifying a Name or Game ID. - Sorting by "Hours" in the Session Viewer will no longer crash GBM on certain systems.
- GBM no longer displays a sync warning when the user deletes all game configurations from the Game Manager. - GBM no longer attempts to get icons from a Linux binary.
- Removed compression from GBM icon to prevent issues with recent versions of imagemagick.
The entire version history of GBM releases is available at http://mikemaximus.github.io/gbm-web/versionhistory.html The entire version history of GBM releases is available at http://mikemaximus.github.io/gbm-web/versionhistory.html
+3 -1
View File
@@ -9,7 +9,9 @@ Game Backup Monitor is a simple, but flexible application that detects games as
**Platform**: Windows (.NET 4) & Linux (Mono) **Platform**: Windows (.NET 4) & Linux (Mono)
[About Game Backup Monitor](http://mikemaximus.github.io/gbm-web/about.html) <br /> [About Game Backup Monitor](http://mikemaximus.github.io/gbm-web/about.html) <br />
[Contribute to Game Backup Monitor](http://mikemaximus.github.io/gbm-web/contribute.html) <br />
[Game Backup Monitor FAQ](http://mikemaximus.github.io/gbm-web/faq.html) <br /> [Game Backup Monitor FAQ](http://mikemaximus.github.io/gbm-web/faq.html) <br />
[Game Backup Monitor Manual](http://mikemaximus.github.io/gbm-web/manual.html) <br /> [Game Backup Monitor Manual](http://mikemaximus.github.io/gbm-web/manual.html) <br />
[List of Preconfigured Games](http://mikemaximus.github.io/gbm-web/GBM_Official.xml) <br /> <br /> [Preconfigured Windows Games](http://mikemaximus.github.io/gbm-web/GBM_Official.xml) <br />
[Preconfigured Linux Games](http://mikemaximus.github.io/gbm-web/GBM_Official_Linux.xml) <br /> <br />
Updates regarding this project are available via the [Game Backup Monitor web site](http://mikemaximus.github.io/gbm-web/). Updates regarding this project are available via the [Game Backup Monitor web site](http://mikemaximus.github.io/gbm-web/).