From 11cc244b186ccf297d63076ec1210cc22d98eab4 Mon Sep 17 00:00:00 2001 From: "Michael J. Seiferling" Date: Fri, 4 Aug 2017 18:17:07 -0600 Subject: [PATCH 01/14] Custom Filter Enhancement Phase #1 --- GBM/Classes/XML Serialize Classes/Tag.vb | 3 +- GBM/Classes/clsGame.vb | 7 ++- GBM/Forms/frmFilter.Designer.vb | 73 +++++++++++++++++++++++- GBM/Forms/frmFilter.vb | 49 ++++++++++++++++ GBM/Forms/frmGameManager.vb | 45 ++++++++------- GBM/Managers/mgrCommon.vb | 24 ++++++++ GBM/Managers/mgrMonitorList.vb | 43 +++++++++----- GBM/My Project/Resources.Designer.vb | 72 +++++++++++++++++++++++ GBM/My Project/Resources.resx | 24 ++++++++ 9 files changed, 299 insertions(+), 41 deletions(-) diff --git a/GBM/Classes/XML Serialize Classes/Tag.vb b/GBM/Classes/XML Serialize Classes/Tag.vb index 8d726f9..c12a1e0 100644 --- a/GBM/Classes/XML Serialize Classes/Tag.vb +++ b/GBM/Classes/XML Serialize Classes/Tag.vb @@ -1,4 +1,5 @@ -Public Class Tag + +Public Class Tag Private sTagName As String Property Name As String diff --git a/GBM/Classes/clsGame.vb b/GBM/Classes/clsGame.vb index a7ad9b9..5340ebe 100644 --- a/GBM/Classes/clsGame.vb +++ b/GBM/Classes/clsGame.vb @@ -1,4 +1,5 @@ -Public Class clsGame + +Public Class clsGame Private sGameID As String = Guid.NewGuid.ToString Private sGameName As String = String.Empty Private sProcessName As String = String.Empty @@ -201,7 +202,7 @@ End Set End Property - Property Enabled As Boolean + Property Enabled As Boolean Get Return bEnabled End Get @@ -210,7 +211,7 @@ End Set End Property - Property MonitorOnly As Boolean + Property MonitorOnly As Boolean Get Return bMonitorOnly End Get diff --git a/GBM/Forms/frmFilter.Designer.vb b/GBM/Forms/frmFilter.Designer.vb index 833d5b8..9572373 100644 --- a/GBM/Forms/frmFilter.Designer.vb +++ b/GBM/Forms/frmFilter.Designer.vb @@ -45,10 +45,16 @@ Partial Class frmFilter Me.lblProcess = New System.Windows.Forms.Label() Me.lblName = New System.Windows.Forms.Label() Me.txtName = New System.Windows.Forms.TextBox() + Me.grpSorting = New System.Windows.Forms.GroupBox() + Me.lblOrderBy = New System.Windows.Forms.Label() + Me.cboSortField = New System.Windows.Forms.ComboBox() + Me.optSortAsc = New System.Windows.Forms.RadioButton() + Me.optSortDesc = New System.Windows.Forms.RadioButton() Me.grpTagFilter.SuspendLayout() Me.grpTagOptions.SuspendLayout() Me.grpGameFilter.SuspendLayout() Me.grpGameInfoOptions.SuspendLayout() + Me.grpSorting.SuspendLayout() Me.SuspendLayout() ' 'optGameInfo @@ -176,10 +182,10 @@ Partial Class frmFilter ' 'btnOK ' - Me.btnOK.Location = New System.Drawing.Point(322, 484) + Me.btnOK.Location = New System.Drawing.Point(322, 551) Me.btnOK.Name = "btnOK" Me.btnOK.Size = New System.Drawing.Size(75, 23) - Me.btnOK.TabIndex = 4 + Me.btnOK.TabIndex = 5 Me.btnOK.Text = "&OK" Me.btnOK.UseVisualStyleBackColor = True ' @@ -278,11 +284,65 @@ Partial Class frmFilter Me.txtName.Size = New System.Drawing.Size(309, 20) Me.txtName.TabIndex = 1 ' + 'grpSorting + ' + Me.grpSorting.Controls.Add(Me.optSortDesc) + Me.grpSorting.Controls.Add(Me.optSortAsc) + Me.grpSorting.Controls.Add(Me.cboSortField) + Me.grpSorting.Controls.Add(Me.lblOrderBy) + Me.grpSorting.Location = New System.Drawing.Point(12, 484) + Me.grpSorting.Name = "grpSorting" + Me.grpSorting.Size = New System.Drawing.Size(385, 61) + Me.grpSorting.TabIndex = 4 + Me.grpSorting.TabStop = False + Me.grpSorting.Text = "Sorting" + ' + 'lblOrderBy + ' + Me.lblOrderBy.AutoSize = True + Me.lblOrderBy.Location = New System.Drawing.Point(6, 28) + Me.lblOrderBy.Name = "lblOrderBy" + Me.lblOrderBy.Size = New System.Drawing.Size(51, 13) + Me.lblOrderBy.TabIndex = 0 + Me.lblOrderBy.Text = "Order By:" + ' + 'cboSortField + ' + Me.cboSortField.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList + Me.cboSortField.FormattingEnabled = True + Me.cboSortField.Location = New System.Drawing.Point(63, 25) + Me.cboSortField.Name = "cboSortField" + Me.cboSortField.Size = New System.Drawing.Size(147, 21) + Me.cboSortField.TabIndex = 1 + ' + 'optSortAsc + ' + Me.optSortAsc.AutoSize = True + Me.optSortAsc.Location = New System.Drawing.Point(216, 26) + Me.optSortAsc.Name = "optSortAsc" + Me.optSortAsc.Size = New System.Drawing.Size(75, 17) + Me.optSortAsc.TabIndex = 2 + Me.optSortAsc.TabStop = True + Me.optSortAsc.Text = "Ascending" + Me.optSortAsc.UseVisualStyleBackColor = True + ' + 'optSortDesc + ' + Me.optSortDesc.AutoSize = True + Me.optSortDesc.Location = New System.Drawing.Point(297, 26) + Me.optSortDesc.Name = "optSortDesc" + Me.optSortDesc.Size = New System.Drawing.Size(82, 17) + Me.optSortDesc.TabIndex = 3 + Me.optSortDesc.TabStop = True + Me.optSortDesc.Text = "Descending" + Me.optSortDesc.UseVisualStyleBackColor = True + ' 'frmFilter ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(409, 516) + Me.ClientSize = New System.Drawing.Size(409, 586) + Me.Controls.Add(Me.grpSorting) Me.Controls.Add(Me.grpGameFilter) Me.Controls.Add(Me.grpTagFilter) Me.Controls.Add(Me.btnOK) @@ -301,6 +361,8 @@ Partial Class frmFilter Me.grpGameFilter.ResumeLayout(False) Me.grpGameFilter.PerformLayout() Me.grpGameInfoOptions.ResumeLayout(False) + Me.grpSorting.ResumeLayout(False) + Me.grpSorting.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -328,4 +390,9 @@ Partial Class frmFilter Friend WithEvents grpGameInfoOptions As System.Windows.Forms.GroupBox Friend WithEvents optOr As System.Windows.Forms.RadioButton Friend WithEvents optAnd As System.Windows.Forms.RadioButton + Friend WithEvents grpSorting As GroupBox + Friend WithEvents optSortDesc As RadioButton + Friend WithEvents optSortAsc As RadioButton + Friend WithEvents cboSortField As ComboBox + Friend WithEvents lblOrderBy As Label End Class diff --git a/GBM/Forms/frmFilter.vb b/GBM/Forms/frmFilter.vb index f7a2c55..4b78cd1 100644 --- a/GBM/Forms/frmFilter.vb +++ b/GBM/Forms/frmFilter.vb @@ -14,6 +14,8 @@ Public Class frmFilter Dim oTagFilters As New List(Of clsTag) Dim hshStringFilters As New Hashtable Dim eCurrentFilterType As eFilterType = eFilterType.AnyTag + Dim bSortAsc As Boolean = True + Dim sSortField As String = "Name" Dim hshTags As New Hashtable Dim bShutdown As Boolean = False @@ -35,6 +37,18 @@ Public Class frmFilter End Get End Property + Public ReadOnly Property SortAsc As Boolean + Get + Return bSortAsc + End Get + End Property + + Public ReadOnly Property SortField As String + Get + Return sSortField + End Get + End Property + Private Sub AddTag() Dim oData As KeyValuePair(Of String, String) Dim oTags As List(Of KeyValuePair(Of String, String)) @@ -145,6 +159,33 @@ Public Class frmFilter End If End If + 'Sorting + If optSortAsc.Checked Then + bSortAsc = True + Else + bSortAsc = False + End If + + sSortField = cboSortField.SelectedValue + + End Sub + + Private Sub LoadCombos() + Dim oSortFields As New List(Of KeyValuePair(Of String, String)) + + 'cboSortField + cboSortField.ValueMember = "Key" + cboSortField.DisplayMember = "Value" + + oSortFields.Add(New KeyValuePair(Of String, String)("Name", frmFilter_SortName)) + oSortFields.Add(New KeyValuePair(Of String, String)("Process", frmFilter_SortProcess)) + oSortFields.Add(New KeyValuePair(Of String, String)("Company", frmFilter_SortCompany)) + oSortFields.Add(New KeyValuePair(Of String, String)("Hours", frmFilter_SortHours)) + + cboSortField.DataSource = oSortFields + + 'Select Default + cboSortField.SelectedIndex = 0 End Sub Private Sub SetForm() @@ -168,10 +209,18 @@ Public Class frmFilter grpTagOptions.Text = frmFilter_grpTagOptions optTag.Text = frmFilter_optTag optGameInfo.Text = frmFilter_optGameInfo + grpSorting.Text = frmFilter_grpSorting + lblOrderBy.Text = frmFilter_lblOrderBy + optSortAsc.Text = frmFilter_optSortAsc + optSortDesc.Text = frmFilter_optSortDesc + + 'Defaults + optSortAsc.Checked = True End Sub Private Sub frmGameTags_Load(sender As Object, e As EventArgs) Handles MyBase.Load SetForm() + LoadCombos() optGameInfo.Checked = True LoadData() End Sub diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index bcfe486..c55feed 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -1,4 +1,5 @@ Imports GBM.My.Resources +Imports System.Collections.Specialized Imports System.IO Public Class frmGameManager @@ -13,7 +14,7 @@ Public Class frmGameManager Private bTriggerRestore As Boolean = False Private oBackupList As New List(Of clsGame) Private oRestoreList As New Hashtable - Private oAppData As Hashtable + Private oGameData As OrderedDictionary Private oLocalBackupData As SortedList Private oRemoteBackupData As SortedList Private bIsDirty As Boolean = False @@ -21,6 +22,8 @@ Public Class frmGameManager Private oCurrentTagFilters As New List(Of clsTag) Private oCurrentStringFilters As New Hashtable Private eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.NoFilter + Private bCurrentSortAsc As Boolean = True + Private sCurrentSortField As String = "Name" Private WithEvents tmFilterTimer As Timer Private Enum eModes As Integer @@ -70,12 +73,12 @@ Public Class frmGameManager End Set End Property - Private Property AppData As Hashtable + Private Property GameData As OrderedDictionary Get - Return oAppData + Return oGameData End Get - Set(value As Hashtable) - oAppData = value + Set(value As OrderedDictionary) + oGameData = value End Set End Property @@ -226,37 +229,41 @@ Public Class frmGameManager oCurrentTagFilters = frm.TagFilters oCurrentStringFilters = frm.StringFilters eCurrentFilter = frm.FilterType + bCurrentSortAsc = frm.SortAsc + sCurrentSortField = frm.SortField End If Else oCurrentTagFilters.Clear() oCurrentStringFilters.Clear() eCurrentFilter = frmFilter.eFilterType.NoFilter + bCurrentSortAsc = True + sCurrentSortField = "Name" End If - AppData = mgrMonitorList.ReadFilteredList(oCurrentTagFilters, oCurrentStringFilters, eCurrentFilter) + GameData = mgrMonitorList.ReadFilteredList(oCurrentTagFilters, oCurrentStringFilters, eCurrentFilter, bCurrentSortAsc, sCurrentSortField) If optPendingRestores.Checked Then oRestoreData = mgrRestore.CompareManifests 'Only show games with data to restore - Dim oTemporaryList As Hashtable = AppData.Clone + Dim oTemporaryList As OrderedDictionary = mgrCommon.GenericClone(GameData) For Each de As DictionaryEntry In oTemporaryList oGame = DirectCast(de.Value, clsGame) If Not oRestoreData.ContainsKey(oGame.Name) Then - AppData.Remove(de.Key) + GameData.Remove(de.Key) Else oRestoreData.Remove(oGame.Name) End If Next ElseIf optBackupData.Checked Then 'Only show games with backup data - Dim oTemporaryList As Hashtable = AppData.Clone + Dim oTemporaryList As OrderedDictionary = mgrCommon.GenericClone(GameData) oRestoreData = oRemoteBackupData.Clone For Each de As DictionaryEntry In oTemporaryList oGame = DirectCast(de.Value, clsGame) If Not oRemoteBackupData.ContainsKey(oGame.Name) Then - AppData.Remove(de.Key) + GameData.Remove(de.Key) Else oRestoreData.Remove(oGame.Name) End If @@ -269,7 +276,7 @@ Public Class frmGameManager oGame = New clsGame oGame.Name = oBackup.Name oGame.Temporary = True - AppData.Add(oGame.ID, oGame) + GameData.Add(oGame.ID, oGame) Next End If @@ -387,7 +394,7 @@ Public Class frmGameManager Dim oList As New List(Of KeyValuePair(Of String, String)) Dim sFilter As String = txtQuickFilter.Text - For Each de As DictionaryEntry In AppData + For Each de As DictionaryEntry In GameData oApp = DirectCast(de.Value, clsGame) oData = New KeyValuePair(Of String, String)(oApp.ID, oApp.Name) 'Apply the quick filter if applicable @@ -400,8 +407,6 @@ Public Class frmGameManager End If Next - oList.Sort(AddressOf mgrCommon.CompareByListBoxItemByValue) - lstGames.BeginUpdate() lstGames.ValueMember = "Key" lstGames.DisplayMember = "Value" @@ -545,7 +550,7 @@ Public Class frmGameManager frm.TagList = oTagsToSave Else For Each oData In lstGames.SelectedItems - oApp = DirectCast(AppData(oData.Key), clsGame) + oApp = DirectCast(GameData(oData.Key), clsGame) sMonitorIDs.Add(oApp.ID) Next frm.GameName = CurrentGame.Name @@ -731,7 +736,7 @@ Public Class frmGameManager IsLoading = True Dim oData As KeyValuePair(Of String, String) = lstGames.SelectedItems(0) - Dim oApp As clsGame = DirectCast(AppData(oData.Key), clsGame) + Dim oApp As clsGame = DirectCast(GameData(oData.Key), clsGame) 'Core txtID.Text = oApp.ID @@ -1195,7 +1200,7 @@ Public Class frmGameManager If lstGames.SelectedItems.Count = 1 Then oData = lstGames.SelectedItems(0) - oApp = DirectCast(AppData(oData.Key), clsGame) + oApp = DirectCast(GameData(oData.Key), clsGame) If mgrCommon.ShowMessage(frmGameManager_ConfirmGameDelete, oApp.Name, MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then mgrMonitorList.DoListDelete(oApp.ID) @@ -1207,7 +1212,7 @@ Public Class frmGameManager Dim sMonitorIDs As New List(Of String) For Each oData In lstGames.SelectedItems - oApp = DirectCast(AppData(oData.Key), clsGame) + oApp = DirectCast(GameData(oData.Key), clsGame) sMonitorIDs.Add(oApp.ID) Next @@ -1334,7 +1339,7 @@ Public Class frmGameManager BackupList.Clear() For Each oData In lstGames.SelectedItems - oGame = DirectCast(AppData(oData.Key), clsGame) + oGame = DirectCast(GameData(oData.Key), clsGame) BackupList.Add(oGame) Next @@ -1377,7 +1382,7 @@ Public Class frmGameManager Else For Each oData In lstGames.SelectedItems If oRemoteBackupData.Contains(oData.Value) Then - oGame = DirectCast(AppData(oData.Key), clsGame) + oGame = DirectCast(GameData(oData.Key), clsGame) oBackup = DirectCast(oRemoteBackupData(oData.Value), clsBackup) RestoreList.Add(oGame, oBackup) End If diff --git a/GBM/Managers/mgrCommon.vb b/GBM/Managers/mgrCommon.vb index e9c8bc9..d5b1c5a 100644 --- a/GBM/Managers/mgrCommon.vb +++ b/GBM/Managers/mgrCommon.vb @@ -3,6 +3,8 @@ Imports System.Net Imports System.IO Imports System.Security.Principal Imports System.Text.RegularExpressions +Imports System.Runtime.Serialization +Imports System.Runtime.Serialization.Formatters.Binary Public Class mgrCommon @@ -35,6 +37,28 @@ Public Class mgrCommon End Get End Property + 'Source - https://stackoverflow.com/questions/18873152/deep-copy-of-ordereddictionary + Public Shared Function GenericClone(ByVal oOriginal As Object) As Object + 'Construct a temporary memory stream + Dim oStream As MemoryStream = New MemoryStream() + + 'Construct a serialization formatter that does all the hard work + Dim oFormatter As BinaryFormatter = New BinaryFormatter() + + 'This line Is explained in the "Streaming Contexts" section + oFormatter.Context = New StreamingContext(StreamingContextStates.Clone) + + 'Serialize the object graph into the memory stream + oFormatter.Serialize(oStream, oOriginal) + + 'Seek back to the start of the memory stream before deserializing + oStream.Position = 0 + + 'Deserialize the graph into a New set of objects + 'Return the root of the graph (deep copy) to the caller + Return oFormatter.Deserialize(oStream) + End Function + Public Shared Function CheckAddress(ByVal URL As String) As Boolean Try Dim request As WebRequest = WebRequest.Create(URL) diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index c4b1682..f0e1906 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -1,4 +1,5 @@ Imports GBM.My.Resources +Imports System.Collections.Specialized Imports System.IO Public Class mgrMonitorList @@ -496,14 +497,22 @@ Public Class mgrMonitorList End Sub 'Filter Functions - Private Shared Function BuildFilterQuery(ByVal oTagFilters As List(Of clsTag), ByVal hshStringFilters As Hashtable, eFilterType As frmFilter.eFilterType, ByRef hshParams As Hashtable) As String + Private Shared Function BuildFilterQuery(ByVal oTagFilters As List(Of clsTag), ByVal hshStringFilters As Hashtable, ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, + ByVal sSortField As String, ByRef hshParams As Hashtable) As String Dim sSQL As String = String.Empty Dim iCounter As Integer = 0 Dim sBaseSelect As String = "MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist" + Dim sSort As String = " ORDER BY " & sSortField + + If bSortAsc Then + sSort &= " ASC" + Else + sSort &= " DESC" + End If Select Case eFilterType Case frmFilter.eFilterType.NoFilter - sSQL = "SELECT " & sBaseSelect & " ORDER BY Name Asc" + sSQL = "SELECT " & sBaseSelect & sSort Case frmFilter.eFilterType.FieldAnd, frmFilter.eFilterType.FieldOr sSQL = "SELECT " & sBaseSelect @@ -525,7 +534,7 @@ Public Class mgrMonitorList Next sSQL &= ")" End If - sSQL &= " ORDER BY Name Asc" + sSQL &= sSort Case frmFilter.eFilterType.AnyTag sSQL = "SELECT DISTINCT " & sBaseSelect sSQL &= " NATURAL JOIN gametags WHERE gametags.TagID IN (" @@ -537,7 +546,7 @@ Public Class mgrMonitorList Next sSQL = sSQL.TrimEnd(",") - sSQL &= ") ORDER BY Name Asc" + sSQL &= ")" & sSort Case frmFilter.eFilterType.AllTags sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID IN " @@ -550,40 +559,42 @@ Public Class mgrMonitorList iCounter += 1 Next - sSQL &= " ORDER BY Name Asc" + sSQL &= sSort Case frmFilter.eFilterType.NoTags - sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags) ORDER BY Name Asc" + sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags)" & sSort End Select Return sSQL End Function - Public Shared Function ReadFilteredList(ByVal oTagFilters As List(Of clsTag), ByVal hshStringFilters As Hashtable, eFilterType As frmFilter.eFilterType, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As Hashtable + Public Shared Function ReadFilteredList(ByVal oTagFilters As List(Of clsTag), ByVal hshStringFilters As Hashtable, ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, + ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As OrderedDictionary Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet Dim sSQL As String = String.Empty - Dim hshList As New Hashtable + Dim oList As New OrderedDictionary Dim oGame As clsGame Dim hshParams As New Hashtable Dim iCounter As Integer = 0 - sSQL = BuildFilterQuery(oTagFilters, hshStringFilters, eFilterType, hshParams) + sSQL = BuildFilterQuery(oTagFilters, hshStringFilters, eFilterType, bSortAsc, sSortField, hshParams) oData = oDatabase.ReadParamData(sSQL, hshParams) For Each dr As DataRow In oData.Tables(0).Rows oGame = MapToObject(dr) - hshList.Add(oGame.ID, oGame) + oList.Add(oGame.ID, oGame) Next - Return hshList + Return oList End Function 'Import / Export Functions - Public Shared Function ReadListForExport(ByVal oTagFilters As List(Of clsTag), ByVal hshStringFilters As Hashtable, ByVal eFilterType As frmFilter.eFilterType, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As List(Of Game) + Public Shared Function ReadListForExport(ByVal oTagFilters As List(Of clsTag), ByVal hshStringFilters As Hashtable, ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, + ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As List(Of Game) Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet Dim sSQL As String = String.Empty @@ -592,7 +603,7 @@ Public Class mgrMonitorList Dim oGame As Game Dim hshParams As New Hashtable - sSQL = BuildFilterQuery(oTagFilters, hshStringFilters, eFilterType, hshParams) + sSQL = BuildFilterQuery(oTagFilters, hshStringFilters, eFilterType, bSortAsc, sSortField, hshParams) oData = oDatabase.ReadParamData(sSQL, hshParams) @@ -687,6 +698,8 @@ Public Class mgrMonitorList Dim oTagFilters As New List(Of clsTag) Dim oStringFilters As New Hashtable Dim eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.NoFilter + Dim bSortAsc As Boolean = True + Dim sSortField As String = "Name" If mgrCommon.ShowMessage(mgrMonitorList_ConfirmApplyFilter, MsgBoxStyle.YesNo) = MsgBoxResult.Yes Then Dim frm As New frmFilter @@ -694,9 +707,11 @@ Public Class mgrMonitorList oTagFilters = frm.TagFilters oStringFilters = frm.StringFilters eCurrentFilter = frm.FilterType + bSortAsc = frm.SortAsc + sSortField = frm.SortField End If - oList = ReadListForExport(oTagFilters, oStringFilters, eCurrentFilter) + oList = ReadListForExport(oTagFilters, oStringFilters, eCurrentFilter, bSortAsc, sSortField) bSuccess = mgrXML.SerializeAndExport(oList, sLocation) diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index 7eae80c..de37caf 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -960,6 +960,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Sorting. + ''' + Friend ReadOnly Property frmFilter_grpSorting() As String + Get + Return ResourceManager.GetString("frmFilter_grpSorting", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Options. ''' @@ -996,6 +1005,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Order By:. + ''' + Friend ReadOnly Property frmFilter_lblOrderBy() As String + Get + Return ResourceManager.GetString("frmFilter_lblOrderBy", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Process:. ''' @@ -1059,6 +1077,24 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Ascending. + ''' + Friend ReadOnly Property frmFilter_optSortAsc() As String + Get + Return ResourceManager.GetString("frmFilter_optSortAsc", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Descending. + ''' + Friend ReadOnly Property frmFilter_optSortDesc() As String + Get + Return ResourceManager.GetString("frmFilter_optSortDesc", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Tag. ''' @@ -1068,6 +1104,42 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Company. + ''' + Friend ReadOnly Property frmFilter_SortCompany() As String + Get + Return ResourceManager.GetString("frmFilter_SortCompany", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Time Played. + ''' + Friend ReadOnly Property frmFilter_SortHours() As String + Get + Return ResourceManager.GetString("frmFilter_SortHours", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Name. + ''' + Friend ReadOnly Property frmFilter_SortName() As String + Get + Return ResourceManager.GetString("frmFilter_SortName", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Process. + ''' + Friend ReadOnly Property frmFilter_SortProcess() As String + Get + Return ResourceManager.GetString("frmFilter_SortProcess", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to [PARAM] ([PARAM]). ''' diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index be8cac5..c1cb9b0 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -1801,4 +1801,28 @@ GBM is busy with an open window on your desktop. + + Sorting + + + Order By: + + + Ascending + + + Descending + + + Company + + + Time Played + + + Name + + + Process + \ No newline at end of file From 19812d1cd2d25dfbbd96536bd8154f2864411edc Mon Sep 17 00:00:00 2001 From: "Michael J. Seiferling" Date: Fri, 4 Aug 2017 21:23:03 -0600 Subject: [PATCH 02/14] Custom Filter Enhancement Phase #2 --- GBM/Forms/frmFilter.Designer.vb | 108 +++++++++++++-------------- GBM/Forms/frmFilter.vb | 37 ++++----- GBM/Forms/frmGameManager.vb | 7 +- GBM/Managers/mgrMonitorList.vb | 62 ++++++++------- GBM/My Project/Resources.Designer.vb | 36 ++++----- GBM/My Project/Resources.resx | 4 +- 6 files changed, 130 insertions(+), 124 deletions(-) diff --git a/GBM/Forms/frmFilter.Designer.vb b/GBM/Forms/frmFilter.Designer.vb index 9572373..42778bc 100644 --- a/GBM/Forms/frmFilter.Designer.vb +++ b/GBM/Forms/frmFilter.Designer.vb @@ -22,8 +22,6 @@ Partial Class frmFilter 'Do not modify it using the code editor. _ Private Sub InitializeComponent() - Me.optGameInfo = New System.Windows.Forms.RadioButton() - Me.optTag = New System.Windows.Forms.RadioButton() Me.grpTagFilter = New System.Windows.Forms.GroupBox() Me.grpTagOptions = New System.Windows.Forms.GroupBox() Me.optAll = New System.Windows.Forms.RadioButton() @@ -46,10 +44,12 @@ Partial Class frmFilter Me.lblName = New System.Windows.Forms.Label() Me.txtName = New System.Windows.Forms.TextBox() Me.grpSorting = New System.Windows.Forms.GroupBox() - Me.lblOrderBy = New System.Windows.Forms.Label() - Me.cboSortField = New System.Windows.Forms.ComboBox() - Me.optSortAsc = New System.Windows.Forms.RadioButton() Me.optSortDesc = New System.Windows.Forms.RadioButton() + Me.optSortAsc = New System.Windows.Forms.RadioButton() + Me.cboSortField = New System.Windows.Forms.ComboBox() + Me.lblOrderBy = New System.Windows.Forms.Label() + Me.chkTag = New System.Windows.Forms.CheckBox() + Me.chkGameInfo = New System.Windows.Forms.CheckBox() Me.grpTagFilter.SuspendLayout() Me.grpTagOptions.SuspendLayout() Me.grpGameFilter.SuspendLayout() @@ -57,26 +57,6 @@ Partial Class frmFilter Me.grpSorting.SuspendLayout() Me.SuspendLayout() ' - 'optGameInfo - ' - Me.optGameInfo.AutoSize = True - Me.optGameInfo.Location = New System.Drawing.Point(12, 12) - Me.optGameInfo.Name = "optGameInfo" - Me.optGameInfo.Size = New System.Drawing.Size(108, 17) - Me.optGameInfo.TabIndex = 0 - Me.optGameInfo.Text = "Game Information" - Me.optGameInfo.UseVisualStyleBackColor = True - ' - 'optTag - ' - Me.optTag.AutoSize = True - Me.optTag.Location = New System.Drawing.Point(12, 190) - Me.optTag.Name = "optTag" - Me.optTag.Size = New System.Drawing.Size(44, 17) - Me.optTag.TabIndex = 2 - Me.optTag.Text = "Tag" - Me.optTag.UseVisualStyleBackColor = True - ' 'grpTagFilter ' Me.grpTagFilter.Controls.Add(Me.grpTagOptions) @@ -297,23 +277,16 @@ Partial Class frmFilter Me.grpSorting.TabStop = False Me.grpSorting.Text = "Sorting" ' - 'lblOrderBy + 'optSortDesc ' - Me.lblOrderBy.AutoSize = True - Me.lblOrderBy.Location = New System.Drawing.Point(6, 28) - Me.lblOrderBy.Name = "lblOrderBy" - Me.lblOrderBy.Size = New System.Drawing.Size(51, 13) - Me.lblOrderBy.TabIndex = 0 - Me.lblOrderBy.Text = "Order By:" - ' - 'cboSortField - ' - Me.cboSortField.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cboSortField.FormattingEnabled = True - Me.cboSortField.Location = New System.Drawing.Point(63, 25) - Me.cboSortField.Name = "cboSortField" - Me.cboSortField.Size = New System.Drawing.Size(147, 21) - Me.cboSortField.TabIndex = 1 + Me.optSortDesc.AutoSize = True + Me.optSortDesc.Location = New System.Drawing.Point(297, 26) + Me.optSortDesc.Name = "optSortDesc" + Me.optSortDesc.Size = New System.Drawing.Size(82, 17) + Me.optSortDesc.TabIndex = 3 + Me.optSortDesc.TabStop = True + Me.optSortDesc.Text = "Descending" + Me.optSortDesc.UseVisualStyleBackColor = True ' 'optSortAsc ' @@ -326,28 +299,55 @@ Partial Class frmFilter Me.optSortAsc.Text = "Ascending" Me.optSortAsc.UseVisualStyleBackColor = True ' - 'optSortDesc + 'cboSortField ' - Me.optSortDesc.AutoSize = True - Me.optSortDesc.Location = New System.Drawing.Point(297, 26) - Me.optSortDesc.Name = "optSortDesc" - Me.optSortDesc.Size = New System.Drawing.Size(82, 17) - Me.optSortDesc.TabIndex = 3 - Me.optSortDesc.TabStop = True - Me.optSortDesc.Text = "Descending" - Me.optSortDesc.UseVisualStyleBackColor = True + Me.cboSortField.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList + Me.cboSortField.FormattingEnabled = True + Me.cboSortField.Location = New System.Drawing.Point(63, 25) + Me.cboSortField.Name = "cboSortField" + Me.cboSortField.Size = New System.Drawing.Size(147, 21) + Me.cboSortField.TabIndex = 1 + ' + 'lblOrderBy + ' + Me.lblOrderBy.AutoSize = True + Me.lblOrderBy.Location = New System.Drawing.Point(6, 28) + Me.lblOrderBy.Name = "lblOrderBy" + Me.lblOrderBy.Size = New System.Drawing.Size(51, 13) + Me.lblOrderBy.TabIndex = 0 + Me.lblOrderBy.Text = "Order By:" + ' + 'chkTag + ' + Me.chkTag.AutoSize = True + Me.chkTag.Location = New System.Drawing.Point(12, 192) + Me.chkTag.Name = "chkTag" + Me.chkTag.Size = New System.Drawing.Size(45, 17) + Me.chkTag.TabIndex = 6 + Me.chkTag.Text = "Tag" + Me.chkTag.UseVisualStyleBackColor = True + ' + 'chkGameInfo + ' + Me.chkGameInfo.AutoSize = True + Me.chkGameInfo.Location = New System.Drawing.Point(12, 14) + Me.chkGameInfo.Name = "chkGameInfo" + Me.chkGameInfo.Size = New System.Drawing.Size(109, 17) + Me.chkGameInfo.TabIndex = 7 + Me.chkGameInfo.Text = "Game Information" + Me.chkGameInfo.UseVisualStyleBackColor = True ' 'frmFilter ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(409, 586) + Me.Controls.Add(Me.chkGameInfo) + Me.Controls.Add(Me.chkTag) Me.Controls.Add(Me.grpSorting) Me.Controls.Add(Me.grpGameFilter) Me.Controls.Add(Me.grpTagFilter) Me.Controls.Add(Me.btnOK) - Me.Controls.Add(Me.optTag) - Me.Controls.Add(Me.optGameInfo) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle Me.MaximizeBox = False Me.MinimizeBox = False @@ -367,8 +367,6 @@ Partial Class frmFilter Me.PerformLayout() End Sub - Friend WithEvents optGameInfo As System.Windows.Forms.RadioButton - Friend WithEvents optTag As System.Windows.Forms.RadioButton Friend WithEvents grpTagFilter As System.Windows.Forms.GroupBox Friend WithEvents grpTagOptions As System.Windows.Forms.GroupBox Friend WithEvents optAll As System.Windows.Forms.RadioButton @@ -395,4 +393,6 @@ Partial Class frmFilter Friend WithEvents optSortAsc As RadioButton Friend WithEvents cboSortField As ComboBox Friend WithEvents lblOrderBy As Label + Friend WithEvents chkTag As CheckBox + Friend WithEvents chkGameInfo As CheckBox End Class diff --git a/GBM/Forms/frmFilter.vb b/GBM/Forms/frmFilter.vb index 4b78cd1..fc5be01 100644 --- a/GBM/Forms/frmFilter.vb +++ b/GBM/Forms/frmFilter.vb @@ -3,17 +3,15 @@ Public Class frmFilter Public Enum eFilterType As Integer - NoFilter = 1 + BaseFilter = 1 AnyTag = 2 AllTags = 3 NoTags = 4 - FieldAnd = 5 - FieldOr = 6 End Enum Dim oTagFilters As New List(Of clsTag) Dim hshStringFilters As New Hashtable - Dim eCurrentFilterType As eFilterType = eFilterType.AnyTag + Dim eCurrentFilterType As eFilterType = eFilterType.BaseFilter Dim bSortAsc As Boolean = True Dim sSortField As String = "Name" Dim hshTags As New Hashtable @@ -124,13 +122,9 @@ Public Class frmFilter Dim oTag As clsTag - If optGameInfo.Checked Then + If chkGameInfo.Checked Then 'Set Filter Type - If optAnd.Checked Then - eCurrentFilterType = eFilterType.FieldAnd - Else - eCurrentFilterType = eFilterType.FieldOr - End If + eCurrentFilterType = eFilterType.BaseFilter 'Set String Filter If txtName.Text <> String.Empty Then @@ -142,7 +136,9 @@ Public Class frmFilter If txtCompany.Text <> String.Empty Then hshStringFilters.Add("Company", txtCompany.Text) End If - Else + End If + + If chkTag.Checked Then 'Set Tags For Each oData In lstFilter.Items oTag = DirectCast(hshTags(oData.Value), clsTag) @@ -207,8 +203,8 @@ Public Class frmFilter btnAdd.Text = frmFilter_btnAdd btnOK.Text = frmFilter_btnOK grpTagOptions.Text = frmFilter_grpTagOptions - optTag.Text = frmFilter_optTag - optGameInfo.Text = frmFilter_optGameInfo + chkTag.Text = frmFilter_chkTag + chkGameInfo.Text = frmFilter_chkGameInfo grpSorting.Text = frmFilter_grpSorting lblOrderBy.Text = frmFilter_lblOrderBy optSortAsc.Text = frmFilter_optSortAsc @@ -216,12 +212,13 @@ Public Class frmFilter 'Defaults optSortAsc.Checked = True + grpGameFilter.Enabled = False + grpTagFilter.Enabled = False End Sub Private Sub frmGameTags_Load(sender As Object, e As EventArgs) Handles MyBase.Load SetForm() LoadCombos() - optGameInfo.Checked = True LoadData() End Sub @@ -245,13 +242,19 @@ Public Class frmFilter End If End Sub - Private Sub optGameInfo_Click(sender As Object, e As EventArgs) Handles optGameInfo.Click, optTag.Click - If optGameInfo.Checked = True Then + Private Sub chkGameInfo_CheckedChanged(sender As Object, e As EventArgs) Handles chkGameInfo.CheckedChanged + If chkGameInfo.Checked Then grpGameFilter.Enabled = True - grpTagFilter.Enabled = False Else grpGameFilter.Enabled = False + End If + End Sub + + Private Sub chkTag_CheckedChanged(sender As Object, e As EventArgs) Handles chkTag.CheckedChanged + If chkTag.Checked Then grpTagFilter.Enabled = True + Else + grpTagFilter.Enabled = False End If End Sub End Class \ No newline at end of file diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index c55feed..feec031 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -21,7 +21,7 @@ Public Class frmGameManager Private bIsLoading As Boolean = False Private oCurrentTagFilters As New List(Of clsTag) Private oCurrentStringFilters As New Hashtable - Private eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.NoFilter + Private eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter Private bCurrentSortAsc As Boolean = True Private sCurrentSortField As String = "Name" Private WithEvents tmFilterTimer As Timer @@ -235,7 +235,7 @@ Public Class frmGameManager Else oCurrentTagFilters.Clear() oCurrentStringFilters.Clear() - eCurrentFilter = frmFilter.eFilterType.NoFilter + eCurrentFilter = frmFilter.eFilterType.BaseFilter bCurrentSortAsc = True sCurrentSortField = "Name" End If @@ -1550,9 +1550,6 @@ Public Class frmGameManager AssignDirtyHandlers(grpExtra.Controls) AssignDirtyHandlers(grpStats.Controls) AssignDirtyHandlersMisc() - - LoadData(False) - ModeChange() End Sub Private Sub lstGames_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstGames.SelectedIndexChanged diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index f0e1906..93e6ce3 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -511,30 +511,8 @@ Public Class mgrMonitorList End If Select Case eFilterType - Case frmFilter.eFilterType.NoFilter - sSQL = "SELECT " & sBaseSelect & sSort - Case frmFilter.eFilterType.FieldAnd, frmFilter.eFilterType.FieldOr + Case frmFilter.eFilterType.BaseFilter sSQL = "SELECT " & sBaseSelect - - If hshStringFilters.Count > 0 Then - sSQL &= " WHERE (" - For Each de As DictionaryEntry In hshStringFilters - sSQL &= de.Key & " LIKE @" & de.Key - hshParams.Add(de.Key, "%" & de.Value.ToString & "%") - iCounter += 1 - If iCounter <> hshStringFilters.Count Then - Select Case eFilterType - Case frmFilter.eFilterType.FieldAnd - sSQL &= " AND " - Case frmFilter.eFilterType.FieldOr - sSQL &= " OR " - End Select - End If - - Next - sSQL &= ")" - End If - sSQL &= sSort Case frmFilter.eFilterType.AnyTag sSQL = "SELECT DISTINCT " & sBaseSelect sSQL &= " NATURAL JOIN gametags WHERE gametags.TagID IN (" @@ -546,7 +524,7 @@ Public Class mgrMonitorList Next sSQL = sSQL.TrimEnd(",") - sSQL &= ")" & sSort + sSQL &= ")" Case frmFilter.eFilterType.AllTags sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID IN " @@ -558,12 +536,40 @@ Public Class mgrMonitorList hshParams.Add("TagID" & iCounter, oTag.ID) iCounter += 1 Next - - sSQL &= sSort Case frmFilter.eFilterType.NoTags - sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags)" & sSort + sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags)" End Select + 'Handle String Filters + If hshStringFilters.Count > 0 Then + If eFilterType = frmFilter.eFilterType.BaseFilter Then + sSQL &= " WHERE (" + Else + sSQL &= " AND (" + End If + + iCounter = 0 + For Each de As DictionaryEntry In hshStringFilters + sSQL &= de.Key & " LIKE @" & de.Key + hshParams.Add(de.Key, "%" & de.Value.ToString & "%") + iCounter += 1 + If iCounter <> hshStringFilters.Count Then + 'Select Case eFilterType + 'Case frmFilter.eFilterType.FieldAnd + 'sSQL &= " AND " + 'Case frmFilter.eFilterType.FieldOr + sSQL &= " OR " + 'End Select + End If + + Next + sSQL &= ")" + End If + + 'Handle Sorting + sSQL &= sSort + + Return sSQL End Function @@ -697,7 +703,7 @@ Public Class mgrMonitorList Dim bSuccess As Boolean = False Dim oTagFilters As New List(Of clsTag) Dim oStringFilters As New Hashtable - Dim eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.NoFilter + Dim eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter Dim bSortAsc As Boolean = True Dim sSortField As String = "Name" diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index de37caf..b191d24 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -942,6 +942,24 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Game Information. + ''' + Friend ReadOnly Property frmFilter_chkGameInfo() As String + Get + Return ResourceManager.GetString("frmFilter_chkGameInfo", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Tag. + ''' + Friend ReadOnly Property frmFilter_chkTag() As String + Get + Return ResourceManager.GetString("frmFilter_chkTag", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Custom Filter. ''' @@ -1059,15 +1077,6 @@ Namespace My.Resources End Get End Property - ''' - ''' Looks up a localized string similar to Game Information. - ''' - Friend ReadOnly Property frmFilter_optGameInfo() As String - Get - Return ResourceManager.GetString("frmFilter_optGameInfo", resourceCulture) - End Get - End Property - ''' ''' Looks up a localized string similar to Or. ''' @@ -1095,15 +1104,6 @@ Namespace My.Resources End Get End Property - ''' - ''' Looks up a localized string similar to Tag. - ''' - Friend ReadOnly Property frmFilter_optTag() As String - Get - Return ResourceManager.GetString("frmFilter_optTag", resourceCulture) - End Get - End Property - ''' ''' Looks up a localized string similar to Company. ''' diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index c1cb9b0..ca92904 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -919,13 +919,13 @@ Any Tag - + Game Information Or - + Tag From c0d6a79aa71240f53ab055abbe1127dc53b3f952 Mon Sep 17 00:00:00 2001 From: "Michael J. Seiferling" Date: Fri, 4 Aug 2017 23:31:48 -0600 Subject: [PATCH 03/14] Custom Filter Enhancement Phase #3 --- GBM/Forms/frmFilter.Designer.vb | 219 +++++++++++++++------------ GBM/Forms/frmFilter.vb | 168 +++++++++++++++----- GBM/Forms/frmGameManager.vb | 11 +- GBM/Managers/mgrMonitorList.vb | 38 +++-- GBM/My Project/Resources.Designer.vb | 150 +++++++++++------- GBM/My Project/Resources.resx | 40 +++-- 6 files changed, 401 insertions(+), 225 deletions(-) diff --git a/GBM/Forms/frmFilter.Designer.vb b/GBM/Forms/frmFilter.Designer.vb index 42778bc..c376553 100644 --- a/GBM/Forms/frmFilter.Designer.vb +++ b/GBM/Forms/frmFilter.Designer.vb @@ -30,19 +30,18 @@ Partial Class frmFilter Me.lblTags = New System.Windows.Forms.Label() Me.btnRemove = New System.Windows.Forms.Button() Me.btnAdd = New System.Windows.Forms.Button() - Me.lstFilter = New System.Windows.Forms.ListBox() + Me.lstTagFilter = New System.Windows.Forms.ListBox() Me.lstTags = New System.Windows.Forms.ListBox() Me.btnOK = New System.Windows.Forms.Button() Me.grpGameFilter = New System.Windows.Forms.GroupBox() + Me.btnRemoveFilter = New System.Windows.Forms.Button() + Me.lstFilter = New System.Windows.Forms.ListBox() + Me.btnAddFilter = New System.Windows.Forms.Button() + Me.cboFilterField = New System.Windows.Forms.ComboBox() Me.grpGameInfoOptions = New System.Windows.Forms.GroupBox() Me.optOr = New System.Windows.Forms.RadioButton() Me.optAnd = New System.Windows.Forms.RadioButton() - Me.txtCompany = New System.Windows.Forms.TextBox() - Me.lblCompany = New System.Windows.Forms.Label() - Me.txtProcess = New System.Windows.Forms.TextBox() - Me.lblProcess = New System.Windows.Forms.Label() - Me.lblName = New System.Windows.Forms.Label() - Me.txtName = New System.Windows.Forms.TextBox() + Me.txtFilterData = New System.Windows.Forms.TextBox() Me.grpSorting = New System.Windows.Forms.GroupBox() Me.optSortDesc = New System.Windows.Forms.RadioButton() Me.optSortAsc = New System.Windows.Forms.RadioButton() @@ -50,6 +49,9 @@ Partial Class frmFilter Me.lblOrderBy = New System.Windows.Forms.Label() Me.chkTag = New System.Windows.Forms.CheckBox() Me.chkGameInfo = New System.Windows.Forms.CheckBox() + Me.lblFields = New System.Windows.Forms.Label() + Me.lblFilterData = New System.Windows.Forms.Label() + Me.lblCurrentFilters = New System.Windows.Forms.Label() Me.grpTagFilter.SuspendLayout() Me.grpTagOptions.SuspendLayout() Me.grpGameFilter.SuspendLayout() @@ -64,11 +66,11 @@ Partial Class frmFilter Me.grpTagFilter.Controls.Add(Me.lblTags) Me.grpTagFilter.Controls.Add(Me.btnRemove) Me.grpTagFilter.Controls.Add(Me.btnAdd) - Me.grpTagFilter.Controls.Add(Me.lstFilter) + Me.grpTagFilter.Controls.Add(Me.lstTagFilter) Me.grpTagFilter.Controls.Add(Me.lstTags) - Me.grpTagFilter.Location = New System.Drawing.Point(12, 213) + Me.grpTagFilter.Location = New System.Drawing.Point(12, 253) Me.grpTagFilter.Name = "grpTagFilter" - Me.grpTagFilter.Size = New System.Drawing.Size(385, 265) + Me.grpTagFilter.Size = New System.Drawing.Size(385, 198) Me.grpTagFilter.TabIndex = 3 Me.grpTagFilter.TabStop = False ' @@ -76,7 +78,7 @@ Partial Class frmFilter ' Me.grpTagOptions.Controls.Add(Me.optAll) Me.grpTagOptions.Controls.Add(Me.optAny) - Me.grpTagOptions.Location = New System.Drawing.Point(6, 211) + Me.grpTagOptions.Location = New System.Drawing.Point(6, 146) Me.grpTagOptions.Name = "grpTagOptions" Me.grpTagOptions.Size = New System.Drawing.Size(150, 46) Me.grpTagOptions.TabIndex = 6 @@ -124,7 +126,7 @@ Partial Class frmFilter ' 'btnRemove ' - Me.btnRemove.Location = New System.Drawing.Point(162, 122) + Me.btnRemove.Location = New System.Drawing.Point(162, 88) Me.btnRemove.Name = "btnRemove" Me.btnRemove.Size = New System.Drawing.Size(61, 23) Me.btnRemove.TabIndex = 3 @@ -133,22 +135,22 @@ Partial Class frmFilter ' 'btnAdd ' - Me.btnAdd.Location = New System.Drawing.Point(162, 93) + Me.btnAdd.Location = New System.Drawing.Point(162, 59) Me.btnAdd.Name = "btnAdd" Me.btnAdd.Size = New System.Drawing.Size(61, 23) Me.btnAdd.TabIndex = 2 Me.btnAdd.Text = ">" Me.btnAdd.UseVisualStyleBackColor = True ' - 'lstFilter + 'lstTagFilter ' - Me.lstFilter.FormattingEnabled = True - Me.lstFilter.Location = New System.Drawing.Point(229, 32) - Me.lstFilter.Name = "lstFilter" - Me.lstFilter.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended - Me.lstFilter.Size = New System.Drawing.Size(150, 173) - Me.lstFilter.Sorted = True - Me.lstFilter.TabIndex = 5 + Me.lstTagFilter.FormattingEnabled = True + Me.lstTagFilter.Location = New System.Drawing.Point(229, 32) + Me.lstTagFilter.Name = "lstTagFilter" + Me.lstTagFilter.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended + Me.lstTagFilter.Size = New System.Drawing.Size(150, 108) + Me.lstTagFilter.Sorted = True + Me.lstTagFilter.TabIndex = 5 ' 'lstTags ' @@ -156,13 +158,13 @@ Partial Class frmFilter Me.lstTags.Location = New System.Drawing.Point(6, 32) Me.lstTags.Name = "lstTags" Me.lstTags.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended - Me.lstTags.Size = New System.Drawing.Size(150, 173) + Me.lstTags.Size = New System.Drawing.Size(150, 108) Me.lstTags.Sorted = True Me.lstTags.TabIndex = 1 ' 'btnOK ' - Me.btnOK.Location = New System.Drawing.Point(322, 551) + Me.btnOK.Location = New System.Drawing.Point(322, 526) Me.btnOK.Name = "btnOK" Me.btnOK.Size = New System.Drawing.Size(75, 23) Me.btnOK.TabIndex = 5 @@ -171,27 +173,64 @@ Partial Class frmFilter ' 'grpGameFilter ' + Me.grpGameFilter.Controls.Add(Me.lblCurrentFilters) + Me.grpGameFilter.Controls.Add(Me.lblFilterData) + Me.grpGameFilter.Controls.Add(Me.lblFields) + Me.grpGameFilter.Controls.Add(Me.btnRemoveFilter) + Me.grpGameFilter.Controls.Add(Me.lstFilter) + Me.grpGameFilter.Controls.Add(Me.btnAddFilter) + Me.grpGameFilter.Controls.Add(Me.cboFilterField) Me.grpGameFilter.Controls.Add(Me.grpGameInfoOptions) - Me.grpGameFilter.Controls.Add(Me.txtCompany) - Me.grpGameFilter.Controls.Add(Me.lblCompany) - Me.grpGameFilter.Controls.Add(Me.txtProcess) - Me.grpGameFilter.Controls.Add(Me.lblProcess) - Me.grpGameFilter.Controls.Add(Me.lblName) - Me.grpGameFilter.Controls.Add(Me.txtName) + Me.grpGameFilter.Controls.Add(Me.txtFilterData) Me.grpGameFilter.Location = New System.Drawing.Point(12, 35) Me.grpGameFilter.Name = "grpGameFilter" - Me.grpGameFilter.Size = New System.Drawing.Size(385, 150) + Me.grpGameFilter.Size = New System.Drawing.Size(385, 189) Me.grpGameFilter.TabIndex = 1 Me.grpGameFilter.TabStop = False ' + 'btnRemoveFilter + ' + Me.btnRemoveFilter.Location = New System.Drawing.Point(259, 153) + Me.btnRemoveFilter.Name = "btnRemoveFilter" + Me.btnRemoveFilter.Size = New System.Drawing.Size(75, 23) + Me.btnRemoveFilter.TabIndex = 8 + Me.btnRemoveFilter.Text = "Remove" + Me.btnRemoveFilter.UseVisualStyleBackColor = True + ' + 'lstFilter + ' + Me.lstFilter.FormattingEnabled = True + Me.lstFilter.Location = New System.Drawing.Point(6, 81) + Me.lstFilter.Name = "lstFilter" + Me.lstFilter.Size = New System.Drawing.Size(247, 95) + Me.lstFilter.TabIndex = 6 + ' + 'btnAddFilter + ' + Me.btnAddFilter.Location = New System.Drawing.Point(304, 34) + Me.btnAddFilter.Name = "btnAddFilter" + Me.btnAddFilter.Size = New System.Drawing.Size(75, 23) + Me.btnAddFilter.TabIndex = 4 + Me.btnAddFilter.Text = "Add" + Me.btnAddFilter.UseVisualStyleBackColor = True + ' + 'cboFilterField + ' + Me.cboFilterField.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList + Me.cboFilterField.FormattingEnabled = True + Me.cboFilterField.Location = New System.Drawing.Point(6, 36) + Me.cboFilterField.Name = "cboFilterField" + Me.cboFilterField.Size = New System.Drawing.Size(121, 21) + Me.cboFilterField.TabIndex = 1 + ' 'grpGameInfoOptions ' Me.grpGameInfoOptions.Controls.Add(Me.optOr) Me.grpGameInfoOptions.Controls.Add(Me.optAnd) - Me.grpGameInfoOptions.Location = New System.Drawing.Point(14, 97) + Me.grpGameInfoOptions.Location = New System.Drawing.Point(259, 81) Me.grpGameInfoOptions.Name = "grpGameInfoOptions" Me.grpGameInfoOptions.Size = New System.Drawing.Size(106, 46) - Me.grpGameInfoOptions.TabIndex = 6 + Me.grpGameInfoOptions.TabIndex = 7 Me.grpGameInfoOptions.TabStop = False Me.grpGameInfoOptions.Text = "Options" ' @@ -216,53 +255,12 @@ Partial Class frmFilter Me.optAnd.Text = "And" Me.optAnd.UseVisualStyleBackColor = True ' - 'txtCompany + 'txtFilterData ' - Me.txtCompany.Location = New System.Drawing.Point(70, 71) - Me.txtCompany.Name = "txtCompany" - Me.txtCompany.Size = New System.Drawing.Size(309, 20) - Me.txtCompany.TabIndex = 5 - ' - 'lblCompany - ' - Me.lblCompany.AutoSize = True - Me.lblCompany.Location = New System.Drawing.Point(11, 74) - Me.lblCompany.Name = "lblCompany" - Me.lblCompany.Size = New System.Drawing.Size(54, 13) - Me.lblCompany.TabIndex = 4 - Me.lblCompany.Text = "Company:" - ' - 'txtProcess - ' - Me.txtProcess.Location = New System.Drawing.Point(70, 45) - Me.txtProcess.Name = "txtProcess" - Me.txtProcess.Size = New System.Drawing.Size(309, 20) - Me.txtProcess.TabIndex = 3 - ' - 'lblProcess - ' - Me.lblProcess.AutoSize = True - Me.lblProcess.Location = New System.Drawing.Point(11, 48) - Me.lblProcess.Name = "lblProcess" - Me.lblProcess.Size = New System.Drawing.Size(48, 13) - Me.lblProcess.TabIndex = 2 - Me.lblProcess.Text = "Process:" - ' - 'lblName - ' - Me.lblName.AutoSize = True - Me.lblName.Location = New System.Drawing.Point(11, 22) - Me.lblName.Name = "lblName" - Me.lblName.Size = New System.Drawing.Size(38, 13) - Me.lblName.TabIndex = 0 - Me.lblName.Text = "Name:" - ' - 'txtName - ' - Me.txtName.Location = New System.Drawing.Point(70, 19) - Me.txtName.Name = "txtName" - Me.txtName.Size = New System.Drawing.Size(309, 20) - Me.txtName.TabIndex = 1 + Me.txtFilterData.Location = New System.Drawing.Point(133, 36) + Me.txtFilterData.Name = "txtFilterData" + Me.txtFilterData.Size = New System.Drawing.Size(165, 20) + Me.txtFilterData.TabIndex = 3 ' 'grpSorting ' @@ -270,7 +268,7 @@ Partial Class frmFilter Me.grpSorting.Controls.Add(Me.optSortAsc) Me.grpSorting.Controls.Add(Me.cboSortField) Me.grpSorting.Controls.Add(Me.lblOrderBy) - Me.grpSorting.Location = New System.Drawing.Point(12, 484) + Me.grpSorting.Location = New System.Drawing.Point(12, 457) Me.grpSorting.Name = "grpSorting" Me.grpSorting.Size = New System.Drawing.Size(385, 61) Me.grpSorting.TabIndex = 4 @@ -280,7 +278,7 @@ Partial Class frmFilter 'optSortDesc ' Me.optSortDesc.AutoSize = True - Me.optSortDesc.Location = New System.Drawing.Point(297, 26) + Me.optSortDesc.Location = New System.Drawing.Point(271, 26) Me.optSortDesc.Name = "optSortDesc" Me.optSortDesc.Size = New System.Drawing.Size(82, 17) Me.optSortDesc.TabIndex = 3 @@ -291,7 +289,7 @@ Partial Class frmFilter 'optSortAsc ' Me.optSortAsc.AutoSize = True - Me.optSortAsc.Location = New System.Drawing.Point(216, 26) + Me.optSortAsc.Location = New System.Drawing.Point(190, 26) Me.optSortAsc.Name = "optSortAsc" Me.optSortAsc.Size = New System.Drawing.Size(75, 17) Me.optSortAsc.TabIndex = 2 @@ -305,7 +303,7 @@ Partial Class frmFilter Me.cboSortField.FormattingEnabled = True Me.cboSortField.Location = New System.Drawing.Point(63, 25) Me.cboSortField.Name = "cboSortField" - Me.cboSortField.Size = New System.Drawing.Size(147, 21) + Me.cboSortField.Size = New System.Drawing.Size(121, 21) Me.cboSortField.TabIndex = 1 ' 'lblOrderBy @@ -320,32 +318,59 @@ Partial Class frmFilter 'chkTag ' Me.chkTag.AutoSize = True - Me.chkTag.Location = New System.Drawing.Point(12, 192) + Me.chkTag.Location = New System.Drawing.Point(12, 230) Me.chkTag.Name = "chkTag" Me.chkTag.Size = New System.Drawing.Size(45, 17) - Me.chkTag.TabIndex = 6 + Me.chkTag.TabIndex = 2 Me.chkTag.Text = "Tag" Me.chkTag.UseVisualStyleBackColor = True ' 'chkGameInfo ' Me.chkGameInfo.AutoSize = True - Me.chkGameInfo.Location = New System.Drawing.Point(12, 14) + Me.chkGameInfo.Location = New System.Drawing.Point(12, 12) Me.chkGameInfo.Name = "chkGameInfo" Me.chkGameInfo.Size = New System.Drawing.Size(109, 17) - Me.chkGameInfo.TabIndex = 7 + Me.chkGameInfo.TabIndex = 0 Me.chkGameInfo.Text = "Game Information" Me.chkGameInfo.UseVisualStyleBackColor = True ' + 'lblFields + ' + Me.lblFields.AutoSize = True + Me.lblFields.Location = New System.Drawing.Point(26, 20) + Me.lblFields.Name = "lblFields" + Me.lblFields.Size = New System.Drawing.Size(80, 13) + Me.lblFields.TabIndex = 0 + Me.lblFields.Text = "Available Fields" + ' + 'lblFilterData + ' + Me.lblFilterData.AutoSize = True + Me.lblFilterData.Location = New System.Drawing.Point(199, 20) + Me.lblFilterData.Name = "lblFilterData" + Me.lblFilterData.Size = New System.Drawing.Size(32, 13) + Me.lblFilterData.TabIndex = 2 + Me.lblFilterData.Text = "Filter " + ' + 'lblCurrentFilters + ' + Me.lblCurrentFilters.AutoSize = True + Me.lblCurrentFilters.Location = New System.Drawing.Point(94, 65) + Me.lblCurrentFilters.Name = "lblCurrentFilters" + Me.lblCurrentFilters.Size = New System.Drawing.Size(71, 13) + Me.lblCurrentFilters.TabIndex = 5 + Me.lblCurrentFilters.Text = "Current Filters" + ' 'frmFilter ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(409, 586) - Me.Controls.Add(Me.chkGameInfo) - Me.Controls.Add(Me.chkTag) + Me.ClientSize = New System.Drawing.Size(409, 561) Me.Controls.Add(Me.grpSorting) + Me.Controls.Add(Me.chkTag) Me.Controls.Add(Me.grpGameFilter) + Me.Controls.Add(Me.chkGameInfo) Me.Controls.Add(Me.grpTagFilter) Me.Controls.Add(Me.btnOK) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle @@ -375,16 +400,11 @@ Partial Class frmFilter Friend WithEvents lblTags As System.Windows.Forms.Label Friend WithEvents btnRemove As System.Windows.Forms.Button Friend WithEvents btnAdd As System.Windows.Forms.Button - Friend WithEvents lstFilter As System.Windows.Forms.ListBox + Friend WithEvents lstTagFilter As System.Windows.Forms.ListBox Friend WithEvents lstTags As System.Windows.Forms.ListBox Friend WithEvents btnOK As System.Windows.Forms.Button Friend WithEvents grpGameFilter As System.Windows.Forms.GroupBox - Friend WithEvents txtProcess As System.Windows.Forms.TextBox - Friend WithEvents lblProcess As System.Windows.Forms.Label - Friend WithEvents lblName As System.Windows.Forms.Label - Friend WithEvents txtName As System.Windows.Forms.TextBox - Friend WithEvents txtCompany As System.Windows.Forms.TextBox - Friend WithEvents lblCompany As System.Windows.Forms.Label + Friend WithEvents txtFilterData As System.Windows.Forms.TextBox Friend WithEvents grpGameInfoOptions As System.Windows.Forms.GroupBox Friend WithEvents optOr As System.Windows.Forms.RadioButton Friend WithEvents optAnd As System.Windows.Forms.RadioButton @@ -395,4 +415,11 @@ Partial Class frmFilter Friend WithEvents lblOrderBy As Label Friend WithEvents chkTag As CheckBox Friend WithEvents chkGameInfo As CheckBox + Friend WithEvents cboFilterField As ComboBox + Friend WithEvents lstFilter As ListBox + Friend WithEvents btnAddFilter As Button + Friend WithEvents btnRemoveFilter As Button + Friend WithEvents lblCurrentFilters As Label + Friend WithEvents lblFilterData As Label + Friend WithEvents lblFields As Label End Class diff --git a/GBM/Forms/frmFilter.vb b/GBM/Forms/frmFilter.vb index fc5be01..8515505 100644 --- a/GBM/Forms/frmFilter.vb +++ b/GBM/Forms/frmFilter.vb @@ -9,17 +9,63 @@ Public Class frmFilter NoTags = 4 End Enum + Public Class clsFilter + + Private sID As String + Private sField As String + Private oData As Object + Private bAndOperator As Boolean + + Public Property ID As String + Get + Return sID + End Get + Set(value As String) + sID = value + End Set + End Property + + Public Property Field As String + Get + Return sField + End Get + Set(value As String) + sField = value + End Set + End Property + + Public Property Data As Object + Get + Return oData + End Get + Set(value As Object) + oData = value + End Set + End Property + + Public Property AndOperator As Boolean + Get + Return bAndOperator + End Get + Set(value As Boolean) + bAndOperator = value + End Set + End Property + + End Class + Dim oTagFilters As New List(Of clsTag) - Dim hshStringFilters As New Hashtable + Dim oGameFilters As New List(Of clsFilter) Dim eCurrentFilterType As eFilterType = eFilterType.BaseFilter Dim bSortAsc As Boolean = True Dim sSortField As String = "Name" Dim hshTags As New Hashtable Dim bShutdown As Boolean = False + Dim iParameterIndex As Integer = 0 - Public ReadOnly Property StringFilters As Hashtable + Public ReadOnly Property GameFilters As List(Of clsFilter) Get - Return hshStringFilters + Return oGameFilters End Get End Property @@ -53,7 +99,7 @@ Public Class frmFilter If lstTags.SelectedItems.Count = 1 Then oData = lstTags.SelectedItems(0) - lstFilter.Items.Add(oData) + lstTagFilter.Items.Add(oData) lstTags.Items.Remove(oData) ElseIf lstTags.SelectedItems.Count > 1 Then oTags = New List(Of KeyValuePair(Of String, String)) @@ -63,7 +109,7 @@ Public Class frmFilter Next For Each kp As KeyValuePair(Of String, String) In oTags - lstFilter.Items.Add(kp) + lstTagFilter.Items.Add(kp) lstTags.Items.Remove(kp) Next End If @@ -74,19 +120,19 @@ Public Class frmFilter Dim oData As KeyValuePair(Of String, String) Dim oTags As List(Of KeyValuePair(Of String, String)) - If lstFilter.SelectedItems.Count = 1 Then - oData = lstFilter.SelectedItems(0) - lstFilter.Items.Remove(oData) + If lstTagFilter.SelectedItems.Count = 1 Then + oData = lstTagFilter.SelectedItems(0) + lstTagFilter.Items.Remove(oData) lstTags.Items.Add(oData) - ElseIf lstFilter.SelectedItems.Count > 1 Then + ElseIf lstTagFilter.SelectedItems.Count > 1 Then oTags = New List(Of KeyValuePair(Of String, String)) - For Each oData In lstFilter.SelectedItems + For Each oData In lstTagFilter.SelectedItems oTags.Add(oData) Next For Each kp As KeyValuePair(Of String, String) In oTags - lstFilter.Items.Remove(kp) + lstTagFilter.Items.Remove(kp) lstTags.Items.Add(kp) Next End If @@ -102,12 +148,12 @@ Public Class frmFilter 'Handle Lists lstTags.Items.Clear() - lstFilter.Items.Clear() + lstTagFilter.Items.Clear() lstTags.ValueMember = "Key" lstTags.DisplayMember = "Value" - lstFilter.ValueMember = "Key" - lstFilter.DisplayMember = "Value" + lstTagFilter.ValueMember = "Key" + lstTagFilter.DisplayMember = "Value" For Each de As DictionaryEntry In hshTags oTag = DirectCast(de.Value, clsTag) @@ -117,6 +163,45 @@ Public Class frmFilter End Sub + Private Sub AddFilter() + Dim oFilter As New clsFilter + Dim sFilter As String + + lstFilter.ValueMember = "Key" + lstFilter.DisplayMember = "Value" + + 'Build Filter + oFilter.ID = "PARAM" & iParameterIndex + oFilter.Field = cboFilterField.SelectedValue + oFilter.Data = txtFilterData.Text + oFilter.AndOperator = optAnd.Checked + + oGameFilters.Add(oFilter) + + 'Build String + sFilter = oFilter.Field & " / " & oFilter.Data & " / " + If oFilter.AndOperator Then + sFilter &= frmFilter_optAnd + Else + sFilter &= frmFilter_optOr + End If + + lstFilter.Items.Add(New KeyValuePair(Of clsFilter, String)(oFilter, sFilter)) + + iParameterIndex += 1 + End Sub + + Private Sub RemoveFilter() + Dim oFilter As Object + + If lstFilter.SelectedIndex <> -1 Then + oFilter = lstFilter.SelectedItem + oGameFilters.Remove(DirectCast(oFilter, KeyValuePair(Of clsFilter, String)).Key) + lstFilter.Items.Remove(oFilter) + End If + + End Sub + Private Sub GetFilters() Dim oData As KeyValuePair(Of String, String) Dim oTag As clsTag @@ -125,22 +210,11 @@ Public Class frmFilter If chkGameInfo.Checked Then 'Set Filter Type eCurrentFilterType = eFilterType.BaseFilter - - 'Set String Filter - If txtName.Text <> String.Empty Then - hshStringFilters.Add("Name", txtName.Text) - End If - If txtProcess.Text <> String.Empty Then - hshStringFilters.Add("Process", txtProcess.Text) - End If - If txtCompany.Text <> String.Empty Then - hshStringFilters.Add("Company", txtCompany.Text) - End If End If If chkTag.Checked Then 'Set Tags - For Each oData In lstFilter.Items + For Each oData In lstTagFilter.Items oTag = DirectCast(hshTags(oData.Value), clsTag) TagFilters.Add(oTag) Next @@ -167,20 +241,36 @@ Public Class frmFilter End Sub Private Sub LoadCombos() + Dim oFilterFields As New List(Of KeyValuePair(Of String, String)) Dim oSortFields As New List(Of KeyValuePair(Of String, String)) + 'cboFilterField + cboFilterField.ValueMember = "Key" + cboFilterField.DisplayMember = "Value" + + oFilterFields.Add(New KeyValuePair(Of String, String)("Name", frmFilter_FieldName)) + oFilterFields.Add(New KeyValuePair(Of String, String)("Process", frmFilter_FieldProcess)) + oFilterFields.Add(New KeyValuePair(Of String, String)("Parameter", frmFilter_FieldParameter)) + oFilterFields.Add(New KeyValuePair(Of String, String)("Company", frmFilter_FieldCompany)) + oFilterFields.Add(New KeyValuePair(Of String, String)("Version", frmFilter_FieldVersion)) + + cboFilterField.DataSource = oFilterFields + 'cboSortField cboSortField.ValueMember = "Key" cboSortField.DisplayMember = "Value" - oSortFields.Add(New KeyValuePair(Of String, String)("Name", frmFilter_SortName)) - oSortFields.Add(New KeyValuePair(Of String, String)("Process", frmFilter_SortProcess)) - oSortFields.Add(New KeyValuePair(Of String, String)("Company", frmFilter_SortCompany)) - oSortFields.Add(New KeyValuePair(Of String, String)("Hours", frmFilter_SortHours)) + oSortFields.Add(New KeyValuePair(Of String, String)("Name", frmFilter_FieldName)) + oSortFields.Add(New KeyValuePair(Of String, String)("Process", frmFilter_FieldProcess)) + oSortFields.Add(New KeyValuePair(Of String, String)("Parameter", frmFilter_FieldParameter)) + oSortFields.Add(New KeyValuePair(Of String, String)("Company", frmFilter_FieldCompany)) + oSortFields.Add(New KeyValuePair(Of String, String)("Version", frmFilter_FieldVersion)) + oSortFields.Add(New KeyValuePair(Of String, String)("Hours", frmFilter_FieldHours)) cboSortField.DataSource = oSortFields - 'Select Default + 'Select Defaults + cboFilterField.SelectedIndex = 0 cboSortField.SelectedIndex = 0 End Sub @@ -191,9 +281,6 @@ Public Class frmFilter 'Set Form Text optOr.Text = frmFilter_optOr optAnd.Text = frmFilter_optAnd - lblCompany.Text = frmFilter_lblCompany - lblProcess.Text = frmFilter_lblProcess - lblName.Text = frmFilter_lblName grpGameInfoOptions.Text = frmFilter_grpGameInfoOptions optAll.Text = frmFilter_optAll optAny.Text = frmFilter_optAny @@ -209,6 +296,11 @@ Public Class frmFilter lblOrderBy.Text = frmFilter_lblOrderBy optSortAsc.Text = frmFilter_optSortAsc optSortDesc.Text = frmFilter_optSortDesc + btnAddFilter.Text = frmFilter_btnAddFilter + btnRemoveFilter.Text = frmFilter_btnRemoveFilter + lblCurrentFilters.Text = frmFilter_lblCurrentFilters + lblFields.Text = frmFilter_lblFields + lblFilterData.Text = frmFilter_lblFilterData 'Defaults optSortAsc.Checked = True @@ -257,4 +349,12 @@ Public Class frmFilter grpTagFilter.Enabled = False End If End Sub + + Private Sub btnAddFilter_Click(sender As Object, e As EventArgs) Handles btnAddFilter.Click + AddFilter() + End Sub + + Private Sub btnRemoveFilter_Click(sender As Object, e As EventArgs) Handles btnRemoveFilter.Click + RemoveFilter() + End Sub End Class \ No newline at end of file diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index feec031..7195522 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -20,7 +20,7 @@ Public Class frmGameManager Private bIsDirty As Boolean = False Private bIsLoading As Boolean = False Private oCurrentTagFilters As New List(Of clsTag) - Private oCurrentStringFilters As New Hashtable + Private oCurrentFilters As New List(Of frmFilter.clsFilter) Private eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter Private bCurrentSortAsc As Boolean = True Private sCurrentSortField As String = "Name" @@ -227,20 +227,20 @@ Public Class frmGameManager frm = New frmFilter frm.ShowDialog() oCurrentTagFilters = frm.TagFilters - oCurrentStringFilters = frm.StringFilters + oCurrentFilters = frm.GameFilters eCurrentFilter = frm.FilterType bCurrentSortAsc = frm.SortAsc sCurrentSortField = frm.SortField End If Else oCurrentTagFilters.Clear() - oCurrentStringFilters.Clear() + oCurrentFilters.Clear() eCurrentFilter = frmFilter.eFilterType.BaseFilter bCurrentSortAsc = True sCurrentSortField = "Name" End If - GameData = mgrMonitorList.ReadFilteredList(oCurrentTagFilters, oCurrentStringFilters, eCurrentFilter, bCurrentSortAsc, sCurrentSortField) + GameData = mgrMonitorList.ReadFilteredList(oCurrentTagFilters, oCurrentFilters, eCurrentFilter, bCurrentSortAsc, sCurrentSortField) If optPendingRestores.Checked Then oRestoreData = mgrRestore.CompareManifests @@ -1550,6 +1550,9 @@ Public Class frmGameManager AssignDirtyHandlers(grpExtra.Controls) AssignDirtyHandlers(grpStats.Controls) AssignDirtyHandlersMisc() + + LoadData(False) + ModeChange() End Sub Private Sub lstGames_SelectedIndexChanged(sender As Object, e As EventArgs) Handles lstGames.SelectedIndexChanged diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index 93e6ce3..5616839 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -497,7 +497,7 @@ Public Class mgrMonitorList End Sub 'Filter Functions - Private Shared Function BuildFilterQuery(ByVal oTagFilters As List(Of clsTag), ByVal hshStringFilters As Hashtable, ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, + Private Shared Function BuildFilterQuery(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of frmFilter.clsFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, ByVal sSortField As String, ByRef hshParams As Hashtable) As String Dim sSQL As String = String.Empty Dim iCounter As Integer = 0 @@ -541,7 +541,7 @@ Public Class mgrMonitorList End Select 'Handle String Filters - If hshStringFilters.Count > 0 Then + If oFilters.Count > 0 Then If eFilterType = frmFilter.eFilterType.BaseFilter Then sSQL &= " WHERE (" Else @@ -549,19 +549,17 @@ Public Class mgrMonitorList End If iCounter = 0 - For Each de As DictionaryEntry In hshStringFilters - sSQL &= de.Key & " LIKE @" & de.Key - hshParams.Add(de.Key, "%" & de.Value.ToString & "%") + For Each oFilter As frmFilter.clsFilter In oFilters + sSQL &= oFilter.Field & " LIKE @" & oFilter.ID + hshParams.Add(oFilter.ID, "%" & oFilter.Data & "%") iCounter += 1 - If iCounter <> hshStringFilters.Count Then - 'Select Case eFilterType - 'Case frmFilter.eFilterType.FieldAnd - 'sSQL &= " AND " - 'Case frmFilter.eFilterType.FieldOr - sSQL &= " OR " - 'End Select + If iCounter <> oFilters.Count Then + If oFilter.AndOperator Then + sSQL &= " AND " + Else + sSQL &= " OR " + End If End If - Next sSQL &= ")" End If @@ -574,7 +572,7 @@ Public Class mgrMonitorList End Function - Public Shared Function ReadFilteredList(ByVal oTagFilters As List(Of clsTag), ByVal hshStringFilters As Hashtable, ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, + Public Shared Function ReadFilteredList(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of frmFilter.clsFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As OrderedDictionary Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet @@ -584,7 +582,7 @@ Public Class mgrMonitorList Dim hshParams As New Hashtable Dim iCounter As Integer = 0 - sSQL = BuildFilterQuery(oTagFilters, hshStringFilters, eFilterType, bSortAsc, sSortField, hshParams) + sSQL = BuildFilterQuery(oTagFilters, oFilters, eFilterType, bSortAsc, sSortField, hshParams) oData = oDatabase.ReadParamData(sSQL, hshParams) @@ -599,7 +597,7 @@ Public Class mgrMonitorList 'Import / Export Functions - Public Shared Function ReadListForExport(ByVal oTagFilters As List(Of clsTag), ByVal hshStringFilters As Hashtable, ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, + Public Shared Function ReadListForExport(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of frmFilter.clsFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As List(Of Game) Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet @@ -609,7 +607,7 @@ Public Class mgrMonitorList Dim oGame As Game Dim hshParams As New Hashtable - sSQL = BuildFilterQuery(oTagFilters, hshStringFilters, eFilterType, bSortAsc, sSortField, hshParams) + sSQL = BuildFilterQuery(oTagFilters, oFilters, eFilterType, bSortAsc, sSortField, hshParams) oData = oDatabase.ReadParamData(sSQL, hshParams) @@ -702,7 +700,7 @@ Public Class mgrMonitorList Dim oList As List(Of Game) Dim bSuccess As Boolean = False Dim oTagFilters As New List(Of clsTag) - Dim oStringFilters As New Hashtable + Dim oFilters As New List(Of frmFilter.clsFilter) Dim eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter Dim bSortAsc As Boolean = True Dim sSortField As String = "Name" @@ -711,13 +709,13 @@ Public Class mgrMonitorList Dim frm As New frmFilter frm.ShowDialog() oTagFilters = frm.TagFilters - oStringFilters = frm.StringFilters + oFilters = frm.GameFilters eCurrentFilter = frm.FilterType bSortAsc = frm.SortAsc sSortField = frm.SortField End If - oList = ReadListForExport(oTagFilters, oStringFilters, eCurrentFilter, bSortAsc, sSortField) + oList = ReadListForExport(oTagFilters, oFilters, eCurrentFilter, bSortAsc, sSortField) bSuccess = mgrXML.SerializeAndExport(oList, sLocation) diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index b191d24..f2cb9a3 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -924,6 +924,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Add. + ''' + Friend ReadOnly Property frmFilter_btnAddFilter() As String + Get + Return ResourceManager.GetString("frmFilter_btnAddFilter", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to &OK. ''' @@ -942,6 +951,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Remove. + ''' + Friend ReadOnly Property frmFilter_btnRemoveFilter() As String + Get + Return ResourceManager.GetString("frmFilter_btnRemoveFilter", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Game Information. ''' @@ -960,6 +978,60 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Company. + ''' + Friend ReadOnly Property frmFilter_FieldCompany() As String + Get + Return ResourceManager.GetString("frmFilter_FieldCompany", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Hours. + ''' + Friend ReadOnly Property frmFilter_FieldHours() As String + Get + Return ResourceManager.GetString("frmFilter_FieldHours", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Name. + ''' + Friend ReadOnly Property frmFilter_FieldName() As String + Get + Return ResourceManager.GetString("frmFilter_FieldName", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Parameter. + ''' + Friend ReadOnly Property frmFilter_FieldParameter() As String + Get + Return ResourceManager.GetString("frmFilter_FieldParameter", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Process. + ''' + Friend ReadOnly Property frmFilter_FieldProcess() As String + Get + Return ResourceManager.GetString("frmFilter_FieldProcess", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Version. + ''' + Friend ReadOnly Property frmFilter_FieldVersion() As String + Get + Return ResourceManager.GetString("frmFilter_FieldVersion", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Custom Filter. ''' @@ -997,11 +1069,29 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to Company:. + ''' Looks up a localized string similar to Current Filters. ''' - Friend ReadOnly Property frmFilter_lblCompany() As String + Friend ReadOnly Property frmFilter_lblCurrentFilters() As String Get - Return ResourceManager.GetString("frmFilter_lblCompany", resourceCulture) + Return ResourceManager.GetString("frmFilter_lblCurrentFilters", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Available Fields. + ''' + Friend ReadOnly Property frmFilter_lblFields() As String + Get + Return ResourceManager.GetString("frmFilter_lblFields", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Filter. + ''' + Friend ReadOnly Property frmFilter_lblFilterData() As String + Get + Return ResourceManager.GetString("frmFilter_lblFilterData", resourceCulture) End Get End Property @@ -1014,15 +1104,6 @@ Namespace My.Resources End Get End Property - ''' - ''' Looks up a localized string similar to Name:. - ''' - Friend ReadOnly Property frmFilter_lblName() As String - Get - Return ResourceManager.GetString("frmFilter_lblName", resourceCulture) - End Get - End Property - ''' ''' Looks up a localized string similar to Order By:. ''' @@ -1032,15 +1113,6 @@ Namespace My.Resources End Get End Property - ''' - ''' Looks up a localized string similar to Process:. - ''' - Friend ReadOnly Property frmFilter_lblProcess() As String - Get - Return ResourceManager.GetString("frmFilter_lblProcess", resourceCulture) - End Get - End Property - ''' ''' Looks up a localized string similar to Available Tags. ''' @@ -1104,42 +1176,6 @@ Namespace My.Resources End Get End Property - ''' - ''' Looks up a localized string similar to Company. - ''' - Friend ReadOnly Property frmFilter_SortCompany() As String - Get - Return ResourceManager.GetString("frmFilter_SortCompany", resourceCulture) - End Get - End Property - - ''' - ''' Looks up a localized string similar to Time Played. - ''' - Friend ReadOnly Property frmFilter_SortHours() As String - Get - Return ResourceManager.GetString("frmFilter_SortHours", resourceCulture) - End Get - End Property - - ''' - ''' Looks up a localized string similar to Name. - ''' - Friend ReadOnly Property frmFilter_SortName() As String - Get - Return ResourceManager.GetString("frmFilter_SortName", resourceCulture) - End Get - End Property - - ''' - ''' Looks up a localized string similar to Process. - ''' - Friend ReadOnly Property frmFilter_SortProcess() As String - Get - Return ResourceManager.GetString("frmFilter_SortProcess", resourceCulture) - End Get - End Property - ''' ''' Looks up a localized string similar to [PARAM] ([PARAM]). ''' diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index ca92904..67376ae 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -895,18 +895,9 @@ Custom Filter - - Company: - Current Filter - - Name: - - - Process: - Available Tags @@ -1813,16 +1804,37 @@ Descending - + Company - - Time Played + + Hours - + Name - + Process + + Add + + + Remove + + + Parameter + + + Version + + + Current Filters + + + Available Fields + + + Filter + \ No newline at end of file From 6e2298df49220780489068432cbc32b85fc86695 Mon Sep 17 00:00:00 2001 From: "Michael J. Seiferling" Date: Sat, 5 Aug 2017 12:49:10 -0600 Subject: [PATCH 04/14] Custom Filter Enhancement Final Phase --- GBM/Classes/clsGame.vb | 8 + GBM/Classes/clsGameFilter.vb | 81 ++++++ GBM/Classes/clsGameFilterField.vb | 77 +++++ GBM/Forms/frmFilter.Designer.vb | 247 ++++++++++------ GBM/Forms/frmFilter.vb | 410 +++++++++++++++++++++------ GBM/Forms/frmGameManager.vb | 9 +- GBM/Forms/frmSyncFields.vb | 24 +- GBM/Game Backup Monitor.vbproj | 2 + GBM/Managers/mgrCommon.vb | 8 - GBM/Managers/mgrMonitorList.vb | 29 +- GBM/My Project/AssemblyInfo.vb | 4 +- GBM/My Project/Resources.Designer.vb | 156 +++++++++- GBM/My Project/Resources.resx | 58 +++- 13 files changed, 898 insertions(+), 215 deletions(-) create mode 100644 GBM/Classes/clsGameFilter.vb create mode 100644 GBM/Classes/clsGameFilterField.vb diff --git a/GBM/Classes/clsGame.vb b/GBM/Classes/clsGame.vb index 5340ebe..fb7ce2e 100644 --- a/GBM/Classes/clsGame.vb +++ b/GBM/Classes/clsGame.vb @@ -406,4 +406,12 @@ Public Class clsGame Return sProcessName End Function + Public Shared Function SetSyncField(ByVal eSyncFields As eOptionalSyncFields, ByVal eSyncField As eOptionalSyncFields) As eOptionalSyncFields + Return eSyncFields Or eSyncField + End Function + + Public Shared Function RemoveSyncField(ByVal eSyncFields As eOptionalSyncFields, ByVal eSyncField As eOptionalSyncFields) As eOptionalSyncFields + Return eSyncFields And (Not eSyncField) + End Function + End Class diff --git a/GBM/Classes/clsGameFilter.vb b/GBM/Classes/clsGameFilter.vb new file mode 100644 index 0000000..e6c2f24 --- /dev/null +++ b/GBM/Classes/clsGameFilter.vb @@ -0,0 +1,81 @@ +Public Class clsGameFilter + + Private sID As String + Private oField As clsGameFilterField + Private oData As Object + Private eNumericOperator As eNumericOperators = eNumericOperators.Equals + Private bNextBoolOperator As Boolean + + Public Enum eNumericOperators + Equals = 1 + Greater = 2 + Lesser = 3 + GreaterEquals = 4 + LesserEquals = 5 + End Enum + + Public Property ID As String + Get + Return sID + End Get + Set(value As String) + sID = value + End Set + End Property + + Public Property Field As clsGameFilterField + Get + Return oField + End Get + Set(value As clsGameFilterField) + oField = value + End Set + End Property + + Public Property Data As Object + Get + Return oData + End Get + Set(value As Object) + oData = value + End Set + End Property + + Public Property NextBoolOperator As Boolean + Get + Return bNextBoolOperator + End Get + Set(value As Boolean) + bNextBoolOperator = value + End Set + End Property + + Public Property NumericOperator As eNumericOperators + Get + Return eNumericOperator + End Get + Set(value As eNumericOperators) + eNumericOperator = value + End Set + End Property + + Public ReadOnly Property NumericOperatorAsString As String + Get + Select Case eNumericOperator + Case eNumericOperators.Equals + Return "=" + Case eNumericOperators.Greater + Return ">" + Case eNumericOperators.GreaterEquals + Return ">=" + Case eNumericOperators.Lesser + Return "<" + Case eNumericOperators.LesserEquals + Return "<=" + Case Else + Return String.Empty + End Select + End Get + End Property + +End Class diff --git a/GBM/Classes/clsGameFilterField.vb b/GBM/Classes/clsGameFilterField.vb new file mode 100644 index 0000000..7e97302 --- /dev/null +++ b/GBM/Classes/clsGameFilterField.vb @@ -0,0 +1,77 @@ +Public Class clsGameFilterField + + Public Enum eDataType As Integer + fString = 1 + fNumeric = 2 + fBool = 3 + End Enum + + Public Enum eFieldStatus + None = 0 + ValidFilter = 1 + ValidSort = 2 + End Enum + + Private sFieldName As String + Private sFriendlyFieldName As String + Private eType As eDataType + Private eStatus As eFieldStatus + + Public Property FieldName As String + Get + Return sFieldName + End Get + Set(value As String) + sFieldName = value + End Set + End Property + + Public Property FriendlyFieldName As String + Get + Return sFriendlyFieldName + End Get + Set(value As String) + sFriendlyFieldName = value + End Set + End Property + + Public Property Type As eDataType + Get + Return eType + End Get + Set(value As eDataType) + eType = value + End Set + End Property + + 'This is a flag property - Setting a value will toggle that flag on and off. + Public Property Status As eFieldStatus + Get + Return eStatus + End Get + Set(value As eFieldStatus) + If (eStatus And value) = value Then + eStatus = RemoveFieldStatus(value) + Else + eStatus = SetFieldStatus(value) + End If + End Set + End Property + + Private Function SetFieldStatus(ByVal eFlag As eFieldStatus) As eFieldStatus + Return eStatus Or eFlag + End Function + + Private Function RemoveFieldStatus(ByVal eFlag As eFieldStatus) As eFieldStatus + Return eStatus And (Not eFlag) + End Function + + Public Function CheckStatus(ByVal eFlag As eFieldStatus) As Boolean + If (eStatus And eFlag) = eFlag Then + Return True + Else + Return False + End If + End Function + +End Class diff --git a/GBM/Forms/frmFilter.Designer.vb b/GBM/Forms/frmFilter.Designer.vb index c376553..7de0d3f 100644 --- a/GBM/Forms/frmFilter.Designer.vb +++ b/GBM/Forms/frmFilter.Designer.vb @@ -34,29 +34,36 @@ Partial Class frmFilter Me.lstTags = New System.Windows.Forms.ListBox() Me.btnOK = New System.Windows.Forms.Button() Me.grpGameFilter = New System.Windows.Forms.GroupBox() + Me.cboBoolFilter = New System.Windows.Forms.ComboBox() + Me.numFilter = New System.Windows.Forms.NumericUpDown() + Me.cboNumericOps = New System.Windows.Forms.ComboBox() + Me.lblCurrentFilters = New System.Windows.Forms.Label() + Me.lblFilterData = New System.Windows.Forms.Label() + Me.lblFields = New System.Windows.Forms.Label() Me.btnRemoveFilter = New System.Windows.Forms.Button() Me.lstFilter = New System.Windows.Forms.ListBox() Me.btnAddFilter = New System.Windows.Forms.Button() Me.cboFilterField = New System.Windows.Forms.ComboBox() - Me.grpGameInfoOptions = New System.Windows.Forms.GroupBox() + Me.grpNextFilterOperator = New System.Windows.Forms.GroupBox() Me.optOr = New System.Windows.Forms.RadioButton() Me.optAnd = New System.Windows.Forms.RadioButton() - Me.txtFilterData = New System.Windows.Forms.TextBox() + Me.txtStringFilter = New System.Windows.Forms.TextBox() Me.grpSorting = New System.Windows.Forms.GroupBox() - Me.optSortDesc = New System.Windows.Forms.RadioButton() + Me.grpSortOptions = New System.Windows.Forms.GroupBox() Me.optSortAsc = New System.Windows.Forms.RadioButton() + Me.optSortDesc = New System.Windows.Forms.RadioButton() + Me.lblSortFields = New System.Windows.Forms.Label() Me.cboSortField = New System.Windows.Forms.ComboBox() - Me.lblOrderBy = New System.Windows.Forms.Label() Me.chkTag = New System.Windows.Forms.CheckBox() Me.chkGameInfo = New System.Windows.Forms.CheckBox() - Me.lblFields = New System.Windows.Forms.Label() - Me.lblFilterData = New System.Windows.Forms.Label() - Me.lblCurrentFilters = New System.Windows.Forms.Label() + Me.Label1 = New System.Windows.Forms.Label() Me.grpTagFilter.SuspendLayout() Me.grpTagOptions.SuspendLayout() Me.grpGameFilter.SuspendLayout() - Me.grpGameInfoOptions.SuspendLayout() + CType(Me.numFilter, System.ComponentModel.ISupportInitialize).BeginInit() + Me.grpNextFilterOperator.SuspendLayout() Me.grpSorting.SuspendLayout() + Me.grpSortOptions.SuspendLayout() Me.SuspendLayout() ' 'grpTagFilter @@ -68,7 +75,7 @@ Partial Class frmFilter Me.grpTagFilter.Controls.Add(Me.btnAdd) Me.grpTagFilter.Controls.Add(Me.lstTagFilter) Me.grpTagFilter.Controls.Add(Me.lstTags) - Me.grpTagFilter.Location = New System.Drawing.Point(12, 253) + Me.grpTagFilter.Location = New System.Drawing.Point(12, 236) Me.grpTagFilter.Name = "grpTagFilter" Me.grpTagFilter.Size = New System.Drawing.Size(385, 198) Me.grpTagFilter.TabIndex = 3 @@ -167,12 +174,15 @@ Partial Class frmFilter Me.btnOK.Location = New System.Drawing.Point(322, 526) Me.btnOK.Name = "btnOK" Me.btnOK.Size = New System.Drawing.Size(75, 23) - Me.btnOK.TabIndex = 5 + Me.btnOK.TabIndex = 6 Me.btnOK.Text = "&OK" Me.btnOK.UseVisualStyleBackColor = True ' 'grpGameFilter ' + Me.grpGameFilter.Controls.Add(Me.cboBoolFilter) + Me.grpGameFilter.Controls.Add(Me.numFilter) + Me.grpGameFilter.Controls.Add(Me.cboNumericOps) Me.grpGameFilter.Controls.Add(Me.lblCurrentFilters) Me.grpGameFilter.Controls.Add(Me.lblFilterData) Me.grpGameFilter.Controls.Add(Me.lblFields) @@ -180,20 +190,74 @@ Partial Class frmFilter Me.grpGameFilter.Controls.Add(Me.lstFilter) Me.grpGameFilter.Controls.Add(Me.btnAddFilter) Me.grpGameFilter.Controls.Add(Me.cboFilterField) - Me.grpGameFilter.Controls.Add(Me.grpGameInfoOptions) - Me.grpGameFilter.Controls.Add(Me.txtFilterData) + Me.grpGameFilter.Controls.Add(Me.grpNextFilterOperator) + Me.grpGameFilter.Controls.Add(Me.txtStringFilter) Me.grpGameFilter.Location = New System.Drawing.Point(12, 35) Me.grpGameFilter.Name = "grpGameFilter" - Me.grpGameFilter.Size = New System.Drawing.Size(385, 189) + Me.grpGameFilter.Size = New System.Drawing.Size(385, 172) Me.grpGameFilter.TabIndex = 1 Me.grpGameFilter.TabStop = False ' + 'cboBoolFilter + ' + Me.cboBoolFilter.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList + Me.cboBoolFilter.FormattingEnabled = True + Me.cboBoolFilter.Location = New System.Drawing.Point(162, 36) + Me.cboBoolFilter.Name = "cboBoolFilter" + Me.cboBoolFilter.Size = New System.Drawing.Size(136, 21) + Me.cboBoolFilter.TabIndex = 3 + ' + 'numFilter + ' + Me.numFilter.DecimalPlaces = 1 + Me.numFilter.Location = New System.Drawing.Point(233, 37) + Me.numFilter.Maximum = New Decimal(New Integer() {1000000, 0, 0, 0}) + Me.numFilter.Name = "numFilter" + Me.numFilter.Size = New System.Drawing.Size(65, 20) + Me.numFilter.TabIndex = 4 + ' + 'cboNumericOps + ' + Me.cboNumericOps.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList + Me.cboNumericOps.FormattingEnabled = True + Me.cboNumericOps.Location = New System.Drawing.Point(162, 36) + Me.cboNumericOps.Name = "cboNumericOps" + Me.cboNumericOps.Size = New System.Drawing.Size(65, 21) + Me.cboNumericOps.TabIndex = 3 + ' + 'lblCurrentFilters + ' + Me.lblCurrentFilters.AutoSize = True + Me.lblCurrentFilters.Location = New System.Drawing.Point(94, 65) + Me.lblCurrentFilters.Name = "lblCurrentFilters" + Me.lblCurrentFilters.Size = New System.Drawing.Size(71, 13) + Me.lblCurrentFilters.TabIndex = 6 + Me.lblCurrentFilters.Text = "Current Filters" + ' + 'lblFilterData + ' + Me.lblFilterData.AutoSize = True + Me.lblFilterData.Location = New System.Drawing.Point(214, 20) + Me.lblFilterData.Name = "lblFilterData" + Me.lblFilterData.Size = New System.Drawing.Size(32, 13) + Me.lblFilterData.TabIndex = 2 + Me.lblFilterData.Text = "Filter " + ' + 'lblFields + ' + Me.lblFields.AutoSize = True + Me.lblFields.Location = New System.Drawing.Point(41, 20) + Me.lblFields.Name = "lblFields" + Me.lblFields.Size = New System.Drawing.Size(80, 13) + Me.lblFields.TabIndex = 0 + Me.lblFields.Text = "Available Fields" + ' 'btnRemoveFilter ' - Me.btnRemoveFilter.Location = New System.Drawing.Point(259, 153) + Me.btnRemoveFilter.Location = New System.Drawing.Point(259, 140) Me.btnRemoveFilter.Name = "btnRemoveFilter" Me.btnRemoveFilter.Size = New System.Drawing.Size(75, 23) - Me.btnRemoveFilter.TabIndex = 8 + Me.btnRemoveFilter.TabIndex = 9 Me.btnRemoveFilter.Text = "Remove" Me.btnRemoveFilter.UseVisualStyleBackColor = True ' @@ -202,15 +266,15 @@ Partial Class frmFilter Me.lstFilter.FormattingEnabled = True Me.lstFilter.Location = New System.Drawing.Point(6, 81) Me.lstFilter.Name = "lstFilter" - Me.lstFilter.Size = New System.Drawing.Size(247, 95) - Me.lstFilter.TabIndex = 6 + Me.lstFilter.Size = New System.Drawing.Size(247, 82) + Me.lstFilter.TabIndex = 7 ' 'btnAddFilter ' Me.btnAddFilter.Location = New System.Drawing.Point(304, 34) Me.btnAddFilter.Name = "btnAddFilter" Me.btnAddFilter.Size = New System.Drawing.Size(75, 23) - Me.btnAddFilter.TabIndex = 4 + Me.btnAddFilter.TabIndex = 5 Me.btnAddFilter.Text = "Add" Me.btnAddFilter.UseVisualStyleBackColor = True ' @@ -220,19 +284,19 @@ Partial Class frmFilter Me.cboFilterField.FormattingEnabled = True Me.cboFilterField.Location = New System.Drawing.Point(6, 36) Me.cboFilterField.Name = "cboFilterField" - Me.cboFilterField.Size = New System.Drawing.Size(121, 21) + Me.cboFilterField.Size = New System.Drawing.Size(150, 21) Me.cboFilterField.TabIndex = 1 ' - 'grpGameInfoOptions + 'grpNextFilterOperator ' - Me.grpGameInfoOptions.Controls.Add(Me.optOr) - Me.grpGameInfoOptions.Controls.Add(Me.optAnd) - Me.grpGameInfoOptions.Location = New System.Drawing.Point(259, 81) - Me.grpGameInfoOptions.Name = "grpGameInfoOptions" - Me.grpGameInfoOptions.Size = New System.Drawing.Size(106, 46) - Me.grpGameInfoOptions.TabIndex = 7 - Me.grpGameInfoOptions.TabStop = False - Me.grpGameInfoOptions.Text = "Options" + Me.grpNextFilterOperator.Controls.Add(Me.optOr) + Me.grpNextFilterOperator.Controls.Add(Me.optAnd) + Me.grpNextFilterOperator.Location = New System.Drawing.Point(259, 81) + Me.grpNextFilterOperator.Name = "grpNextFilterOperator" + Me.grpNextFilterOperator.Size = New System.Drawing.Size(106, 46) + Me.grpNextFilterOperator.TabIndex = 8 + Me.grpNextFilterOperator.TabStop = False + Me.grpNextFilterOperator.Text = "Next Filter" ' 'optOr ' @@ -255,70 +319,80 @@ Partial Class frmFilter Me.optAnd.Text = "And" Me.optAnd.UseVisualStyleBackColor = True ' - 'txtFilterData + 'txtStringFilter ' - Me.txtFilterData.Location = New System.Drawing.Point(133, 36) - Me.txtFilterData.Name = "txtFilterData" - Me.txtFilterData.Size = New System.Drawing.Size(165, 20) - Me.txtFilterData.TabIndex = 3 + Me.txtStringFilter.Location = New System.Drawing.Point(162, 36) + Me.txtStringFilter.Name = "txtStringFilter" + Me.txtStringFilter.Size = New System.Drawing.Size(136, 20) + Me.txtStringFilter.TabIndex = 3 ' 'grpSorting ' - Me.grpSorting.Controls.Add(Me.optSortDesc) - Me.grpSorting.Controls.Add(Me.optSortAsc) + Me.grpSorting.Controls.Add(Me.grpSortOptions) + Me.grpSorting.Controls.Add(Me.lblSortFields) Me.grpSorting.Controls.Add(Me.cboSortField) - Me.grpSorting.Controls.Add(Me.lblOrderBy) - Me.grpSorting.Location = New System.Drawing.Point(12, 457) + Me.grpSorting.Location = New System.Drawing.Point(12, 440) Me.grpSorting.Name = "grpSorting" - Me.grpSorting.Size = New System.Drawing.Size(385, 61) + Me.grpSorting.Size = New System.Drawing.Size(385, 80) Me.grpSorting.TabIndex = 4 Me.grpSorting.TabStop = False Me.grpSorting.Text = "Sorting" ' - 'optSortDesc + 'grpSortOptions ' - Me.optSortDesc.AutoSize = True - Me.optSortDesc.Location = New System.Drawing.Point(271, 26) - Me.optSortDesc.Name = "optSortDesc" - Me.optSortDesc.Size = New System.Drawing.Size(82, 17) - Me.optSortDesc.TabIndex = 3 - Me.optSortDesc.TabStop = True - Me.optSortDesc.Text = "Descending" - Me.optSortDesc.UseVisualStyleBackColor = True + Me.grpSortOptions.Controls.Add(Me.optSortAsc) + Me.grpSortOptions.Controls.Add(Me.optSortDesc) + Me.grpSortOptions.Location = New System.Drawing.Point(162, 19) + Me.grpSortOptions.Name = "grpSortOptions" + Me.grpSortOptions.Size = New System.Drawing.Size(189, 43) + Me.grpSortOptions.TabIndex = 3 + Me.grpSortOptions.TabStop = False + Me.grpSortOptions.Text = "Sort Options" ' 'optSortAsc ' Me.optSortAsc.AutoSize = True - Me.optSortAsc.Location = New System.Drawing.Point(190, 26) + Me.optSortAsc.Location = New System.Drawing.Point(6, 17) Me.optSortAsc.Name = "optSortAsc" Me.optSortAsc.Size = New System.Drawing.Size(75, 17) - Me.optSortAsc.TabIndex = 2 + Me.optSortAsc.TabIndex = 0 Me.optSortAsc.TabStop = True Me.optSortAsc.Text = "Ascending" Me.optSortAsc.UseVisualStyleBackColor = True ' + 'optSortDesc + ' + Me.optSortDesc.AutoSize = True + Me.optSortDesc.Location = New System.Drawing.Point(90, 17) + Me.optSortDesc.Name = "optSortDesc" + Me.optSortDesc.Size = New System.Drawing.Size(82, 17) + Me.optSortDesc.TabIndex = 1 + Me.optSortDesc.TabStop = True + Me.optSortDesc.Text = "Descending" + Me.optSortDesc.UseVisualStyleBackColor = True + ' + 'lblSortFields + ' + Me.lblSortFields.AutoSize = True + Me.lblSortFields.Location = New System.Drawing.Point(41, 19) + Me.lblSortFields.Name = "lblSortFields" + Me.lblSortFields.Size = New System.Drawing.Size(80, 13) + Me.lblSortFields.TabIndex = 1 + Me.lblSortFields.Text = "Available Fields" + ' 'cboSortField ' Me.cboSortField.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList Me.cboSortField.FormattingEnabled = True - Me.cboSortField.Location = New System.Drawing.Point(63, 25) + Me.cboSortField.Location = New System.Drawing.Point(6, 35) Me.cboSortField.Name = "cboSortField" - Me.cboSortField.Size = New System.Drawing.Size(121, 21) - Me.cboSortField.TabIndex = 1 - ' - 'lblOrderBy - ' - Me.lblOrderBy.AutoSize = True - Me.lblOrderBy.Location = New System.Drawing.Point(6, 28) - Me.lblOrderBy.Name = "lblOrderBy" - Me.lblOrderBy.Size = New System.Drawing.Size(51, 13) - Me.lblOrderBy.TabIndex = 0 - Me.lblOrderBy.Text = "Order By:" + Me.cboSortField.Size = New System.Drawing.Size(150, 21) + Me.cboSortField.TabIndex = 2 ' 'chkTag ' Me.chkTag.AutoSize = True - Me.chkTag.Location = New System.Drawing.Point(12, 230) + Me.chkTag.Location = New System.Drawing.Point(12, 213) Me.chkTag.Name = "chkTag" Me.chkTag.Size = New System.Drawing.Size(45, 17) Me.chkTag.TabIndex = 2 @@ -335,38 +409,21 @@ Partial Class frmFilter Me.chkGameInfo.Text = "Game Information" Me.chkGameInfo.UseVisualStyleBackColor = True ' - 'lblFields + 'Label1 ' - Me.lblFields.AutoSize = True - Me.lblFields.Location = New System.Drawing.Point(26, 20) - Me.lblFields.Name = "lblFields" - Me.lblFields.Size = New System.Drawing.Size(80, 13) - Me.lblFields.TabIndex = 0 - Me.lblFields.Text = "Available Fields" - ' - 'lblFilterData - ' - Me.lblFilterData.AutoSize = True - Me.lblFilterData.Location = New System.Drawing.Point(199, 20) - Me.lblFilterData.Name = "lblFilterData" - Me.lblFilterData.Size = New System.Drawing.Size(32, 13) - Me.lblFilterData.TabIndex = 2 - Me.lblFilterData.Text = "Filter " - ' - 'lblCurrentFilters - ' - Me.lblCurrentFilters.AutoSize = True - Me.lblCurrentFilters.Location = New System.Drawing.Point(94, 65) - Me.lblCurrentFilters.Name = "lblCurrentFilters" - Me.lblCurrentFilters.Size = New System.Drawing.Size(71, 13) - Me.lblCurrentFilters.TabIndex = 5 - Me.lblCurrentFilters.Text = "Current Filters" + Me.Label1.AutoSize = True + Me.Label1.Location = New System.Drawing.Point(12, 531) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(249, 13) + Me.Label1.TabIndex = 5 + Me.Label1.Text = "* Indicates a field that may give unexpected results." ' 'frmFilter ' Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.ClientSize = New System.Drawing.Size(409, 561) + Me.Controls.Add(Me.Label1) Me.Controls.Add(Me.grpSorting) Me.Controls.Add(Me.chkTag) Me.Controls.Add(Me.grpGameFilter) @@ -385,9 +442,12 @@ Partial Class frmFilter Me.grpTagOptions.ResumeLayout(False) Me.grpGameFilter.ResumeLayout(False) Me.grpGameFilter.PerformLayout() - Me.grpGameInfoOptions.ResumeLayout(False) + CType(Me.numFilter, System.ComponentModel.ISupportInitialize).EndInit() + Me.grpNextFilterOperator.ResumeLayout(False) Me.grpSorting.ResumeLayout(False) Me.grpSorting.PerformLayout() + Me.grpSortOptions.ResumeLayout(False) + Me.grpSortOptions.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -404,15 +464,14 @@ Partial Class frmFilter Friend WithEvents lstTags As System.Windows.Forms.ListBox Friend WithEvents btnOK As System.Windows.Forms.Button Friend WithEvents grpGameFilter As System.Windows.Forms.GroupBox - Friend WithEvents txtFilterData As System.Windows.Forms.TextBox - Friend WithEvents grpGameInfoOptions As System.Windows.Forms.GroupBox + Friend WithEvents txtStringFilter As System.Windows.Forms.TextBox + Friend WithEvents grpNextFilterOperator As System.Windows.Forms.GroupBox Friend WithEvents optOr As System.Windows.Forms.RadioButton Friend WithEvents optAnd As System.Windows.Forms.RadioButton Friend WithEvents grpSorting As GroupBox Friend WithEvents optSortDesc As RadioButton Friend WithEvents optSortAsc As RadioButton Friend WithEvents cboSortField As ComboBox - Friend WithEvents lblOrderBy As Label Friend WithEvents chkTag As CheckBox Friend WithEvents chkGameInfo As CheckBox Friend WithEvents cboFilterField As ComboBox @@ -422,4 +481,10 @@ Partial Class frmFilter Friend WithEvents lblCurrentFilters As Label Friend WithEvents lblFilterData As Label Friend WithEvents lblFields As Label + Friend WithEvents cboNumericOps As ComboBox + Friend WithEvents numFilter As NumericUpDown + Friend WithEvents cboBoolFilter As ComboBox + Friend WithEvents lblSortFields As Label + Friend WithEvents Label1 As Label + Friend WithEvents grpSortOptions As GroupBox End Class diff --git a/GBM/Forms/frmFilter.vb b/GBM/Forms/frmFilter.vb index 8515505..d2bd274 100644 --- a/GBM/Forms/frmFilter.vb +++ b/GBM/Forms/frmFilter.vb @@ -9,53 +9,9 @@ Public Class frmFilter NoTags = 4 End Enum - Public Class clsFilter - - Private sID As String - Private sField As String - Private oData As Object - Private bAndOperator As Boolean - - Public Property ID As String - Get - Return sID - End Get - Set(value As String) - sID = value - End Set - End Property - - Public Property Field As String - Get - Return sField - End Get - Set(value As String) - sField = value - End Set - End Property - - Public Property Data As Object - Get - Return oData - End Get - Set(value As Object) - oData = value - End Set - End Property - - Public Property AndOperator As Boolean - Get - Return bAndOperator - End Get - Set(value As Boolean) - bAndOperator = value - End Set - End Property - - End Class - Dim oTagFilters As New List(Of clsTag) - Dim oGameFilters As New List(Of clsFilter) + Dim oGameFilters As New List(Of clsGameFilter) + Dim oValidFields As New List(Of clsGameFilterField) Dim eCurrentFilterType As eFilterType = eFilterType.BaseFilter Dim bSortAsc As Boolean = True Dim sSortField As String = "Name" @@ -63,34 +19,49 @@ Public Class frmFilter Dim bShutdown As Boolean = False Dim iParameterIndex As Integer = 0 - Public ReadOnly Property GameFilters As List(Of clsFilter) + Public Property GameFilters As List(Of clsGameFilter) Get Return oGameFilters End Get + Set(value As List(Of clsGameFilter)) + oGameFilters = value + End Set End Property - Public ReadOnly Property TagFilters As List(Of clsTag) + Public Property TagFilters As List(Of clsTag) Get Return oTagFilters End Get + Set(value As List(Of clsTag)) + oTagFilters = value + End Set End Property - Public ReadOnly Property FilterType As eFilterType + Public Property FilterType As eFilterType Get Return eCurrentFilterType End Get + Set(value As eFilterType) + eCurrentFilterType = value + End Set End Property - Public ReadOnly Property SortAsc As Boolean + Public Property SortAsc As Boolean Get Return bSortAsc End Get + Set(value As Boolean) + bSortAsc = value + End Set End Property - Public ReadOnly Property SortField As String + Public Property SortField As String Get Return sSortField End Get + Set(value As String) + sSortField = value + End Set End Property Private Sub AddTag() @@ -139,7 +110,154 @@ Public Class frmFilter End Sub - Private Sub LoadData() + Private Sub LoadFilterFields() + Dim oField As clsGameFilterField + + 'Name + oField = New clsGameFilterField + oField.FieldName = "Name" + oField.FriendlyFieldName = frmFilter_FieldName + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidSort + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Process + oField = New clsGameFilterField + oField.FieldName = "Process" + oField.FriendlyFieldName = frmFilter_FieldProcess + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidSort + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Parameter + oField = New clsGameFilterField + oField.FieldName = "Parameter" + oField.FriendlyFieldName = frmFilter_FieldParameter + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidSort + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Save Path + oField = New clsGameFilterField + oField.FieldName = "Path" + oField.FriendlyFieldName = frmFilter_FieldPath + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Include Items + oField = New clsGameFilterField + oField.FieldName = "FileType" + oField.FriendlyFieldName = frmFilter_FieldFileType + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Exclude Items + oField = New clsGameFilterField + oField.FieldName = "ExcludeList" + oField.FriendlyFieldName = frmFilter_FieldExcludeList + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Save Entire Folder + oField = New clsGameFilterField + oField.FieldName = "FolderSave" + oField.FriendlyFieldName = frmFilter_FieldFolderSave + oField.Type = clsGameFilterField.eDataType.fBool + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Delete Folder on Restore + oField = New clsGameFilterField + oField.FieldName = "CleanFolder" + oField.FriendlyFieldName = frmFilter_FieldCleanFolder + oField.Type = clsGameFilterField.eDataType.fBool + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Save Multiple Backups + oField = New clsGameFilterField + oField.FieldName = "TimeStamp" + oField.FriendlyFieldName = frmFilter_FieldTimeStamp + oField.Type = clsGameFilterField.eDataType.fBool + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Backup Limit + oField = New clsGameFilterField + oField.FieldName = "BackupLimit" + oField.FriendlyFieldName = frmFilter_FieldBackupLimit + oField.Type = clsGameFilterField.eDataType.fNumeric + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Game Path + oField = New clsGameFilterField + oField.FieldName = "ProcessPath" + oField.FriendlyFieldName = frmFilter_FieldProcessPath + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Company + oField = New clsGameFilterField + oField.FieldName = "Company" + oField.FriendlyFieldName = frmFilter_FieldCompany + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidSort + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Version + oField = New clsGameFilterField + oField.FieldName = "Version" + oField.FriendlyFieldName = frmFilter_FieldVersion + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidSort + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Icon + oField = New clsGameFilterField + oField.FieldName = "Icon" + oField.FriendlyFieldName = frmFilter_FieldIcon + oField.Type = clsGameFilterField.eDataType.fString + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Hours + oField = New clsGameFilterField + oField.FieldName = "Hours" + oField.FriendlyFieldName = frmFilter_FieldHours + oField.Type = clsGameFilterField.eDataType.fNumeric + oField.Status = clsGameFilterField.eFieldStatus.ValidSort + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Enabled + oField = New clsGameFilterField + oField.FieldName = "Enabled" + oField.FriendlyFieldName = frmFilter_FieldEnabled + oField.Type = clsGameFilterField.eDataType.fBool + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + 'Monitor Only + oField = New clsGameFilterField + oField.FieldName = "MonitorOnly" + oField.FriendlyFieldName = frmFilter_FieldMonitorOnly + oField.Type = clsGameFilterField.eDataType.fBool + oField.Status = clsGameFilterField.eFieldStatus.ValidFilter + oValidFields.Add(oField) + + End Sub + + Private Sub LoadTagData() Dim oTag As clsTag Dim oData As KeyValuePair(Of String, String) @@ -152,6 +270,7 @@ Public Class frmFilter lstTags.ValueMember = "Key" lstTags.DisplayMember = "Value" + lstTagFilter.ValueMember = "Key" lstTagFilter.DisplayMember = "Value" @@ -163,30 +282,121 @@ Public Class frmFilter End Sub - Private Sub AddFilter() - Dim oFilter As New clsFilter - Dim sFilter As String + Private Sub LoadExistingFilters() + Dim sFilter As String = String.Empty + Dim oListTag As KeyValuePair(Of String, String) - lstFilter.ValueMember = "Key" - lstFilter.DisplayMember = "Value" + 'Game Filters + If oGameFilters.Count > 0 Then + chkGameInfo.Checked = True + For Each oFilter As clsGameFilter In oGameFilters + Select Case oFilter.Field.Type + Case clsGameFilterField.eDataType.fString + sFilter = oFilter.Field.FriendlyFieldName & " " & frmFilter_lstFilterContains & " """ & oFilter.Data & """ / " + Case clsGameFilterField.eDataType.fNumeric + oFilter.NumericOperator = DirectCast(cboNumericOps.SelectedValue, clsGameFilter.eNumericOperators) + sFilter = oFilter.Field.FriendlyFieldName & " " & oFilter.NumericOperatorAsString & " " & oFilter.Data & " / " + Case clsGameFilterField.eDataType.fBool + sFilter = oFilter.Field.FriendlyFieldName & " = " & oFilter.Data & " / " + End Select + + If oFilter.NextBoolOperator Then + sFilter &= frmFilter_optAnd + Else + sFilter &= frmFilter_optOr + End If + + iParameterIndex += 1 + + lstFilter.Items.Add(New KeyValuePair(Of clsGameFilter, String)(oFilter, sFilter)) + Next + End If + + 'Tag Filters + If oTagFilters.Count > 0 Then + chkTag.Checked = True + For Each oTag As clsTag In oTagFilters + oListTag = New KeyValuePair(Of String, String)(oTag.ID, oTag.Name) + lstTagFilter.Items.Add(oListTag) + lstTags.Items.Remove(oListTag) + Next + + If eCurrentFilterType = eFilterType.AllTags Then + optAll.Checked = True + Else + optAny.Checked = True + End If + End If + + 'Sorting + cboSortField.SelectedValue = sSortField + If bSortAsc Then + optSortAsc.Checked = True + Else + optSortDesc.Checked = True + End If + + End Sub + + Private Sub ChangeFilterMode() + Dim oFilterType As clsGameFilterField.eDataType = DirectCast(cboFilterField.SelectedValue, clsGameFilterField).Type + + 'Reset + cboNumericOps.SelectedIndex = 0 + cboBoolFilter.SelectedIndex = 0 + numFilter.Value = 0 + txtStringFilter.Text = String.Empty + + 'Reset Visibilty + cboBoolFilter.Visible = False + cboNumericOps.Visible = False + numFilter.Visible = False + txtStringFilter.Visible = False + + 'Set Visiblity + Select Case oFilterType + Case clsGameFilterField.eDataType.fString + txtStringFilter.Visible = True + Case clsGameFilterField.eDataType.fNumeric + cboNumericOps.Visible = True + numFilter.Visible = True + txtStringFilter.Visible = False + Case clsGameFilterField.eDataType.fBool + cboBoolFilter.Visible = True + End Select + + End Sub + + Private Sub AddFilter() + Dim oFilter As New clsGameFilter + Dim sFilter As String = String.Empty 'Build Filter oFilter.ID = "PARAM" & iParameterIndex oFilter.Field = cboFilterField.SelectedValue - oFilter.Data = txtFilterData.Text - oFilter.AndOperator = optAnd.Checked + oFilter.NextBoolOperator = optAnd.Checked - oGameFilters.Add(oFilter) + Select Case oFilter.Field.Type + Case clsGameFilterField.eDataType.fString + oFilter.Data = txtStringFilter.Text + sFilter = oFilter.Field.FriendlyFieldName & " " & frmFilter_lstFilterContains & " """ & oFilter.Data & """ / " + Case clsGameFilterField.eDataType.fNumeric + oFilter.Data = numFilter.Value + oFilter.NumericOperator = DirectCast(cboNumericOps.SelectedValue, clsGameFilter.eNumericOperators) + sFilter = oFilter.Field.FriendlyFieldName & " " & oFilter.NumericOperatorAsString & " " & oFilter.Data & " / " + Case clsGameFilterField.eDataType.fBool + oFilter.Data = cboBoolFilter.SelectedValue + sFilter = oFilter.Field.FriendlyFieldName & " = " & oFilter.Data & " / " + End Select - 'Build String - sFilter = oFilter.Field & " / " & oFilter.Data & " / " - If oFilter.AndOperator Then + If oFilter.NextBoolOperator Then sFilter &= frmFilter_optAnd Else sFilter &= frmFilter_optOr End If - lstFilter.Items.Add(New KeyValuePair(Of clsFilter, String)(oFilter, sFilter)) + oGameFilters.Add(oFilter) + lstFilter.Items.Add(New KeyValuePair(Of clsGameFilter, String)(oFilter, sFilter)) iParameterIndex += 1 End Sub @@ -196,7 +406,7 @@ Public Class frmFilter If lstFilter.SelectedIndex <> -1 Then oFilter = lstFilter.SelectedItem - oGameFilters.Remove(DirectCast(oFilter, KeyValuePair(Of clsFilter, String)).Key) + oGameFilters.Remove(DirectCast(oFilter, KeyValuePair(Of clsGameFilter, String)).Key) lstFilter.Items.Remove(oFilter) End If @@ -214,6 +424,7 @@ Public Class frmFilter If chkTag.Checked Then 'Set Tags + TagFilters.Clear() For Each oData In lstTagFilter.Items oTag = DirectCast(hshTags(oData.Value), clsTag) TagFilters.Add(oTag) @@ -241,18 +452,41 @@ Public Class frmFilter End Sub Private Sub LoadCombos() - Dim oFilterFields As New List(Of KeyValuePair(Of String, String)) + Dim oFilterFields As New List(Of KeyValuePair(Of clsGameFilterField, String)) Dim oSortFields As New List(Of KeyValuePair(Of String, String)) + Dim oNumericOperators As New List(Of KeyValuePair(Of clsGameFilter.eNumericOperators, String)) + Dim oBoolOperators As New List(Of KeyValuePair(Of Boolean, String)) + + 'cboBoolFilter + cboBoolFilter.ValueMember = "Key" + cboBoolFilter.DisplayMember = "Value" + + oBoolOperators.Add(New KeyValuePair(Of Boolean, String)(True, frmFilter_cboBoolFilterEnabled)) + oBoolOperators.Add(New KeyValuePair(Of Boolean, String)(False, frmFilter_cboBoolFilterDisabled)) + + cboBoolFilter.DataSource = oBoolOperators + + 'cboNumericOps + cboNumericOps.ValueMember = "Key" + cboNumericOps.DisplayMember = "Value" + + oNumericOperators.Add(New KeyValuePair(Of clsGameFilter.eNumericOperators, String)(clsGameFilter.eNumericOperators.Equals, "=")) + oNumericOperators.Add(New KeyValuePair(Of clsGameFilter.eNumericOperators, String)(clsGameFilter.eNumericOperators.Greater, ">")) + oNumericOperators.Add(New KeyValuePair(Of clsGameFilter.eNumericOperators, String)(clsGameFilter.eNumericOperators.Lesser, "<")) + oNumericOperators.Add(New KeyValuePair(Of clsGameFilter.eNumericOperators, String)(clsGameFilter.eNumericOperators.GreaterEquals, ">=")) + oNumericOperators.Add(New KeyValuePair(Of clsGameFilter.eNumericOperators, String)(clsGameFilter.eNumericOperators.LesserEquals, "<=")) + + cboNumericOps.DataSource = oNumericOperators 'cboFilterField cboFilterField.ValueMember = "Key" cboFilterField.DisplayMember = "Value" - oFilterFields.Add(New KeyValuePair(Of String, String)("Name", frmFilter_FieldName)) - oFilterFields.Add(New KeyValuePair(Of String, String)("Process", frmFilter_FieldProcess)) - oFilterFields.Add(New KeyValuePair(Of String, String)("Parameter", frmFilter_FieldParameter)) - oFilterFields.Add(New KeyValuePair(Of String, String)("Company", frmFilter_FieldCompany)) - oFilterFields.Add(New KeyValuePair(Of String, String)("Version", frmFilter_FieldVersion)) + For Each oField As clsGameFilterField In oValidFields + If oField.CheckStatus(clsGameFilterField.eFieldStatus.ValidFilter) Then + oFilterFields.Add(New KeyValuePair(Of clsGameFilterField, String)(oField, oField.FriendlyFieldName)) + End If + Next cboFilterField.DataSource = oFilterFields @@ -260,16 +494,16 @@ Public Class frmFilter cboSortField.ValueMember = "Key" cboSortField.DisplayMember = "Value" - oSortFields.Add(New KeyValuePair(Of String, String)("Name", frmFilter_FieldName)) - oSortFields.Add(New KeyValuePair(Of String, String)("Process", frmFilter_FieldProcess)) - oSortFields.Add(New KeyValuePair(Of String, String)("Parameter", frmFilter_FieldParameter)) - oSortFields.Add(New KeyValuePair(Of String, String)("Company", frmFilter_FieldCompany)) - oSortFields.Add(New KeyValuePair(Of String, String)("Version", frmFilter_FieldVersion)) - oSortFields.Add(New KeyValuePair(Of String, String)("Hours", frmFilter_FieldHours)) + For Each oField As clsGameFilterField In oValidFields + If oField.CheckStatus(clsGameFilterField.eFieldStatus.ValidSort) Then + oSortFields.Add(New KeyValuePair(Of String, String)(oField.FieldName, oField.FriendlyFieldName)) + End If + Next cboSortField.DataSource = oSortFields 'Select Defaults + cboNumericOps.SelectedIndex = 0 cboFilterField.SelectedIndex = 0 cboSortField.SelectedIndex = 0 End Sub @@ -281,7 +515,7 @@ Public Class frmFilter 'Set Form Text optOr.Text = frmFilter_optOr optAnd.Text = frmFilter_optAnd - grpGameInfoOptions.Text = frmFilter_grpGameInfoOptions + grpNextFilterOperator.Text = frmFilter_grpNextFilterOperator optAll.Text = frmFilter_optAll optAny.Text = frmFilter_optAny lblGameTags.Text = frmFilter_lblGameTags @@ -293,7 +527,7 @@ Public Class frmFilter chkTag.Text = frmFilter_chkTag chkGameInfo.Text = frmFilter_chkGameInfo grpSorting.Text = frmFilter_grpSorting - lblOrderBy.Text = frmFilter_lblOrderBy + lblSortFields.Text = frmFilter_lblSortsFields optSortAsc.Text = frmFilter_optSortAsc optSortDesc.Text = frmFilter_optSortDesc btnAddFilter.Text = frmFilter_btnAddFilter @@ -301,17 +535,24 @@ Public Class frmFilter lblCurrentFilters.Text = frmFilter_lblCurrentFilters lblFields.Text = frmFilter_lblFields lblFilterData.Text = frmFilter_lblFilterData + grpSortOptions.Text = frmFilter_grpSortOptions 'Defaults optSortAsc.Checked = True grpGameFilter.Enabled = False grpTagFilter.Enabled = False + + 'Init Game Filter + lstFilter.ValueMember = "Key" + lstFilter.DisplayMember = "Value" End Sub Private Sub frmGameTags_Load(sender As Object, e As EventArgs) Handles MyBase.Load SetForm() + LoadFilterFields() LoadCombos() - LoadData() + LoadTagData() + LoadExistingFilters() End Sub Private Sub btnOK_Click(sender As Object, e As EventArgs) Handles btnOK.Click @@ -339,6 +580,8 @@ Public Class frmFilter grpGameFilter.Enabled = True Else grpGameFilter.Enabled = False + oGameFilters.Clear() + lstFilter.Items.Clear() End If End Sub @@ -347,6 +590,8 @@ Public Class frmFilter grpTagFilter.Enabled = True Else grpTagFilter.Enabled = False + oTagFilters.Clear() + LoadTagData() End If End Sub @@ -357,4 +602,9 @@ Public Class frmFilter Private Sub btnRemoveFilter_Click(sender As Object, e As EventArgs) Handles btnRemoveFilter.Click RemoveFilter() End Sub + + Private Sub cboFilterField_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cboFilterField.SelectedIndexChanged + ChangeFilterMode() + End Sub + End Class \ No newline at end of file diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 7195522..ae4d61a 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -20,7 +20,7 @@ Public Class frmGameManager Private bIsDirty As Boolean = False Private bIsLoading As Boolean = False Private oCurrentTagFilters As New List(Of clsTag) - Private oCurrentFilters As New List(Of frmFilter.clsFilter) + Private oCurrentFilters As New List(Of clsGameFilter) Private eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter Private bCurrentSortAsc As Boolean = True Private sCurrentSortField As String = "Name" @@ -225,7 +225,14 @@ Public Class frmGameManager If optCustom.Checked Then If Not bRetainFilter Then frm = New frmFilter + frm.TagFilters = oCurrentTagFilters + frm.GameFilters = oCurrentFilters + frm.FilterType = eCurrentFilter + frm.SortAsc = bCurrentSortAsc + frm.SortField = sCurrentSortField + frm.ShowDialog() + oCurrentTagFilters = frm.TagFilters oCurrentFilters = frm.GameFilters eCurrentFilter = frm.FilterType diff --git a/GBM/Forms/frmSyncFields.vb b/GBM/Forms/frmSyncFields.vb index 7200cc9..cea9a57 100644 --- a/GBM/Forms/frmSyncFields.vb +++ b/GBM/Forms/frmSyncFields.vb @@ -67,49 +67,49 @@ Public Class frmSyncFields Private Sub chkTimeStamp_CheckedChanged(sender As Object, e As EventArgs) Handles chkTimeStamp.CheckedChanged If chkTimeStamp.Checked Then - SyncFields = mgrCommon.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.TimeStamp) + SyncFields = clsGame.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.TimeStamp) Else - SyncFields = mgrCommon.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.TimeStamp) + SyncFields = clsGame.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.TimeStamp) End If End Sub Private Sub chkGamePath_CheckedChanged(sender As Object, e As EventArgs) Handles chkGamePath.CheckedChanged If chkGamePath.Checked Then - SyncFields = mgrCommon.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.GamePath) + SyncFields = clsGame.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.GamePath) Else - SyncFields = mgrCommon.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.GamePath) + SyncFields = clsGame.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.GamePath) End If End Sub Private Sub chkCompany_CheckedChanged(sender As Object, e As EventArgs) Handles chkCompany.CheckedChanged If chkCompany.Checked Then - SyncFields = mgrCommon.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.Company) + SyncFields = clsGame.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.Company) Else - SyncFields = mgrCommon.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.Company) + SyncFields = clsGame.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.Company) End If End Sub Private Sub chkVersion_CheckedChanged(sender As Object, e As EventArgs) Handles chkVersion.CheckedChanged If chkVersion.Checked Then - SyncFields = mgrCommon.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.Version) + SyncFields = clsGame.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.Version) Else - SyncFields = mgrCommon.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.Version) + SyncFields = clsGame.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.Version) End If End Sub Private Sub chkIcon_CheckedChanged(sender As Object, e As EventArgs) Handles chkIcon.CheckedChanged If chkIcon.Checked Then - SyncFields = mgrCommon.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.Icon) + SyncFields = clsGame.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.Icon) Else - SyncFields = mgrCommon.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.Icon) + SyncFields = clsGame.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.Icon) End If End Sub Private Sub chkMonitorGame_CheckedChanged(sender As Object, e As EventArgs) Handles chkMonitorGame.CheckedChanged If chkMonitorGame.Checked Then - SyncFields = mgrCommon.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.MonitorGame) + SyncFields = clsGame.SetSyncField(SyncFields, clsGame.eOptionalSyncFields.MonitorGame) Else - SyncFields = mgrCommon.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.MonitorGame) + SyncFields = clsGame.RemoveSyncField(SyncFields, clsGame.eOptionalSyncFields.MonitorGame) End If End Sub End Class \ No newline at end of file diff --git a/GBM/Game Backup Monitor.vbproj b/GBM/Game Backup Monitor.vbproj index 0267ad9..d4826e5 100644 --- a/GBM/Game Backup Monitor.vbproj +++ b/GBM/Game Backup Monitor.vbproj @@ -122,6 +122,8 @@ + + diff --git a/GBM/Managers/mgrCommon.vb b/GBM/Managers/mgrCommon.vb index d5b1c5a..5b19883 100644 --- a/GBM/Managers/mgrCommon.vb +++ b/GBM/Managers/mgrCommon.vb @@ -237,14 +237,6 @@ Public Class mgrCommon oProcess.Start() End Sub - Public Shared Function SetSyncField(ByVal eSyncFields As clsGame.eOptionalSyncFields, ByVal eSyncField As clsGame.eOptionalSyncFields) As clsGame.eOptionalSyncFields - Return eSyncFields Or eSyncField - End Function - - Public Shared Function RemoveSyncField(ByVal eSyncFields As clsGame.eOptionalSyncFields, ByVal eSyncField As clsGame.eOptionalSyncFields) As clsGame.eOptionalSyncFields - Return eSyncFields And (Not eSyncField) - End Function - 'Get a file size Public Shared Function GetFileSize(ByVal sFile As String) As Long Dim oFileInfo As FileInfo diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index 5616839..890c053 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -497,7 +497,7 @@ Public Class mgrMonitorList End Sub 'Filter Functions - Private Shared Function BuildFilterQuery(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of frmFilter.clsFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, + Private Shared Function BuildFilterQuery(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, ByVal sSortField As String, ByRef hshParams As Hashtable) As String Dim sSQL As String = String.Empty Dim iCounter As Integer = 0 @@ -540,7 +540,7 @@ Public Class mgrMonitorList sSQL = "SELECT " & sBaseSelect & " WHERE MonitorID NOT IN (SELECT MonitorID FROM gametags)" End Select - 'Handle String Filters + 'Handle Other Filters If oFilters.Count > 0 Then If eFilterType = frmFilter.eFilterType.BaseFilter Then sSQL &= " WHERE (" @@ -549,12 +549,22 @@ Public Class mgrMonitorList End If iCounter = 0 - For Each oFilter As frmFilter.clsFilter In oFilters - sSQL &= oFilter.Field & " LIKE @" & oFilter.ID - hshParams.Add(oFilter.ID, "%" & oFilter.Data & "%") + For Each oFilter As clsGameFilter In oFilters + Select Case oFilter.Field.Type + Case clsGameFilterField.eDataType.fString + sSQL &= oFilter.Field.FieldName & " LIKE @" & oFilter.ID + hshParams.Add(oFilter.ID, "%" & oFilter.Data & "%") + Case clsGameFilterField.eDataType.fNumeric + sSQL &= oFilter.Field.FieldName & " " & oFilter.NumericOperatorAsString & " @" & oFilter.ID + hshParams.Add(oFilter.ID, oFilter.Data) + Case clsGameFilterField.eDataType.fBool + sSQL &= oFilter.Field.FieldName & " = @" & oFilter.ID + hshParams.Add(oFilter.ID, oFilter.Data) + End Select + iCounter += 1 If iCounter <> oFilters.Count Then - If oFilter.AndOperator Then + If oFilter.NextBoolOperator Then sSQL &= " AND " Else sSQL &= " OR " @@ -567,12 +577,11 @@ Public Class mgrMonitorList 'Handle Sorting sSQL &= sSort - Return sSQL End Function - Public Shared Function ReadFilteredList(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of frmFilter.clsFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, + Public Shared Function ReadFilteredList(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As OrderedDictionary Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet @@ -597,7 +606,7 @@ Public Class mgrMonitorList 'Import / Export Functions - Public Shared Function ReadListForExport(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of frmFilter.clsFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, + Public Shared Function ReadListForExport(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As List(Of Game) Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet @@ -700,7 +709,7 @@ Public Class mgrMonitorList Dim oList As List(Of Game) Dim bSuccess As Boolean = False Dim oTagFilters As New List(Of clsTag) - Dim oFilters As New List(Of frmFilter.clsFilter) + Dim oFilters As New List(Of clsGameFilter) Dim eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter Dim bSortAsc As Boolean = True Dim sSortField As String = "Name" diff --git a/GBM/My Project/AssemblyInfo.vb b/GBM/My Project/AssemblyInfo.vb index f79cf5e..66ef53c 100644 --- a/GBM/My Project/AssemblyInfo.vb +++ b/GBM/My Project/AssemblyInfo.vb @@ -33,7 +33,7 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + \ No newline at end of file diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index f2cb9a3..7e01667 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -960,6 +960,24 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Disabled. + ''' + Friend ReadOnly Property frmFilter_cboBoolFilterDisabled() As String + Get + Return ResourceManager.GetString("frmFilter_cboBoolFilterDisabled", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Enabled. + ''' + Friend ReadOnly Property frmFilter_cboBoolFilterEnabled() As String + Get + Return ResourceManager.GetString("frmFilter_cboBoolFilterEnabled", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Game Information. ''' @@ -978,6 +996,24 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Backup Limit *. + ''' + Friend ReadOnly Property frmFilter_FieldBackupLimit() As String + Get + Return ResourceManager.GetString("frmFilter_FieldBackupLimit", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Delete Folder on Restore. + ''' + Friend ReadOnly Property frmFilter_FieldCleanFolder() As String + Get + Return ResourceManager.GetString("frmFilter_FieldCleanFolder", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Company. ''' @@ -987,6 +1023,42 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Monitor Game. + ''' + Friend ReadOnly Property frmFilter_FieldEnabled() As String + Get + Return ResourceManager.GetString("frmFilter_FieldEnabled", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Exclude Items. + ''' + Friend ReadOnly Property frmFilter_FieldExcludeList() As String + Get + Return ResourceManager.GetString("frmFilter_FieldExcludeList", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Include Items. + ''' + Friend ReadOnly Property frmFilter_FieldFileType() As String + Get + Return ResourceManager.GetString("frmFilter_FieldFileType", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Save Entire Folder. + ''' + Friend ReadOnly Property frmFilter_FieldFolderSave() As String + Get + Return ResourceManager.GetString("frmFilter_FieldFolderSave", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Hours. ''' @@ -996,6 +1068,24 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Icon. + ''' + Friend ReadOnly Property frmFilter_FieldIcon() As String + Get + Return ResourceManager.GetString("frmFilter_FieldIcon", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Monitor Only. + ''' + Friend ReadOnly Property frmFilter_FieldMonitorOnly() As String + Get + Return ResourceManager.GetString("frmFilter_FieldMonitorOnly", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Name. ''' @@ -1014,6 +1104,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Save Path *. + ''' + Friend ReadOnly Property frmFilter_FieldPath() As String + Get + Return ResourceManager.GetString("frmFilter_FieldPath", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Process. ''' @@ -1023,6 +1122,24 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Game Path. + ''' + Friend ReadOnly Property frmFilter_FieldProcessPath() As String + Get + Return ResourceManager.GetString("frmFilter_FieldProcessPath", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to Save Multiple Backups. + ''' + Friend ReadOnly Property frmFilter_FieldTimeStamp() As String + Get + Return ResourceManager.GetString("frmFilter_FieldTimeStamp", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Version. ''' @@ -1042,11 +1159,11 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to Options. + ''' Looks up a localized string similar to Next Filter. ''' - Friend ReadOnly Property frmFilter_grpGameInfoOptions() As String + Friend ReadOnly Property frmFilter_grpNextFilterOperator() As String Get - Return ResourceManager.GetString("frmFilter_grpGameInfoOptions", resourceCulture) + Return ResourceManager.GetString("frmFilter_grpNextFilterOperator", resourceCulture) End Get End Property @@ -1059,6 +1176,15 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to Sort Options. + ''' + Friend ReadOnly Property frmFilter_grpSortOptions() As String + Get + Return ResourceManager.GetString("frmFilter_grpSortOptions", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to Options. ''' @@ -1105,11 +1231,11 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to Order By:. + ''' Looks up a localized string similar to Available Fields. ''' - Friend ReadOnly Property frmFilter_lblOrderBy() As String + Friend ReadOnly Property frmFilter_lblSortsFields() As String Get - Return ResourceManager.GetString("frmFilter_lblOrderBy", resourceCulture) + Return ResourceManager.GetString("frmFilter_lblSortsFields", resourceCulture) End Get End Property @@ -1122,6 +1248,24 @@ Namespace My.Resources End Get End Property + ''' + ''' Looks up a localized string similar to * Indicates a field that may give unexpected results.. + ''' + Friend ReadOnly Property frmFilter_lblWarning() As String + Get + Return ResourceManager.GetString("frmFilter_lblWarning", resourceCulture) + End Get + End Property + + ''' + ''' Looks up a localized string similar to contains. + ''' + Friend ReadOnly Property frmFilter_lstFilterContains() As String + Get + Return ResourceManager.GetString("frmFilter_lstFilterContains", resourceCulture) + End Get + End Property + ''' ''' Looks up a localized string similar to All Tags. ''' diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index 67376ae..1f1b3dc 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -1006,8 +1006,8 @@ Saved Game Explorer - - Options + + Next Filter Options @@ -1795,9 +1795,6 @@ Sorting - - Order By: - Ascending @@ -1837,4 +1834,55 @@ Filter + + Disabled + + + Enabled + + + Backup Limit * + + + Delete Folder on Restore + + + Monitor Game + + + Exclude Items + + + Include Items + + + Save Entire Folder + + + Icon + + + Monitor Only + + + Save Path * + + + Game Path + + + Save Multiple Backups + + + Available Fields + + + * Indicates a field that may give unexpected results. + + + contains + + + Sort Options + \ No newline at end of file From 94086d0c05af70858a78b2f29597730b077f5319 Mon Sep 17 00:00:00 2001 From: "Michael J. Seiferling" Date: Sat, 5 Aug 2017 14:00:52 -0600 Subject: [PATCH 05/14] Operator feature change and minor bug fixes --- GBM/Classes/clsGameFilter.vb | 10 ------ GBM/Forms/frmFilter.Designer.vb | 28 ++++++++-------- GBM/Forms/frmFilter.vb | 49 +++++++++++++++------------- GBM/Forms/frmGameManager.vb | 6 +++- GBM/Managers/mgrMonitorList.vb | 22 +++++++------ GBM/My Project/Resources.Designer.vb | 6 ++-- GBM/My Project/Resources.resx | 4 +-- 7 files changed, 63 insertions(+), 62 deletions(-) diff --git a/GBM/Classes/clsGameFilter.vb b/GBM/Classes/clsGameFilter.vb index e6c2f24..b1395d3 100644 --- a/GBM/Classes/clsGameFilter.vb +++ b/GBM/Classes/clsGameFilter.vb @@ -4,7 +4,6 @@ Private oField As clsGameFilterField Private oData As Object Private eNumericOperator As eNumericOperators = eNumericOperators.Equals - Private bNextBoolOperator As Boolean Public Enum eNumericOperators Equals = 1 @@ -41,15 +40,6 @@ End Set End Property - Public Property NextBoolOperator As Boolean - Get - Return bNextBoolOperator - End Get - Set(value As Boolean) - bNextBoolOperator = value - End Set - End Property - Public Property NumericOperator As eNumericOperators Get Return eNumericOperator diff --git a/GBM/Forms/frmFilter.Designer.vb b/GBM/Forms/frmFilter.Designer.vb index 7de0d3f..b2a9ae4 100644 --- a/GBM/Forms/frmFilter.Designer.vb +++ b/GBM/Forms/frmFilter.Designer.vb @@ -44,7 +44,7 @@ Partial Class frmFilter Me.lstFilter = New System.Windows.Forms.ListBox() Me.btnAddFilter = New System.Windows.Forms.Button() Me.cboFilterField = New System.Windows.Forms.ComboBox() - Me.grpNextFilterOperator = New System.Windows.Forms.GroupBox() + Me.grpFilterType = New System.Windows.Forms.GroupBox() Me.optOr = New System.Windows.Forms.RadioButton() Me.optAnd = New System.Windows.Forms.RadioButton() Me.txtStringFilter = New System.Windows.Forms.TextBox() @@ -61,7 +61,7 @@ Partial Class frmFilter Me.grpTagOptions.SuspendLayout() Me.grpGameFilter.SuspendLayout() CType(Me.numFilter, System.ComponentModel.ISupportInitialize).BeginInit() - Me.grpNextFilterOperator.SuspendLayout() + Me.grpFilterType.SuspendLayout() Me.grpSorting.SuspendLayout() Me.grpSortOptions.SuspendLayout() Me.SuspendLayout() @@ -190,7 +190,7 @@ Partial Class frmFilter Me.grpGameFilter.Controls.Add(Me.lstFilter) Me.grpGameFilter.Controls.Add(Me.btnAddFilter) Me.grpGameFilter.Controls.Add(Me.cboFilterField) - Me.grpGameFilter.Controls.Add(Me.grpNextFilterOperator) + Me.grpGameFilter.Controls.Add(Me.grpFilterType) Me.grpGameFilter.Controls.Add(Me.txtStringFilter) Me.grpGameFilter.Location = New System.Drawing.Point(12, 35) Me.grpGameFilter.Name = "grpGameFilter" @@ -287,16 +287,16 @@ Partial Class frmFilter Me.cboFilterField.Size = New System.Drawing.Size(150, 21) Me.cboFilterField.TabIndex = 1 ' - 'grpNextFilterOperator + 'grpFilterType ' - Me.grpNextFilterOperator.Controls.Add(Me.optOr) - Me.grpNextFilterOperator.Controls.Add(Me.optAnd) - Me.grpNextFilterOperator.Location = New System.Drawing.Point(259, 81) - Me.grpNextFilterOperator.Name = "grpNextFilterOperator" - Me.grpNextFilterOperator.Size = New System.Drawing.Size(106, 46) - Me.grpNextFilterOperator.TabIndex = 8 - Me.grpNextFilterOperator.TabStop = False - Me.grpNextFilterOperator.Text = "Next Filter" + Me.grpFilterType.Controls.Add(Me.optOr) + Me.grpFilterType.Controls.Add(Me.optAnd) + Me.grpFilterType.Location = New System.Drawing.Point(259, 81) + Me.grpFilterType.Name = "grpFilterType" + Me.grpFilterType.Size = New System.Drawing.Size(106, 46) + Me.grpFilterType.TabIndex = 8 + Me.grpFilterType.TabStop = False + Me.grpFilterType.Text = "Filter Type" ' 'optOr ' @@ -443,7 +443,7 @@ Partial Class frmFilter Me.grpGameFilter.ResumeLayout(False) Me.grpGameFilter.PerformLayout() CType(Me.numFilter, System.ComponentModel.ISupportInitialize).EndInit() - Me.grpNextFilterOperator.ResumeLayout(False) + Me.grpFilterType.ResumeLayout(False) Me.grpSorting.ResumeLayout(False) Me.grpSorting.PerformLayout() Me.grpSortOptions.ResumeLayout(False) @@ -465,7 +465,7 @@ Partial Class frmFilter Friend WithEvents btnOK As System.Windows.Forms.Button Friend WithEvents grpGameFilter As System.Windows.Forms.GroupBox Friend WithEvents txtStringFilter As System.Windows.Forms.TextBox - Friend WithEvents grpNextFilterOperator As System.Windows.Forms.GroupBox + Friend WithEvents grpFilterType As System.Windows.Forms.GroupBox Friend WithEvents optOr As System.Windows.Forms.RadioButton Friend WithEvents optAnd As System.Windows.Forms.RadioButton Friend WithEvents grpSorting As GroupBox diff --git a/GBM/Forms/frmFilter.vb b/GBM/Forms/frmFilter.vb index d2bd274..938de88 100644 --- a/GBM/Forms/frmFilter.vb +++ b/GBM/Forms/frmFilter.vb @@ -13,6 +13,7 @@ Public Class frmFilter Dim oGameFilters As New List(Of clsGameFilter) Dim oValidFields As New List(Of clsGameFilterField) Dim eCurrentFilterType As eFilterType = eFilterType.BaseFilter + Dim bAndOperator As Boolean = True Dim bSortAsc As Boolean = True Dim sSortField As String = "Name" Dim hshTags As New Hashtable @@ -46,6 +47,15 @@ Public Class frmFilter End Set End Property + Public Property AndOperator As Boolean + Get + Return bAndOperator + End Get + Set(value As Boolean) + bAndOperator = value + End Set + End Property + Public Property SortAsc As Boolean Get Return bSortAsc @@ -287,25 +297,24 @@ Public Class frmFilter Dim oListTag As KeyValuePair(Of String, String) 'Game Filters + If bAndOperator Then + optAnd.Checked = True + Else + optOr.Checked = True + End If + If oGameFilters.Count > 0 Then chkGameInfo.Checked = True For Each oFilter As clsGameFilter In oGameFilters Select Case oFilter.Field.Type Case clsGameFilterField.eDataType.fString - sFilter = oFilter.Field.FriendlyFieldName & " " & frmFilter_lstFilterContains & " """ & oFilter.Data & """ / " + sFilter = oFilter.Field.FriendlyFieldName & " " & frmFilter_lstFilterContains & " """ & oFilter.Data & """" Case clsGameFilterField.eDataType.fNumeric - oFilter.NumericOperator = DirectCast(cboNumericOps.SelectedValue, clsGameFilter.eNumericOperators) - sFilter = oFilter.Field.FriendlyFieldName & " " & oFilter.NumericOperatorAsString & " " & oFilter.Data & " / " + sFilter = oFilter.Field.FriendlyFieldName & " " & oFilter.NumericOperatorAsString & " " & oFilter.Data Case clsGameFilterField.eDataType.fBool - sFilter = oFilter.Field.FriendlyFieldName & " = " & oFilter.Data & " / " + sFilter = oFilter.Field.FriendlyFieldName & " = " & oFilter.Data End Select - If oFilter.NextBoolOperator Then - sFilter &= frmFilter_optAnd - Else - sFilter &= frmFilter_optOr - End If - iParameterIndex += 1 lstFilter.Items.Add(New KeyValuePair(Of clsGameFilter, String)(oFilter, sFilter)) @@ -374,27 +383,20 @@ Public Class frmFilter 'Build Filter oFilter.ID = "PARAM" & iParameterIndex oFilter.Field = cboFilterField.SelectedValue - oFilter.NextBoolOperator = optAnd.Checked Select Case oFilter.Field.Type Case clsGameFilterField.eDataType.fString oFilter.Data = txtStringFilter.Text - sFilter = oFilter.Field.FriendlyFieldName & " " & frmFilter_lstFilterContains & " """ & oFilter.Data & """ / " + sFilter = oFilter.Field.FriendlyFieldName & " " & frmFilter_lstFilterContains & " """ & oFilter.Data & """" Case clsGameFilterField.eDataType.fNumeric oFilter.Data = numFilter.Value oFilter.NumericOperator = DirectCast(cboNumericOps.SelectedValue, clsGameFilter.eNumericOperators) - sFilter = oFilter.Field.FriendlyFieldName & " " & oFilter.NumericOperatorAsString & " " & oFilter.Data & " / " + sFilter = oFilter.Field.FriendlyFieldName & " " & oFilter.NumericOperatorAsString & " " & oFilter.Data Case clsGameFilterField.eDataType.fBool oFilter.Data = cboBoolFilter.SelectedValue - sFilter = oFilter.Field.FriendlyFieldName & " = " & oFilter.Data & " / " + sFilter = oFilter.Field.FriendlyFieldName & " = " & oFilter.Data End Select - If oFilter.NextBoolOperator Then - sFilter &= frmFilter_optAnd - Else - sFilter &= frmFilter_optOr - End If - oGameFilters.Add(oFilter) lstFilter.Items.Add(New KeyValuePair(Of clsGameFilter, String)(oFilter, sFilter)) @@ -418,8 +420,9 @@ Public Class frmFilter If chkGameInfo.Checked Then - 'Set Filter Type + 'Set Filter Type(s) eCurrentFilterType = eFilterType.BaseFilter + bAndOperator = optAnd.Checked End If If chkTag.Checked Then @@ -515,7 +518,7 @@ Public Class frmFilter 'Set Form Text optOr.Text = frmFilter_optOr optAnd.Text = frmFilter_optAnd - grpNextFilterOperator.Text = frmFilter_grpNextFilterOperator + grpFilterType.Text = frmFilter_grpFilterType optAll.Text = frmFilter_optAll optAny.Text = frmFilter_optAny lblGameTags.Text = frmFilter_lblGameTags @@ -538,6 +541,7 @@ Public Class frmFilter grpSortOptions.Text = frmFilter_grpSortOptions 'Defaults + optAnd.Checked = True optSortAsc.Checked = True grpGameFilter.Enabled = False grpTagFilter.Enabled = False @@ -579,6 +583,7 @@ Public Class frmFilter If chkGameInfo.Checked Then grpGameFilter.Enabled = True Else + optAnd.Checked = True grpGameFilter.Enabled = False oGameFilters.Clear() lstFilter.Items.Clear() diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index ae4d61a..ba39c2f 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -22,6 +22,7 @@ Public Class frmGameManager Private oCurrentTagFilters As New List(Of clsTag) Private oCurrentFilters As New List(Of clsGameFilter) Private eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter + Private bCurrentAndOperator As Boolean = True Private bCurrentSortAsc As Boolean = True Private sCurrentSortField As String = "Name" Private WithEvents tmFilterTimer As Timer @@ -225,9 +226,11 @@ Public Class frmGameManager If optCustom.Checked Then If Not bRetainFilter Then frm = New frmFilter + frm.TagFilters = oCurrentTagFilters frm.GameFilters = oCurrentFilters frm.FilterType = eCurrentFilter + frm.AndOperator = bCurrentAndOperator frm.SortAsc = bCurrentSortAsc frm.SortField = sCurrentSortField @@ -236,6 +239,7 @@ Public Class frmGameManager oCurrentTagFilters = frm.TagFilters oCurrentFilters = frm.GameFilters eCurrentFilter = frm.FilterType + bCurrentAndOperator = frm.AndOperator bCurrentSortAsc = frm.SortAsc sCurrentSortField = frm.SortField End If @@ -247,7 +251,7 @@ Public Class frmGameManager sCurrentSortField = "Name" End If - GameData = mgrMonitorList.ReadFilteredList(oCurrentTagFilters, oCurrentFilters, eCurrentFilter, bCurrentSortAsc, sCurrentSortField) + GameData = mgrMonitorList.ReadFilteredList(oCurrentTagFilters, oCurrentFilters, eCurrentFilter, bCurrentAndOperator, bCurrentSortAsc, sCurrentSortField) If optPendingRestores.Checked Then oRestoreData = mgrRestore.CompareManifests diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index 890c053..e5eacee 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -497,8 +497,8 @@ Public Class mgrMonitorList End Sub 'Filter Functions - Private Shared Function BuildFilterQuery(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, - ByVal sSortField As String, ByRef hshParams As Hashtable) As String + Private Shared Function BuildFilterQuery(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bAndOperator As Boolean, + ByVal bSortAsc As Boolean, ByVal sSortField As String, ByRef hshParams As Hashtable) As String Dim sSQL As String = String.Empty Dim iCounter As Integer = 0 Dim sBaseSelect As String = "MonitorID, Name, Process, Path, AbsolutePath, FolderSave, FileType, TimeStamp, ExcludeList, ProcessPath, Icon, Hours, Version, Company, Enabled, MonitorOnly, BackupLimit, CleanFolder, Parameter FROM monitorlist" @@ -564,7 +564,7 @@ Public Class mgrMonitorList iCounter += 1 If iCounter <> oFilters.Count Then - If oFilter.NextBoolOperator Then + If bAndOperator Then sSQL &= " AND " Else sSQL &= " OR " @@ -581,8 +581,8 @@ Public Class mgrMonitorList End Function - Public Shared Function ReadFilteredList(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, - ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As OrderedDictionary + Public Shared Function ReadFilteredList(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bAndOperator As Boolean, + ByVal bSortAsc As Boolean, ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As OrderedDictionary Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet Dim sSQL As String = String.Empty @@ -591,7 +591,7 @@ Public Class mgrMonitorList Dim hshParams As New Hashtable Dim iCounter As Integer = 0 - sSQL = BuildFilterQuery(oTagFilters, oFilters, eFilterType, bSortAsc, sSortField, hshParams) + sSQL = BuildFilterQuery(oTagFilters, oFilters, eFilterType, bAndOperator, bSortAsc, sSortField, hshParams) oData = oDatabase.ReadParamData(sSQL, hshParams) @@ -606,8 +606,8 @@ Public Class mgrMonitorList 'Import / Export Functions - Public Shared Function ReadListForExport(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bSortAsc As Boolean, - ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As List(Of Game) + Public Shared Function ReadListForExport(ByVal oTagFilters As List(Of clsTag), ByVal oFilters As List(Of clsGameFilter), ByVal eFilterType As frmFilter.eFilterType, ByVal bAndOperator As Boolean, + ByVal bSortAsc As Boolean, ByVal sSortField As String, Optional ByVal iSelectDB As mgrSQLite.Database = mgrSQLite.Database.Local) As List(Of Game) Dim oDatabase As New mgrSQLite(iSelectDB) Dim oData As DataSet Dim sSQL As String = String.Empty @@ -616,7 +616,7 @@ Public Class mgrMonitorList Dim oGame As Game Dim hshParams As New Hashtable - sSQL = BuildFilterQuery(oTagFilters, oFilters, eFilterType, bSortAsc, sSortField, hshParams) + sSQL = BuildFilterQuery(oTagFilters, oFilters, eFilterType, bAndOperator, bSortAsc, sSortField, hshParams) oData = oDatabase.ReadParamData(sSQL, hshParams) @@ -711,6 +711,7 @@ Public Class mgrMonitorList Dim oTagFilters As New List(Of clsTag) Dim oFilters As New List(Of clsGameFilter) Dim eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter + Dim bAndOperator As Boolean = True Dim bSortAsc As Boolean = True Dim sSortField As String = "Name" @@ -720,11 +721,12 @@ Public Class mgrMonitorList oTagFilters = frm.TagFilters oFilters = frm.GameFilters eCurrentFilter = frm.FilterType + bAndOperator = frm.AndOperator bSortAsc = frm.SortAsc sSortField = frm.SortField End If - oList = ReadListForExport(oTagFilters, oFilters, eCurrentFilter, bSortAsc, sSortField) + oList = ReadListForExport(oTagFilters, oFilters, eCurrentFilter, bAndOperator, bSortAsc, sSortField) bSuccess = mgrXML.SerializeAndExport(oList, sLocation) diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index 7e01667..2e9ef39 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -1159,11 +1159,11 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to Next Filter. + ''' Looks up a localized string similar to Filter Type. ''' - Friend ReadOnly Property frmFilter_grpNextFilterOperator() As String + Friend ReadOnly Property frmFilter_grpFilterType() As String Get - Return ResourceManager.GetString("frmFilter_grpNextFilterOperator", resourceCulture) + Return ResourceManager.GetString("frmFilter_grpFilterType", resourceCulture) End Get End Property diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index 1f1b3dc..11162f3 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -1006,8 +1006,8 @@ Saved Game Explorer - - Next Filter + + Filter Type Options From 2ef141ee9b8a8ccc3bb8a8f182231bfb6996d7be Mon Sep 17 00:00:00 2001 From: "Michael J. Seiferling" Date: Sun, 6 Aug 2017 19:18:38 -0600 Subject: [PATCH 06/14] Fixed possible filter crash --- GBM/Forms/frmFilter.vb | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/GBM/Forms/frmFilter.vb b/GBM/Forms/frmFilter.vb index 938de88..0a06276 100644 --- a/GBM/Forms/frmFilter.vb +++ b/GBM/Forms/frmFilter.vb @@ -18,7 +18,6 @@ Public Class frmFilter Dim sSortField As String = "Name" Dim hshTags As New Hashtable Dim bShutdown As Boolean = False - Dim iParameterIndex As Integer = 0 Public Property GameFilters As List(Of clsGameFilter) Get @@ -315,8 +314,6 @@ Public Class frmFilter sFilter = oFilter.Field.FriendlyFieldName & " = " & oFilter.Data End Select - iParameterIndex += 1 - lstFilter.Items.Add(New KeyValuePair(Of clsGameFilter, String)(oFilter, sFilter)) Next End If @@ -381,7 +378,7 @@ Public Class frmFilter Dim sFilter As String = String.Empty 'Build Filter - oFilter.ID = "PARAM" & iParameterIndex + oFilter.ID = Guid.NewGuid.ToString.Split("-")(0) oFilter.Field = cboFilterField.SelectedValue Select Case oFilter.Field.Type @@ -400,7 +397,6 @@ Public Class frmFilter oGameFilters.Add(oFilter) lstFilter.Items.Add(New KeyValuePair(Of clsGameFilter, String)(oFilter, sFilter)) - iParameterIndex += 1 End Sub Private Sub RemoveFilter() From e3bfc6adb192793a8c5be46b9cd366a0d658ca77 Mon Sep 17 00:00:00 2001 From: MikeMaximus Date: Thu, 10 Aug 2017 22:02:31 -0600 Subject: [PATCH 07/14] Changes for issue #89 --- GBM/Classes/XML Serialize Classes/Game.vb | 10 ++++++++ GBM/Forms/frmGameManager.vb | 28 +++++++++++++++++++++-- GBM/Managers/mgrCommon.vb | 4 +++- GBM/Managers/mgrMonitorList.vb | 1 + GBM/Managers/mgrXML.vb | 1 + 5 files changed, 41 insertions(+), 3 deletions(-) diff --git a/GBM/Classes/XML Serialize Classes/Game.vb b/GBM/Classes/XML Serialize Classes/Game.vb index 9ecadc8..1bc63d4 100644 --- a/GBM/Classes/XML Serialize Classes/Game.vb +++ b/GBM/Classes/XML Serialize Classes/Game.vb @@ -7,6 +7,7 @@ Private bFolderSave As Boolean Private sFileType As String Private sExcludeList As String + Private bMonitorOnly As Boolean Private oTags As List(Of Tag) Property Name As String @@ -81,6 +82,15 @@ End Get End Property + Property MonitorOnly As Boolean + Set(value As Boolean) + bMonitorOnly = value + End Set + Get + Return bMonitorOnly + End Get + End Property + Property Tags As List(Of Tag) Get Return oTags diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index ba39c2f..55fb5bf 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -866,6 +866,26 @@ Public Class frmGameManager Next End Sub + Private Sub MonitorOnlyModeHandler() + If chkMonitorOnly.Checked Then + chkFolderSave.Enabled = False + chkCleanFolder.Enabled = False + chkTimeStamp.Enabled = False + lblSavePath.Enabled = False + txtSavePath.Enabled = False + btnInclude.Enabled = False + btnExclude.Enabled = False + Else + chkFolderSave.Enabled = True + chkCleanFolder.Enabled = True + chkTimeStamp.Enabled = True + lblSavePath.Enabled = True + txtSavePath.Enabled = True + btnInclude.Enabled = True + btnExclude.Enabled = True + End If + End Sub + Private Sub ModeChange() IsLoading = True @@ -1263,7 +1283,7 @@ Public Class frmGameManager Return False End If - If chkFolderSave.Checked = False And txtFileType.Text = String.Empty Then + If (chkFolderSave.Checked = False And txtFileType.Text = String.Empty) And Not chkMonitorOnly.Checked Then mgrCommon.ShowMessage(frmGameManager_ErrorNoItems, MsgBoxStyle.Exclamation) btnInclude.Focus() Return False @@ -1351,7 +1371,7 @@ Public Class frmGameManager For Each oData In lstGames.SelectedItems oGame = DirectCast(GameData(oData.Key), clsGame) - BackupList.Add(oGame) + If Not oGame.MonitorOnly Then BackupList.Add(oGame) Next If BackupList.Count = 1 Then @@ -1729,4 +1749,8 @@ Public Class frmGameManager Private Sub frmGameManager_Shown(sender As Object, e As EventArgs) Handles MyBase.Shown txtQuickFilter.Focus() End Sub + + Private Sub chkMonitorOnly_CheckedChanged(sender As Object, e As EventArgs) Handles chkMonitorOnly.CheckedChanged + MonitorOnlyModeHandler() + End Sub End Class diff --git a/GBM/Managers/mgrCommon.vb b/GBM/Managers/mgrCommon.vb index 5b19883..839f170 100644 --- a/GBM/Managers/mgrCommon.vb +++ b/GBM/Managers/mgrCommon.vb @@ -269,13 +269,15 @@ Public Class mgrCommon End Function 'Calculate the current size of a folder - Public Shared Function GetFolderSize(ByVal sPath As String, ByVal sInclude As String(), ByVal sExclude As String()) + Public Shared Function GetFolderSize(ByVal sPath As String, ByVal sInclude As String(), ByVal sExclude As String()) As Long Dim oFolder As DirectoryInfo Dim bInclude As Boolean Dim bExclude As Boolean Dim lSize As Long = 0 Try + If Not Directory.Exists(sPath) Then Return lSize + oFolder = New DirectoryInfo(sPath) 'Files diff --git a/GBM/Managers/mgrMonitorList.vb b/GBM/Managers/mgrMonitorList.vb index e5eacee..5aa9d1d 100644 --- a/GBM/Managers/mgrMonitorList.vb +++ b/GBM/Managers/mgrMonitorList.vb @@ -630,6 +630,7 @@ Public Class mgrMonitorList oGame.FolderSave = CBool(dr("FolderSave")) If Not IsDBNull(dr("FileType")) Then oGame.FileType = CStr(dr("FileType")) If Not IsDBNull(dr("ExcludeList")) Then oGame.ExcludeList = CStr(dr("ExcludeList")) + oGame.MonitorOnly = CBool(dr("MonitorOnly")) If Not IsDBNull(dr("Parameter")) Then oGame.Parameter = CStr(dr("Parameter")) oGame.Tags = mgrGameTags.GetTagsByGameForExport(sID) oList.Add(oGame) diff --git a/GBM/Managers/mgrXML.vb b/GBM/Managers/mgrXML.vb index a25c35d..b432246 100644 --- a/GBM/Managers/mgrXML.vb +++ b/GBM/Managers/mgrXML.vb @@ -28,6 +28,7 @@ Public Class mgrXML oGame.FolderSave = g.FolderSave oGame.FileType = g.FileType oGame.ExcludeList = g.ExcludeList + oGame.MonitorOnly = g.MonitorOnly oGame.Parameter = g.Parameter For Each t As Tag In g.Tags oGame.ImportTags.Add(t) From a4fff6b9006f1cb223f8378411b4a4c1edb6e04d Mon Sep 17 00:00:00 2001 From: MikeMaximus Date: Thu, 10 Aug 2017 22:13:27 -0600 Subject: [PATCH 08/14] Fixed missing control for issue #89 --- GBM/Forms/frmGameManager.vb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 55fb5bf..6bbf880 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -873,6 +873,7 @@ Public Class frmGameManager chkTimeStamp.Enabled = False lblSavePath.Enabled = False txtSavePath.Enabled = False + btnSavePathBrowse.Enabled = False btnInclude.Enabled = False btnExclude.Enabled = False Else @@ -881,6 +882,7 @@ Public Class frmGameManager chkTimeStamp.Enabled = True lblSavePath.Enabled = True txtSavePath.Enabled = True + btnSavePathBrowse.Enabled = True btnInclude.Enabled = True btnExclude.Enabled = True End If From 0003ee1f11a78d6ecf0c7c15f1df8eac4251542b Mon Sep 17 00:00:00 2001 From: MikeMaximus Date: Thu, 10 Aug 2017 22:18:15 -0600 Subject: [PATCH 09/14] Disabled Monitor only restore for issue #89 --- GBM/Forms/frmGameManager.vb | 48 ++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 6bbf880..98f81af 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -866,28 +866,6 @@ Public Class frmGameManager Next End Sub - Private Sub MonitorOnlyModeHandler() - If chkMonitorOnly.Checked Then - chkFolderSave.Enabled = False - chkCleanFolder.Enabled = False - chkTimeStamp.Enabled = False - lblSavePath.Enabled = False - txtSavePath.Enabled = False - btnSavePathBrowse.Enabled = False - btnInclude.Enabled = False - btnExclude.Enabled = False - Else - chkFolderSave.Enabled = True - chkCleanFolder.Enabled = True - chkTimeStamp.Enabled = True - lblSavePath.Enabled = True - txtSavePath.Enabled = True - btnSavePathBrowse.Enabled = True - btnInclude.Enabled = True - btnExclude.Enabled = True - End If - End Sub - Private Sub ModeChange() IsLoading = True @@ -1066,6 +1044,28 @@ Public Class frmGameManager VerifyCleanFolder() End Sub + Private Sub MonitorOnlyModeChange() + If chkMonitorOnly.Checked Then + chkFolderSave.Enabled = False + chkCleanFolder.Enabled = False + chkTimeStamp.Enabled = False + lblSavePath.Enabled = False + txtSavePath.Enabled = False + btnSavePathBrowse.Enabled = False + btnInclude.Enabled = False + btnExclude.Enabled = False + Else + chkFolderSave.Enabled = True + chkCleanFolder.Enabled = True + chkTimeStamp.Enabled = True + lblSavePath.Enabled = True + txtSavePath.Enabled = True + btnSavePathBrowse.Enabled = True + btnInclude.Enabled = True + btnExclude.Enabled = True + End If + End Sub + Private Sub TimeStampModeChange() If chkTimeStamp.Checked Then nudLimit.Visible = True @@ -1417,7 +1417,7 @@ Public Class frmGameManager If oRemoteBackupData.Contains(oData.Value) Then oGame = DirectCast(GameData(oData.Key), clsGame) oBackup = DirectCast(oRemoteBackupData(oData.Value), clsBackup) - RestoreList.Add(oGame, oBackup) + If Not oGame.MonitorOnly Then RestoreList.Add(oGame, oBackup) End If Next End If @@ -1753,6 +1753,6 @@ Public Class frmGameManager End Sub Private Sub chkMonitorOnly_CheckedChanged(sender As Object, e As EventArgs) Handles chkMonitorOnly.CheckedChanged - MonitorOnlyModeHandler() + MonitorOnlyModeChange() End Sub End Class From f0bd3db4ad26e0d1df1d0e3fa478ebe47dce0290 Mon Sep 17 00:00:00 2001 From: MikeMaximus Date: Thu, 10 Aug 2017 22:22:20 -0600 Subject: [PATCH 10/14] Revert "Disabled Monitor only restore for issue #89" This reverts commit 0003ee1f11a78d6ecf0c7c15f1df8eac4251542b. --- GBM/Forms/frmGameManager.vb | 48 ++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 98f81af..6bbf880 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -866,6 +866,28 @@ Public Class frmGameManager Next End Sub + Private Sub MonitorOnlyModeHandler() + If chkMonitorOnly.Checked Then + chkFolderSave.Enabled = False + chkCleanFolder.Enabled = False + chkTimeStamp.Enabled = False + lblSavePath.Enabled = False + txtSavePath.Enabled = False + btnSavePathBrowse.Enabled = False + btnInclude.Enabled = False + btnExclude.Enabled = False + Else + chkFolderSave.Enabled = True + chkCleanFolder.Enabled = True + chkTimeStamp.Enabled = True + lblSavePath.Enabled = True + txtSavePath.Enabled = True + btnSavePathBrowse.Enabled = True + btnInclude.Enabled = True + btnExclude.Enabled = True + End If + End Sub + Private Sub ModeChange() IsLoading = True @@ -1044,28 +1066,6 @@ Public Class frmGameManager VerifyCleanFolder() End Sub - Private Sub MonitorOnlyModeChange() - If chkMonitorOnly.Checked Then - chkFolderSave.Enabled = False - chkCleanFolder.Enabled = False - chkTimeStamp.Enabled = False - lblSavePath.Enabled = False - txtSavePath.Enabled = False - btnSavePathBrowse.Enabled = False - btnInclude.Enabled = False - btnExclude.Enabled = False - Else - chkFolderSave.Enabled = True - chkCleanFolder.Enabled = True - chkTimeStamp.Enabled = True - lblSavePath.Enabled = True - txtSavePath.Enabled = True - btnSavePathBrowse.Enabled = True - btnInclude.Enabled = True - btnExclude.Enabled = True - End If - End Sub - Private Sub TimeStampModeChange() If chkTimeStamp.Checked Then nudLimit.Visible = True @@ -1417,7 +1417,7 @@ Public Class frmGameManager If oRemoteBackupData.Contains(oData.Value) Then oGame = DirectCast(GameData(oData.Key), clsGame) oBackup = DirectCast(oRemoteBackupData(oData.Value), clsBackup) - If Not oGame.MonitorOnly Then RestoreList.Add(oGame, oBackup) + RestoreList.Add(oGame, oBackup) End If Next End If @@ -1753,6 +1753,6 @@ Public Class frmGameManager End Sub Private Sub chkMonitorOnly_CheckedChanged(sender As Object, e As EventArgs) Handles chkMonitorOnly.CheckedChanged - MonitorOnlyModeChange() + MonitorOnlyModeHandler() End Sub End Class From 34a91597197ce08af56e127ede08f0e4d896b68f Mon Sep 17 00:00:00 2001 From: MikeMaximus Date: Thu, 10 Aug 2017 22:38:14 -0600 Subject: [PATCH 11/14] Fixed various problems caused by issue #89 --- GBM/Forms/frmGameManager.vb | 65 +++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 35 deletions(-) diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 6bbf880..04c1629 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -866,28 +866,6 @@ Public Class frmGameManager Next End Sub - Private Sub MonitorOnlyModeHandler() - If chkMonitorOnly.Checked Then - chkFolderSave.Enabled = False - chkCleanFolder.Enabled = False - chkTimeStamp.Enabled = False - lblSavePath.Enabled = False - txtSavePath.Enabled = False - btnSavePathBrowse.Enabled = False - btnInclude.Enabled = False - btnExclude.Enabled = False - Else - chkFolderSave.Enabled = True - chkCleanFolder.Enabled = True - chkTimeStamp.Enabled = True - lblSavePath.Enabled = True - txtSavePath.Enabled = True - btnSavePathBrowse.Enabled = True - btnInclude.Enabled = True - btnExclude.Enabled = True - End If - End Sub - Private Sub ModeChange() IsLoading = True @@ -1066,6 +1044,26 @@ Public Class frmGameManager VerifyCleanFolder() End Sub + Private Sub MonitorOnlyModeChange() + If chkMonitorOnly.Checked Then + chkFolderSave.Enabled = False + chkTimeStamp.Enabled = False + lblSavePath.Enabled = False + txtSavePath.Enabled = False + btnSavePathBrowse.Enabled = False + btnInclude.Enabled = False + btnExclude.Enabled = False + Else + chkFolderSave.Enabled = True + chkTimeStamp.Enabled = True + lblSavePath.Enabled = True + txtSavePath.Enabled = True + btnSavePathBrowse.Enabled = True + btnInclude.Enabled = True + btnExclude.Enabled = True + End If + End Sub + Private Sub TimeStampModeChange() If chkTimeStamp.Checked Then nudLimit.Visible = True @@ -1080,7 +1078,7 @@ Public Class frmGameManager Private Sub VerifyCleanFolder() If Not bIsLoading Then - If chkFolderSave.Checked = True And txtExclude.Text = String.Empty And txtSavePath.Text <> String.Empty Then + If chkFolderSave.Checked = True And txtExclude.Text = String.Empty And txtSavePath.Text <> String.Empty And Not chkMonitorOnly.Checked Then chkCleanFolder.Enabled = True Else chkCleanFolder.Checked = False @@ -1410,17 +1408,14 @@ Public Class frmGameManager If lstGames.SelectedItems.Count > 0 Then RestoreList.Clear() - If lstGames.SelectedItems.Count = 1 Then - RestoreList.Add(CurrentGame, CurrentBackupItem) - Else - For Each oData In lstGames.SelectedItems - If oRemoteBackupData.Contains(oData.Value) Then - oGame = DirectCast(GameData(oData.Key), clsGame) - oBackup = DirectCast(oRemoteBackupData(oData.Value), clsBackup) - RestoreList.Add(oGame, oBackup) - End If - Next - End If + + For Each oData In lstGames.SelectedItems + If oRemoteBackupData.Contains(oData.Value) Then + oGame = DirectCast(GameData(oData.Key), clsGame) + oBackup = DirectCast(oRemoteBackupData(oData.Value), clsBackup) + If Not oGame.MonitorOnly Then RestoreList.Add(oGame, oBackup) + End If + Next If RestoreList.Count = 1 Then bDoRestore = True @@ -1753,6 +1748,6 @@ Public Class frmGameManager End Sub Private Sub chkMonitorOnly_CheckedChanged(sender As Object, e As EventArgs) Handles chkMonitorOnly.CheckedChanged - MonitorOnlyModeHandler() + MonitorOnlyModeChange() End Sub End Class From 19de2630503c6917c9210efb4f4259e9470e79e0 Mon Sep 17 00:00:00 2001 From: MikeMaximus Date: Fri, 11 Aug 2017 10:36:18 -0600 Subject: [PATCH 12/14] Fixed another ui problem with issue #89 --- GBM/Forms/frmGameManager.vb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 04c1629..61983da 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -1062,6 +1062,7 @@ Public Class frmGameManager btnInclude.Enabled = True btnExclude.Enabled = True End If + VerifyCleanFolder() End Sub Private Sub TimeStampModeChange() @@ -1078,7 +1079,7 @@ Public Class frmGameManager Private Sub VerifyCleanFolder() If Not bIsLoading Then - If chkFolderSave.Checked = True And txtExclude.Text = String.Empty And txtSavePath.Text <> String.Empty And Not chkMonitorOnly.Checked Then + If (chkFolderSave.Checked = True And txtExclude.Text = String.Empty And txtSavePath.Text <> String.Empty) And Not chkMonitorOnly.Checked Then chkCleanFolder.Enabled = True Else chkCleanFolder.Checked = False From 0f874ae74a3ba929506ec99f856b7d597d935081 Mon Sep 17 00:00:00 2001 From: "Michael J. Seiferling" Date: Sat, 23 Sep 2017 15:20:53 -0600 Subject: [PATCH 13/14] Enhancement for issue #83 --- GBM/Forms/frmAdvancedImport.vb | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/GBM/Forms/frmAdvancedImport.vb b/GBM/Forms/frmAdvancedImport.vb index ee374f9..d3e5997 100644 --- a/GBM/Forms/frmAdvancedImport.vb +++ b/GBM/Forms/frmAdvancedImport.vb @@ -1,10 +1,11 @@ Imports GBM.My.Resources +Imports System.IO Public Class frmAdvancedImport Private hshImportData As Hashtable Private hshFinalData As New Hashtable - Private bSelectAll As Boolean = False + Private bSelectAll As Boolean = True Private bIsLoading As Boolean = False Private iCurrentSort As Integer = 0 Private WithEvents tmFilterTimer As Timer @@ -44,7 +45,7 @@ Public Class frmAdvancedImport End If End Sub - Private Sub LoadData(Optional ByVal sFilter As String = "") + Private Sub LoadData(Optional ByVal sFilter As String = "", Optional ByVal bAutoDetect As Boolean = False) Dim oApp As clsGame Dim oListViewItem As ListViewItem Dim sTags As String @@ -79,6 +80,18 @@ Public Class frmAdvancedImport oListViewItem.Checked = False End If + If bAutoDetect Then + If oApp.AbsolutePath Then + If Directory.Exists(oApp.Path) Then + oListViewItem.Checked = True + Else + oListViewItem.Checked = False + End If + Else + oListViewItem.Checked = False + End If + End If + If sFilter = String.Empty Then bAddItem = True Else @@ -142,8 +155,7 @@ Public Class frmAdvancedImport Private Sub frmAdvancedImport_Load(sender As Object, e As EventArgs) Handles MyBase.Load bIsLoading = True SetForm() - LoadData() - SelectToggle() + LoadData(String.Empty, True) bIsLoading = False End Sub @@ -184,6 +196,7 @@ Public Class frmAdvancedImport tmFilterTimer.Stop() tmFilterTimer.Enabled = False End Sub + End Class ' Column Sorter From af13d51557d568bd53c58115ee5b82401e1d42a0 Mon Sep 17 00:00:00 2001 From: MikeMaximus Date: Tue, 26 Sep 2017 10:27:12 -0600 Subject: [PATCH 14/14] Updates and tweaks for v104 release --- GBM/Forms/frmAdvancedImport.vb | 1 + GBM/Forms/frmFilter.Designer.vb | 19 +++++++++---------- GBM/Forms/frmFilter.vb | 6 +++--- GBM/Forms/frmGameManager.vb | 2 +- GBM/My Project/Resources.Designer.vb | 4 ++-- GBM/My Project/Resources.resx | 4 ++-- GBM/readme.txt | 22 ++++++++++++++-------- 7 files changed, 32 insertions(+), 26 deletions(-) diff --git a/GBM/Forms/frmAdvancedImport.vb b/GBM/Forms/frmAdvancedImport.vb index d3e5997..70ef96b 100644 --- a/GBM/Forms/frmAdvancedImport.vb +++ b/GBM/Forms/frmAdvancedImport.vb @@ -84,6 +84,7 @@ Public Class frmAdvancedImport If oApp.AbsolutePath Then If Directory.Exists(oApp.Path) Then oListViewItem.Checked = True + SaveChecked(oListViewItem) Else oListViewItem.Checked = False End If diff --git a/GBM/Forms/frmFilter.Designer.vb b/GBM/Forms/frmFilter.Designer.vb index b2a9ae4..71f4469 100644 --- a/GBM/Forms/frmFilter.Designer.vb +++ b/GBM/Forms/frmFilter.Designer.vb @@ -293,30 +293,29 @@ Partial Class frmFilter Me.grpFilterType.Controls.Add(Me.optAnd) Me.grpFilterType.Location = New System.Drawing.Point(259, 81) Me.grpFilterType.Name = "grpFilterType" - Me.grpFilterType.Size = New System.Drawing.Size(106, 46) + Me.grpFilterType.Size = New System.Drawing.Size(105, 46) Me.grpFilterType.TabIndex = 8 Me.grpFilterType.TabStop = False Me.grpFilterType.Text = "Filter Type" ' 'optOr ' - Me.optOr.Location = New System.Drawing.Point(56, 19) + Me.optOr.Checked = True + Me.optOr.Location = New System.Drawing.Point(6, 19) Me.optOr.Name = "optOr" - Me.optOr.Size = New System.Drawing.Size(36, 17) - Me.optOr.TabIndex = 1 + Me.optOr.Size = New System.Drawing.Size(44, 17) + Me.optOr.TabIndex = 0 Me.optOr.TabStop = True - Me.optOr.Text = "Or" + Me.optOr.Text = "Any" Me.optOr.UseVisualStyleBackColor = True ' 'optAnd ' - Me.optAnd.Checked = True - Me.optAnd.Location = New System.Drawing.Point(6, 19) + Me.optAnd.Location = New System.Drawing.Point(56, 19) Me.optAnd.Name = "optAnd" Me.optAnd.Size = New System.Drawing.Size(44, 17) - Me.optAnd.TabIndex = 0 - Me.optAnd.TabStop = True - Me.optAnd.Text = "And" + Me.optAnd.TabIndex = 1 + Me.optAnd.Text = "All" Me.optAnd.UseVisualStyleBackColor = True ' 'txtStringFilter diff --git a/GBM/Forms/frmFilter.vb b/GBM/Forms/frmFilter.vb index 0a06276..0907c56 100644 --- a/GBM/Forms/frmFilter.vb +++ b/GBM/Forms/frmFilter.vb @@ -13,7 +13,7 @@ Public Class frmFilter Dim oGameFilters As New List(Of clsGameFilter) Dim oValidFields As New List(Of clsGameFilterField) Dim eCurrentFilterType As eFilterType = eFilterType.BaseFilter - Dim bAndOperator As Boolean = True + Dim bAndOperator As Boolean = False Dim bSortAsc As Boolean = True Dim sSortField As String = "Name" Dim hshTags As New Hashtable @@ -537,7 +537,7 @@ Public Class frmFilter grpSortOptions.Text = frmFilter_grpSortOptions 'Defaults - optAnd.Checked = True + optOr.Checked = True optSortAsc.Checked = True grpGameFilter.Enabled = False grpTagFilter.Enabled = False @@ -579,7 +579,7 @@ Public Class frmFilter If chkGameInfo.Checked Then grpGameFilter.Enabled = True Else - optAnd.Checked = True + optOr.Checked = True grpGameFilter.Enabled = False oGameFilters.Clear() lstFilter.Items.Clear() diff --git a/GBM/Forms/frmGameManager.vb b/GBM/Forms/frmGameManager.vb index 61983da..c1daa0e 100644 --- a/GBM/Forms/frmGameManager.vb +++ b/GBM/Forms/frmGameManager.vb @@ -22,7 +22,7 @@ Public Class frmGameManager Private oCurrentTagFilters As New List(Of clsTag) Private oCurrentFilters As New List(Of clsGameFilter) Private eCurrentFilter As frmFilter.eFilterType = frmFilter.eFilterType.BaseFilter - Private bCurrentAndOperator As Boolean = True + Private bCurrentAndOperator As Boolean = False Private bCurrentSortAsc As Boolean = True Private sCurrentSortField As String = "Name" Private WithEvents tmFilterTimer As Timer diff --git a/GBM/My Project/Resources.Designer.vb b/GBM/My Project/Resources.Designer.vb index 2e9ef39..ef39147 100644 --- a/GBM/My Project/Resources.Designer.vb +++ b/GBM/My Project/Resources.Designer.vb @@ -1276,7 +1276,7 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to And. + ''' Looks up a localized string similar to All. ''' Friend ReadOnly Property frmFilter_optAnd() As String Get @@ -1294,7 +1294,7 @@ Namespace My.Resources End Property ''' - ''' Looks up a localized string similar to Or. + ''' Looks up a localized string similar to Any. ''' Friend ReadOnly Property frmFilter_optOr() As String Get diff --git a/GBM/My Project/Resources.resx b/GBM/My Project/Resources.resx index 11162f3..468bfb0 100644 --- a/GBM/My Project/Resources.resx +++ b/GBM/My Project/Resources.resx @@ -905,7 +905,7 @@ All Tags - And + All Any Tag @@ -914,7 +914,7 @@ Game Information - Or + Any Tag diff --git a/GBM/readme.txt b/GBM/readme.txt index 9b96e04..77c1e33 100644 --- a/GBM/readme.txt +++ b/GBM/readme.txt @@ -1,14 +1,20 @@ -Game Backup Monitor v1.03 Readme +Game Backup Monitor v1.04 Readme http://mikemaximus.github.io/gbm-web/ gamebackupmonitor@gmail.com -August 2, 2017 +September 26, 2017 -New in 1.03 - -- (Windows) You can no longer Alt-Tab to GBM while it's minimized to the system tray. This was an unintentional change in v1.02 and caused various bugs. -- (Windows) Fixed various issues and inconsistent behavior when using the system tray and menu. -- (Linux) Free drive space is now checked correctly when performing a backup. GBM now requires "df" (Coreutils) on Linux. -- (All) Error messages related to SQLite will now be displayed correctly, instead of forcing the application to exit. +New in 1.04 +- (All) The import feature now detects most saved games currently on your PC and automatically selects configurations for you. +- (All) The Game Manager's "Custom Filter" feature has received a major overhaul: + - More fields are now available for use. + - Added the ability to combine different filters. + - Added the ability to set a sort field and order. + - The current filter is now saved when the Custom Filter window is closed and re-opened. +- (All) The "Monitor Only" feature has been updated. This feature allows tracking play time for games that do not require a backup, such as MMOs or CCGs. + - The Game Manager now disables and ignores validation on fields that aren't needed for a Monitor Only configuration. + - Monitor Only is now included in the XML Import / Export. + - Monitor Only configurations may now be included in the official game lists. + The entire version history of GBM releases is available at http://mikemaximus.github.io/gbm-web/versionhistory.html \ No newline at end of file