From d26c78c093738da0e3221c1c4a03f0335a83f088 Mon Sep 17 00:00:00 2001 From: "Michael J. Seiferling" Date: Sat, 5 Dec 2015 21:27:53 -0600 Subject: [PATCH] Usability updates for filters and wizards --- GBM/Forms/frmAddWizard.vb | 27 +++++--- GBM/Forms/frmFilter.vb | 16 +++-- GBM/Forms/frmGameManager.vb | 39 ++++++++--- GBM/Forms/frmStartUpWizard.vb | 4 +- GBM/Managers/mgrMonitorList.vb | 122 ++++++++++++++++++--------------- 5 files changed, 123 insertions(+), 85 deletions(-) diff --git a/GBM/Forms/frmAddWizard.vb b/GBM/Forms/frmAddWizard.vb index cd976e4..c695dbd 100644 --- a/GBM/Forms/frmAddWizard.vb +++ b/GBM/Forms/frmAddWizard.vb @@ -194,24 +194,23 @@ Public Class frmAddWizard End Function Private Sub DoSave() - Dim oGames As New List(Of clsGame) Dim hshDupeCheck As New Hashtable - Dim sExistingGame As String - Dim sNewGame As String = oGameToSave.Name & ":" & oGameToSave.ProcessName + Dim sNewGame As String = oGameToSave.ProcessName & ":" & oGameToSave.Name For Each o As clsGame In GameData.Values - oGames.Add(o) - sExistingGame = o.Name & ":" & o.ProcessName - hshDupeCheck.Add(sExistingGame, String.Empty) + hshDupeCheck.Add(o.CompoundKey, String.Empty) Next If hshDupeCheck.Contains(sNewGame) Then - MsgBox("The monitor list already contains a game with this exact name and process.", MsgBoxStyle.Exclamation, "Game Backup Monitor") + MsgBox("A game with this exact name and process already exists.", MsgBoxStyle.Exclamation, "Game Backup Monitor") Else mgrMonitorList.DoListAdd(oGameToSave) - MsgBox(oGameToSave.Name & " has been added to the monitor list.", MsgBoxStyle.Exclamation, "Game Backup Monitor") + If MsgBox(oGameToSave.Name & " has been saved." & vbCrLf & vbCrLf & + "Would you like to add tags for " & oGameToSave.Name & "?", MsgBoxStyle.YesNo, "Game Backup Monitor") = MsgBoxResult.Yes Then + OpenTags(oGameToSave) + End If Me.Close() - End If + End If End Sub Private Sub ValidateBack() @@ -397,6 +396,16 @@ Public Class frmAddWizard txtBox.Text = frm.BuilderString End Sub + Private Sub OpenTags(ByVal oGame As clsGame) + Dim frm As New frmGameTags + Dim sMonitorIDs As New List(Of String) + sMonitorIDs.Add(oGame.ID) + + frm.IDList = sMonitorIDs + frm.GameName = oGame.Name + frm.ShowDialog() + End Sub + Private Sub btnBack_Click(sender As Object, e As EventArgs) Handles btnBack.Click ValidateBack() End Sub diff --git a/GBM/Forms/frmFilter.vb b/GBM/Forms/frmFilter.vb index 119583f..1809c25 100644 --- a/GBM/Forms/frmFilter.vb +++ b/GBM/Forms/frmFilter.vb @@ -1,12 +1,14 @@ Public Class frmFilter Public Enum eFilterType As Integer - Any = 1 - All = 2 + NoFilter = 1 + AnyTag = 2 + AllTags = 3 + NoTags = 4 End Enum Dim oFilters As New List(Of clsTag) - Dim eCurrentFilterType As eFilterType = eFilterType.Any + Dim eCurrentFilterType As eFilterType = eFilterType.AnyTag Dim hshTags As New Hashtable Dim bShutdown As Boolean = False @@ -103,10 +105,12 @@ Next 'Set Filter Type - If optAll.Checked Then - eCurrentFilterType = eFilterType.All + If Filters.Count = 0 Then + eCurrentFilterType = eFilterType.NoTags + ElseIf optAll.Checked Then + eCurrentFilterType = eFilterType.AllTags Else - eCurrentFilterType = eFilterType.Any + eCurrentFilterType = eFilterType.AnyTag End If End Sub diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 93a1a70..4fea81f 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -16,6 +16,8 @@ Public Class frmGameManager Private oRemoteBackupData As SortedList Private bIsDirty As Boolean = False Private bIsLoading As Boolean = False + Private oCurrentFilters As New List(Of clsTag) + Private eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.NoFilter Private Enum eModes As Integer View = 1 @@ -201,22 +203,25 @@ Public Class frmGameManager End If End Sub - Private Sub LoadData() + Private Sub LoadData(Optional ByVal bRetainFilter As Boolean = True) Dim oRestoreData As New SortedList Dim oGame As clsGame Dim oBackup As clsBackup Dim frm As frmFilter - Dim oFilters As New List(Of clsTag) - Dim eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.Any If optTag.Checked Then - frm = New frmFilter - frm.ShowDialog() - oFilters = frm.Filters - eCurrentFilter = frm.FilterType + If Not bRetainFilter Then + frm = New frmFilter + frm.ShowDialog() + oCurrentFilters = frm.Filters + eCurrentFilter = frm.FilterType + End If + Else + oCurrentFilters.Clear() + eCurrentFilter = frmFilter.eFilterType.NoFilter End If - AppData = mgrMonitorList.ReadFilteredList(oFilters, eCurrentFilter) + AppData = mgrMonitorList.ReadFilteredList(oCurrentFilters, eCurrentFilter) If optPendingRestores.Checked Then oRestoreData = mgrRestore.CompareManifests @@ -492,7 +497,18 @@ Public Class frmGameManager frm.IDList = sMonitorIDs frm.GameName = CurrentGame.Name frm.ShowDialog() - FillTags(CurrentGame.ID) + + 'Only update visible tags if one item is selected + If lstGames.SelectedItems.Count = 1 Then FillTags(CurrentGame.ID) + + 'If a tag filter is enabled, reload list to reflect changes + If optTag.Checked Then + LoadData() + End If + + 'If the selected game(s) no longer match the filter, disable the form + If lstGames.SelectedIndex = -1 Then eCurrentMode = eModes.Disabled + ModeChange() End Sub Private Sub GetBackupInfo(ByVal oApp As clsGame) @@ -801,7 +817,6 @@ Public Class frmGameManager WipeControls(grpExtra.Controls) WipeControls(grpStats.Controls) pbIcon.Image = My.Resources.Unknown - lblTags.Text = String.Empty lblSync.Visible = False btnSave.Enabled = False btnCancel.Enabled = False @@ -816,6 +831,7 @@ Public Class frmGameManager btnRestore.Enabled = False btnMarkAsRestored.Enabled = False btnTags.Enabled = False + lblTags.Visible = False btnInclude.Text = "In&clude Items..." btnExclude.Text = "E&xclude Items..." Case eModes.MultiSelect @@ -840,6 +856,7 @@ Public Class frmGameManager btnRestore.Enabled = True btnMarkAsRestored.Enabled = True btnTags.Enabled = True + lblTags.Visible = False End Select IsLoading = False @@ -1257,7 +1274,7 @@ Public Class frmGameManager lstGames.ClearSelected() eCurrentMode = eModes.Disabled ModeChange() - LoadData() + LoadData(False) End Sub Private Sub btnInclude_Click(sender As Object, e As EventArgs) Handles btnInclude.Click diff --git a/GBM/Forms/frmStartUpWizard.vb b/GBM/Forms/frmStartUpWizard.vb index a8010e2..8a0939e 100644 --- a/GBM/Forms/frmStartUpWizard.vb +++ b/GBM/Forms/frmStartUpWizard.vb @@ -72,7 +72,7 @@ Public Class frmStartUpWizard Private Sub DownloadSettings() If MsgBox("Would you like to import from the latest pre-configured game list?", MsgBoxStyle.YesNo, "Game Backup Monitor") = MsgBoxResult.Yes Then If mgrMonitorList.DoImport(mgrPath.OfficialImportURL) Then - oGameData = mgrMonitorList.ReadList(mgrMonitorList.eListTypes.ScanList) + oGameData = mgrMonitorList.ReadList(mgrMonitorList.eListTypes.FullList) If oSettings.Sync Then mgrMonitorList.SyncMonitorLists() End If End If @@ -80,7 +80,7 @@ Public Class frmStartUpWizard Private Sub LoadGameSettings() 'Load Game XML - oGameData = mgrMonitorList.ReadList(mgrMonitorList.eListTypes.ScanList) + oGameData = mgrMonitorList.ReadList(mgrMonitorList.eListTypes.FullList) End Sub Private Sub OpenGameWizard() diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index 6680f38..8b452fc 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -39,12 +39,19 @@ Public Class mgrMonitorList End Sub Public Shared Sub ExportMonitorList(ByVal sLocation As String) - Dim frm As New frmFilter Dim oList As List(Of Game) Dim bSuccess As Boolean = False + Dim oFilters As New List(Of clsTag) + Dim eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.NoFilter - frm.ShowDialog() - oList = ReadListForExport(frm.Filters, frm.FilterType) + If MsgBox("Would you like to apply a filter to your export?", MsgBoxStyle.YesNo, "Game Backup Monitor") = MsgBoxResult.Yes Then + Dim frm As New frmFilter + frm.ShowDialog() + oFilters = frm.Filters + eCurrentFilter = frm.FilterType + End If + + oList = ReadListForExport(oFilters, eCurrentFilter) bSuccess = mgrXML.SerializeAndExport(oList, sLocation) @@ -266,37 +273,38 @@ Public Class mgrMonitorList Dim hshParams As New Hashtable Dim iCounter As Integer = 0 - If oFilters.Count > 0 Then - Select Case eFilterType - Case frmFilter.eFilterType.Any - sSQL = "SELECT DISTINCT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist " - sSQL &= "NATURAL JOIN gametags WHERE gametags.TagID IN (" - For Each oTag As clsTag In oFilters - sSQL &= "@TagID" & iCounter & "," - hshParams.Add("TagID" & iCounter, oTag.ID) - iCounter += 1 - Next + Select Case eFilterType + Case frmFilter.eFilterType.NoFilter + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist ORDER BY Name Asc" + Case frmFilter.eFilterType.AnyTag + sSQL = "SELECT DISTINCT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist " + sSQL &= "NATURAL JOIN gametags WHERE gametags.TagID IN (" - sSQL = sSQL.TrimEnd(",") - sSQL &= ") ORDER BY Name Asc" - Case frmFilter.eFilterType.All - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist WHERE MonitorID IN " + For Each oTag As clsTag In oFilters + sSQL &= "@TagID" & iCounter & "," + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next - For Each oTag As clsTag In oFilters - sSQL &= "(SELECT MonitorID FROM gametags WHERE monitorlist.MonitorID = gametags.MonitorID And TagID = @TagID" & iCounter & ")" - If iCounter <> oFilters.Count - 1 Then - sSQL &= " AND MonitorID IN " - End If - hshParams.Add("TagID" & iCounter, oTag.ID) - iCounter += 1 - Next + sSQL = sSQL.TrimEnd(",") + sSQL &= ") ORDER BY Name Asc" + Case frmFilter.eFilterType.AllTags + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist WHERE MonitorID IN " - sSQL &= " ORDER BY Name Asc" - End Select - Else - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist ORDER BY Name Asc" - End If + For Each oTag As clsTag In oFilters + sSQL &= "(SELECT MonitorID FROM gametags WHERE monitorlist.MonitorID = gametags.MonitorID And TagID = @TagID" & iCounter & ")" + If iCounter <> oFilters.Count - 1 Then + sSQL &= " AND MonitorID IN " + End If + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next + + sSQL &= " ORDER BY Name Asc" + Case frmFilter.eFilterType.NoTags + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags) ORDER BY Name Asc" + End Select oData = oDatabase.ReadParamData(sSQL, hshParams) @@ -382,37 +390,37 @@ Public Class mgrMonitorList Dim hshParams As New Hashtable Dim iCounter As Integer = 0 - If oFilters.Count > 0 Then - Select Case eFilterType - Case frmFilter.eFilterType.Any - sSQL = "SELECT DISTINCT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist " - sSQL &= "NATURAL JOIN gametags WHERE gametags.TagID IN (" + Select Case eFilterType + Case frmFilter.eFilterType.NoFilter + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist ORDER BY Name Asc" + Case frmFilter.eFilterType.AnyTag + sSQL = "SELECT DISTINCT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist " + sSQL &= "NATURAL JOIN gametags WHERE gametags.TagID IN (" - For Each oTag As clsTag In oFilters - sSQL &= "@TagID" & iCounter & "," - hshParams.Add("TagID" & iCounter, oTag.ID) - iCounter += 1 - Next + For Each oTag As clsTag In oFilters + sSQL &= "@TagID" & iCounter & "," + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next - sSQL = sSQL.TrimEnd(",") - sSQL &= ") ORDER BY Name Asc" - Case frmFilter.eFilterType.All - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist WHERE MonitorID IN " + sSQL = sSQL.TrimEnd(",") + sSQL &= ") ORDER BY Name Asc" + Case frmFilter.eFilterType.AllTags + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist WHERE MonitorID IN " - For Each oTag As clsTag In oFilters - sSQL &= "(SELECT MonitorID FROM gametags WHERE monitorlist.MonitorID = gametags.MonitorID And TagID = @TagID" & iCounter & ")" - If iCounter <> oFilters.Count - 1 Then - sSQL &= " AND MonitorID IN " - End If - hshParams.Add("TagID" & iCounter, oTag.ID) - iCounter += 1 - Next + For Each oTag As clsTag In oFilters + sSQL &= "(SELECT MonitorID FROM gametags WHERE monitorlist.MonitorID = gametags.MonitorID And TagID = @TagID" & iCounter & ")" + If iCounter <> oFilters.Count - 1 Then + sSQL &= " AND MonitorID IN " + End If + hshParams.Add("TagID" & iCounter, oTag.ID) + iCounter += 1 + Next - sSQL &= " ORDER BY Name Asc" - End Select - Else - sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist ORDER BY Name Asc" - End If + sSQL &= " ORDER BY Name Asc" + Case frmFilter.eFilterType.NoTags + sSQL = "SELECT MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly FROM monitorlist WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags) ORDER BY Name Asc" + End Select oData = oDatabase.ReadParamData(sSQL, hshParams)