diff --git a/PKHeX/Legality/Analysis.cs b/PKHeX/Legality/Analysis.cs index 58f683af6..4f2c48dd6 100644 --- a/PKHeX/Legality/Analysis.cs +++ b/PKHeX/Legality/Analysis.cs @@ -29,6 +29,9 @@ private enum Encounters public CheckResult[] vRelearn = new CheckResult[4]; public string Report => getLegalityReport(); public string VerboseReport => getVerboseLegalityReport(); + public readonly int[] AllSuggestedMoves; + public readonly int[] AllSuggestedRelearnMoves; + public readonly int[] AllSuggestedMovesAndRelearn; public LegalityAnalysis(PKM pk) { @@ -63,6 +66,9 @@ public LegalityAnalysis(PKM pk) } catch { Valid = false; } getLegalityReport(); + AllSuggestedMoves = getSuggestedMoves(true, true); + AllSuggestedRelearnMoves = Legal.getValidRelearn(pkm, -1).ToArray(); + AllSuggestedMovesAndRelearn = AllSuggestedMoves.Concat(AllSuggestedRelearnMoves).ToArray(); } private void AddLine(Severity s, string c, CheckIdentifier i) @@ -210,7 +216,7 @@ public int[] getSuggestedRelearn() } public int[] getSuggestedMoves(bool tm, bool tutor) { - if (pkm.Format < 6) + if (pkm == null || pkm.Format < 6) return null; return Legal.getValidMoves(pkm, Tutor: tutor, Machine: tm).Skip(1).ToArray(); // skip move 0 } diff --git a/PKHeX/MainWindow/Main.Designer.cs b/PKHeX/MainWindow/Main.Designer.cs index 31c0cbeb5..1958a6d0d 100644 --- a/PKHeX/MainWindow/Main.Designer.cs +++ b/PKHeX/MainWindow/Main.Designer.cs @@ -3142,11 +3142,13 @@ public void InitializeComponent() // this.CB_Move4.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; this.CB_Move4.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CB_Move4.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; this.CB_Move4.FormattingEnabled = true; this.CB_Move4.Location = new System.Drawing.Point(9, 92); this.CB_Move4.Name = "CB_Move4"; this.CB_Move4.Size = new System.Drawing.Size(121, 21); this.CB_Move4.TabIndex = 10; + this.CB_Move4.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.validateMovePaint); this.CB_Move4.SelectedIndexChanged += new System.EventHandler(this.validateMove); this.CB_Move4.KeyDown += new System.Windows.Forms.KeyEventHandler(this.removedropCB); this.CB_Move4.Leave += new System.EventHandler(this.validateComboBox2); @@ -3171,11 +3173,13 @@ public void InitializeComponent() // this.CB_Move3.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; this.CB_Move3.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CB_Move3.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; this.CB_Move3.FormattingEnabled = true; this.CB_Move3.Location = new System.Drawing.Point(9, 70); this.CB_Move3.Name = "CB_Move3"; this.CB_Move3.Size = new System.Drawing.Size(121, 21); this.CB_Move3.TabIndex = 7; + this.CB_Move3.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.validateMovePaint); this.CB_Move3.SelectedIndexChanged += new System.EventHandler(this.validateMove); this.CB_Move3.KeyDown += new System.Windows.Forms.KeyEventHandler(this.removedropCB); this.CB_Move3.Leave += new System.EventHandler(this.validateComboBox2); @@ -3185,11 +3189,13 @@ public void InitializeComponent() // this.CB_Move2.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; this.CB_Move2.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CB_Move2.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; this.CB_Move2.FormattingEnabled = true; this.CB_Move2.Location = new System.Drawing.Point(9, 48); this.CB_Move2.Name = "CB_Move2"; this.CB_Move2.Size = new System.Drawing.Size(121, 21); this.CB_Move2.TabIndex = 4; + this.CB_Move2.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.validateMovePaint); this.CB_Move2.SelectedIndexChanged += new System.EventHandler(this.validateMove); this.CB_Move2.KeyDown += new System.Windows.Forms.KeyEventHandler(this.removedropCB); this.CB_Move2.Leave += new System.EventHandler(this.validateComboBox2); @@ -3199,11 +3205,13 @@ public void InitializeComponent() // this.CB_Move1.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.SuggestAppend; this.CB_Move1.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.ListItems; + this.CB_Move1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed; this.CB_Move1.FormattingEnabled = true; this.CB_Move1.Location = new System.Drawing.Point(9, 26); this.CB_Move1.Name = "CB_Move1"; this.CB_Move1.Size = new System.Drawing.Size(121, 21); this.CB_Move1.TabIndex = 1; + this.CB_Move1.DrawItem += new System.Windows.Forms.DrawItemEventHandler(this.validateMovePaint); this.CB_Move1.SelectedIndexChanged += new System.EventHandler(this.validateMove); this.CB_Move1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.removedropCB); this.CB_Move1.Leave += new System.EventHandler(this.validateComboBox2); diff --git a/PKHeX/MainWindow/Main.cs b/PKHeX/MainWindow/Main.cs index b017a984d..7c856ff79 100644 --- a/PKHeX/MainWindow/Main.cs +++ b/PKHeX/MainWindow/Main.cs @@ -2638,14 +2638,30 @@ private void validateMove(object sender, EventArgs e) if (new[] { CB_Move1, CB_Move2, CB_Move3, CB_Move4 }.Contains(sender)) // Move updatePP(sender, e); - - if (pkm.Format < 6) - return; // Legality - pkm.Moves = new[] { Util.getIndex(CB_Move1), Util.getIndex(CB_Move2), Util.getIndex(CB_Move3), Util.getIndex(CB_Move4) }; - pkm.RelearnMoves = new[] { Util.getIndex(CB_RelearnMove1), Util.getIndex(CB_RelearnMove2), Util.getIndex(CB_RelearnMove3), Util.getIndex(CB_RelearnMove4) }; - updateLegality(); + pkm.Moves = new[] {CB_Move1, CB_Move2, CB_Move3, CB_Move4}.Select(Util.getIndex).ToArray(); + pkm.RelearnMoves = new[] {CB_RelearnMove1, CB_RelearnMove2, CB_RelearnMove3, CB_RelearnMove4}.Select(Util.getIndex).ToArray(); + updateLegality(skipMoveRepop:true); + } + private void validateMovePaint(object sender, DrawItemEventArgs e) + { + if (e.Index < 0) return; + + var i = (ComboItem)(sender as ComboBox).Items[e.Index]; + var moves = Legality.AllSuggestedMovesAndRelearn; + bool vm = moves != null && moves.Contains(i.Value) && !HaX; + + bool current = (e.State & DrawItemState.Selected) == DrawItemState.Selected; + Brush tBrush = current ? SystemBrushes.HighlightText : new SolidBrush(e.ForeColor); + Brush brush = current ? SystemBrushes.Highlight : vm ? Brushes.PaleGreen : new SolidBrush(e.BackColor); + + e.Graphics.FillRectangle(brush, e.Bounds); + e.Graphics.DrawString(i.Text, e.Font, tBrush, e.Bounds, StringFormat.GenericDefault); + if (current) return; + tBrush.Dispose(); + if (!vm) + brush.Dispose(); } private void validateLocation(object sender, EventArgs e) { @@ -2673,7 +2689,7 @@ private void showLegality(PKM pk, bool tabs, bool verbose) updateLegality(la); Util.Alert(verbose ? la.VerboseReport : la.Report); } - private void updateLegality(LegalityAnalysis la = null) + private void updateLegality(LegalityAnalysis la = null, bool skipMoveRepop = false) { if (!fieldsLoaded) return; @@ -2693,6 +2709,22 @@ private void updateLegality(LegalityAnalysis la = null) for (int i = 0; i < 4; i++) relearnPB[i].Visible = !Legality.vRelearn[i].Valid && !HaX; + + if (skipMoveRepop) + return; + // Resort moves + bool tmp = fieldsLoaded; + fieldsLoaded = false; + var cb = new[] {CB_Move1, CB_Move2, CB_Move3, CB_Move4 }; + var moves = Legality.AllSuggestedMovesAndRelearn; + var moveList = GameInfo.MoveDataSource.OrderByDescending(m => moves.Contains(m.Value)).ToList(); + foreach (ComboBox c in cb) + { + var index = c.SelectedValue; + c.DataSource = new BindingSource(moveList, null); + c.SelectedValue = index; + } + fieldsLoaded |= tmp; } private void updateStats() { @@ -3898,7 +3930,6 @@ private void pbBoxSlot_MouseClick(object sender, MouseEventArgs e) clickSlot(sender, e); } - private void pbBoxSlot_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left)