private void DrawSlotItem(Graphics g, ShipSlot slotItem, int x, int y) { var font8 = new Font(this.Font.FontFamily, 8); var item = slotItem.Item; var sloticon = ImageAssets.GetSlotIconImage(item.Info.IconType); g.DrawImage(sloticon, new Rectangle(x + 4, y, 28, 28)); if (item.Level > 0) { using (SolidBrush b = new SolidBrush(Color.FromArgb(0x40, 0x00, 0x00, 0x00))) g.FillRectangle(b, new Rectangle(x, y + 16, 36, 12)); TextRenderer.DrawText( g, item.LevelText, font8, new Rectangle(x, y + 16, 36, 12), Color.White, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter ); } if (item.Proficiency > 0) { using (SolidBrush b = new SolidBrush(Color.FromArgb(0x60, 0x00, 0x00, 0x00))) g.FillRectangle(b, new Rectangle(x + 36 - 12, y, 12, 12)); var proficiency = ImageAssets.GetProficiencyImage(item.Proficiency); g.DrawImage(proficiency, new Rectangle(x + 36 - 11, y + 1, 10, 10)); } var w = TextRenderer.MeasureText(slotItem.Current.ToString(), font8).Width; using (SolidBrush b = new SolidBrush(Color.FromArgb(0x60, 0x00, 0x00, 0x00))) g.FillRectangle(b, new Rectangle(x + 2, y, w - 1, 12)); var currentColor = slotItem.Lost == 0 ? Color.White : Color.FromArgb(0xDD, 0x35, 0x35); if (!slotItem.IsAirplane) { currentColor = Color.FromArgb( currentColor.R * 5 / 7, currentColor.G * 5 / 7, currentColor.B * 5 / 7 ); } TextRenderer.DrawText( g, slotItem.Current.ToString(), font8, new Rectangle(x + 2, y, 36, 12), currentColor, TextFormatFlags.Left | TextFormatFlags.VerticalCenter ); }
public TableView(SlotitemListTable Owner) { // SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer, true); this.DoubleBuffered = true; this.Owner = Owner; this.Font = Owner?.Font; this.components = new System.ComponentModel.Container(); toolTip = new ToolTip(this.components); toolTip.OwnerDraw = true; this.Resize += (s, e) => this.RequestUpdate(); this.Paint += (s, e) => { var g = e.Graphics; var Width = this.Width - this.Padding.Left - this.Padding.Right; var Height = this.Height - this.Padding.Top - this.Padding.Bottom; g.Clear(this.BackColor); Font font8 = new Font(this.Font.FontFamily, 8); var Ships = homeport?.Organization?.Ships; var SlotItems = homeport?.Itemyard?.SlotItems.Select(_ => _.Value) .OrderBy(_ => _.Info.Id) .GroupBy(_ => _.Info.Id); #region Cell Size Calculate ColumnSizes[0] = SlotItems?.Count() > 0 ? (SlotItems?.Max(__ => __.Max(_ => TextRenderer.MeasureText(_.Info.Name.ToString(), this.Font).Width) ) ?? 0) + 20 : 0; ColumnSizes[1] = SlotItems?.Count() > 0 ? (SlotItems?.Max(_ => TextRenderer.MeasureText(_.Count().ToString(), this.Font).Width) ?? 0) : 0; ColumnSizes[2] = ColumnSizes[3] = ColumnSizes[4] = 0; ColumnSizes[0] = Math.Max(ColumnSizes[0], TextRenderer.MeasureText(Headers[0], this.Font).Width) + 8; ColumnSizes[1] = Math.Max(ColumnSizes[1], TextRenderer.MeasureText(Headers[1], this.Font).Width) + 8; ColumnSizes[2] = Math.Max(ColumnSizes[2], TextRenderer.MeasureText(Headers[2], this.Font).Width) + 8; ColumnSizes[3] = Math.Max(ColumnSizes[3], TextRenderer.MeasureText(Headers[3], this.Font).Width) + 8; ColumnSizes[4] = Math.Max(ColumnSizes[4], TextRenderer.MeasureText(Headers[4], this.Font).Width) + 8; ColumnSizes[5] = 0; ColumnSizes[5] = (this.Owner?.Width ?? this.Width) - ColumnSizes.Sum() - 1 - 18; #endregion int x, y = 0; using (Pen p = new Pen(Color.FromArgb(83, 83, 83), 1.0f)) { SlotItemMap.Clear(); #region Data Rendering if (SlotItems != null) { Color colorWhite = Color.White; Color colorDarkGray = Color.FromArgb(0x20, 0x90, 0x90, 0x90); Color colorGray = Color.FromArgb(0x40, 0xC4, 0xC4, 0xC4); Color colorLevel = Color.FromArgb(0x45, 0xA9, 0xA5); Color colorProficiency123 = Color.FromArgb(0x98, 0xB3, 0xCE); Color colorProficiency4567 = Color.FromArgb(0xD4, 0x9C, 0x0F); int idx = 0; y = 0; foreach (var slotitemIdGroup in SlotItems) { if (slotitemIdGroup == null) { continue; } int widthValue, nx; x = 0; y -= 2; var slotitemLevelGroup = slotitemIdGroup .GroupBy(_ => _.NameWithLevel); if (idx % 2 == 1) { int py = y; #region Calcuate Equipped Ships Size foreach (var slotitems in slotitemLevelGroup) { int nx2 = x; var EquippedShips = Ships.Where( _ => _.Value.Slots.Any(__ => slotitems.Any(___ => ___.Id == __.Item.Id)) || (slotitems.Any(___ => ___.Id == _.Value.ExSlot?.Item.Id)) ).Select(_ => _.Value); foreach (var ship in EquippedShips) { int sizeName = 0; int sizeLevel = 0; int sizeCount = 0; int hasCount = ship.Slots.Count(_ => slotitems.Any(__ => __.Id == _.Item.Id)) + (slotitems.Any(_ => _.Id == ship.ExSlot?.Item.Id) ? 1 : 0); sizeName = TextRenderer.MeasureText(ship.Info.Name, this.Font).Width - 2; sizeLevel = TextRenderer.MeasureText("Lv." + ship.Level.ToString(), font8).Width; if (hasCount > 1) { sizeCount = TextRenderer.MeasureText("x " + hasCount.ToString(), font8).Width + 1; } if ((x - nx2) + sizeName + sizeLevel + sizeCount > ColumnSizes[5]) { x = nx2; y += RowSize; } x += sizeName + sizeLevel + sizeCount + 8; } } #endregion using (SolidBrush b = new SolidBrush(Color.FromArgb(0x18, 0x90, 0x90, 0x90))) g.FillRectangle(b, new Rectangle(0, py, Width, y - py + RowSize)); x = 0; y = py; } #region Icon And Name Image icon = ImageAssets.GetSlotIconImage(slotitemIdGroup.First().Info.IconType); g.DrawImage(icon, new Rectangle(x + 4, y + 2, 18, 18)); TextRenderer.DrawText( g, slotitemIdGroup.First().Info.Name, this.Font, new Rectangle(x + 20 + 3, y, ColumnSizes[0] - 8, RowSize), colorWhite, TextFormatFlags.VerticalCenter | TextFormatFlags.Left ); SlotItemMap.Add(new Rectangle(x, y, ColumnSizes[0], RowSize), slotitemIdGroup.First()); x += ColumnSizes[0]; #endregion #region Items count (Group) TextRenderer.DrawText( g, slotitemIdGroup.Count().ToString(), this.Font, new Rectangle(x + 3, y, ColumnSizes[1] - 8, RowSize), colorWhite, TextFormatFlags.VerticalCenter | TextFormatFlags.Left ); x += ColumnSizes[1]; #endregion nx = x; foreach (var slotitems in slotitemLevelGroup) { if (slotitems == null) { continue; } var slotitem = slotitems.First(); #region Item Level TextRenderer.DrawText( g, "★" + (slotitem.Level == 10 ? "max" : "+" + slotitem.Level.ToString()), this.Font, new Rectangle(x + 3, y, ColumnSizes[2] - 8, RowSize), slotitem.Level > 0 ? colorLevel : colorDarkGray, TextFormatFlags.VerticalCenter | TextFormatFlags.Left ); x += ColumnSizes[2]; #endregion #region Item Proficiency TextRenderer.DrawText( g, "+" + slotitem.Proficiency.ToString(), this.Font, new Rectangle(x + 3, y, ColumnSizes[3] - 8, RowSize), slotitem.Proficiency >= 4 ? colorProficiency4567 : ( slotitem.Proficiency >= 1 && slotitem.Proficiency <= 3 ? colorProficiency123 : colorDarkGray ), TextFormatFlags.VerticalCenter | TextFormatFlags.Left ); x += ColumnSizes[3]; #endregion #region Items count widthValue = TextRenderer.MeasureText( slotitems.Count().ToString(), this.Font ).Width; TextRenderer.DrawText( g, slotitems.Count().ToString(), this.Font, new Rectangle(x + 3, y, ColumnSizes[4] - 8, RowSize), colorWhite, TextFormatFlags.VerticalCenter | TextFormatFlags.Left ); TextRenderer.DrawText( g, "(" + slotitems.Count( _ => !Ships.Any( __ => __.Value.Slots.Any(___ => ___.Item.Id == _.Id) || (__.Value.ExSlot?.Item.Id == _.Id) ) ) + ")", font8, new Rectangle(x + widthValue + 3, y, ColumnSizes[4] - 8, RowSize - 4), colorGray, TextFormatFlags.Bottom | TextFormatFlags.Left ); x += ColumnSizes[4]; #endregion #region Equipped Ships int nx2 = x; var EquippedShips = Ships.Where( _ => _.Value.Slots.Any(__ => slotitems.Any(___ => ___.Id == __.Item.Id)) || (slotitems.Any(___ => ___.Id == _.Value.ExSlot?.Item.Id)) ).Select(_ => _.Value); foreach (var ship in EquippedShips) { int sizeName = 0; int sizeLevel = 0; int sizeCount = 0; int hasCount = ship.Slots.Count(_ => slotitems.Any(__ => __.Id == _.Item.Id)) + (slotitems.Any(_ => _.Id == ship.ExSlot?.Item.Id) ? 1 : 0); sizeName = TextRenderer.MeasureText(ship.Info.Name, this.Font).Width - 2; sizeLevel = TextRenderer.MeasureText("Lv." + ship.Level.ToString(), font8).Width; if (hasCount > 1) { sizeCount = TextRenderer.MeasureText("x " + hasCount.ToString(), font8).Width + 1; } if ((x - nx2) + sizeName + sizeLevel + sizeCount > ColumnSizes[5]) { x = nx2; y += RowSize; } TextRenderer.DrawText(g, ship.Info.Name, this.Font, new Point(x, y + 4), colorWhite); TextRenderer.DrawText(g, "Lv." + ship.Level.ToString(), font8, new Point(x + sizeName, y + 4 + 2), colorGray); if (hasCount > 1) { using (SolidBrush b = new SolidBrush(Color.FromArgb(0x20, 0x20, 0x20))) g.FillRectangle(b, new Rectangle(x + sizeName + sizeLevel, y + 4, sizeCount, RowSize - 4 - 4)); TextRenderer.DrawText(g, "x " + hasCount.ToString(), font8, new Point(x + sizeName + sizeLevel + 1, y + 4 + 1), colorGray); } x += sizeName + sizeLevel + sizeCount + 8; } #endregion y += RowSize; x = nx; } // GroupBy LevelProficiency idx++; y += 3; g.DrawLine(p, 0, y - 3, Width, y - 3); } // GroupBy Id } #endregion } var ResultSize = new Size( ColumnSizes.Sum() + this.Padding.Left + this.Padding.Right + 1, y + this.Padding.Top + this.Padding.Bottom + 1 ); if (ResultSize.Width != LatestSize.Width || ResultSize.Height != LatestSize.Height) { LatestSize = ResultSize; this.PerformAutoScale(); this.PerformLayout(); this.Owner.RequestUpdate(); } }; var toolTipFont = new Font(this.Font.FontFamily, 10); toolTip.Popup += (s, e) => { if (CurrentItem == null) { e.Cancel = true; return; } var text = CurrentItem.Info.Name + Environment.NewLine + CurrentItem.Info.ToolTipData; var sz = TextRenderer.MeasureText(text, toolTipFont); e.ToolTipSize = new Size(sz.Width + 6, sz.Height + 6); }; toolTip.Draw += (s, e) => { var g = e.Graphics; g.Clear(Color.FromArgb(0x27, 0x27, 0x2F)); g.DrawRectangle( new Pen(Color.FromArgb(0x44, 0x44, 0x4A), 1.0f), new Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width - 1, e.Bounds.Height - 1) ); TextRenderer.DrawText( g, e.ToolTipText, toolTipFont, e.Bounds, Color.FromArgb(255, 255, 255), TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter ); }; this.MouseMove += (s, e) => { if (!this.SlotItemMap.Any(x => x.Key.Contains(e.X, e.Y))) { CurrentItem = null; toolTip.Hide(this); return; } var item = this.SlotItemMap.FirstOrDefault(x => x.Key.Contains(e.X, e.Y)).Value; if (item == CurrentItem) { return; } CurrentItem = item; toolTip.Show(CurrentItem.Info.Name + Environment.NewLine + CurrentItem.Info.ToolTipData, this); }; this.MouseDown += (s, e) => { if (!this.SlotItemMap.Any(x => x.Key.Contains(e.X, e.Y))) { CurrentItem = null; toolTip.Hide(this); return; } var item = this.SlotItemMap.FirstOrDefault(x => x.Key.Contains(e.X, e.Y)).Value; CurrentItem = item; toolTip.Show(CurrentItem.Info.Name + Environment.NewLine + CurrentItem.Info.ToolTipData, this); }; }
public BattleShipTooltip(BattleFleetView Owner, IContainer container) : base(container) { this.Owner = Owner; this.Popup += (s, e) => { e.ToolTipSize = CalcSize(this.Ship); }; this.Draw += (s, e) => { var g = e.Graphics; g.Clear(Color.FromArgb(0x27, 0x27, 0x2F)); g.DrawRectangle( new Pen(Color.FromArgb(0x44, 0x44, 0x4A), 1.0f), new Rectangle(e.Bounds.Left, e.Bounds.Top, e.Bounds.Width - 1, e.Bounds.Height - 1) ); if (this.Ship == null) { return; } Color colorWhite = Color.White; Color colorDarkGray = Color.FromArgb(0x20, 0x90, 0x90, 0x90); Color colorGray = Color.FromArgb(0x40, 0xC4, 0xC4, 0xC4); var ship = this.Ship; var f = this.Owner?.Font; int x, y; int h = TextRenderer.MeasureText(" ", f).Height; int[] cols = new int[2]; string firepowerSum = ship.SumFirepower.ToString(), torpedoSum = ship.SumTorpedo.ToString(), aaSum = ship.SumAA.ToString(), armorSum = ship.SumArmor.ToString(), firepowerDetail = string.Format("({0}+{1})", ship.Firepower, ship.SlotsFirepower), torpedoDetail = string.Format("({0}+{1})", ship.Torpedo, ship.SlotsTorpedo), aaDetail = string.Format("({0}+{1})", ship.AA, ship.SlotsAA), armorDetail = string.Format("({0}+{1})", ship.Armor, ship.SlotsArmor), aswDetail = string.Format("(+{0})", ship.SlotsASW), hitDetail = string.Format("(+{0})", ship.SlotsHit), evadeDetail = string.Format("(+{0})", ship.SlotsEvade); #region Cell size calculate cols[0] = new int[] { TextRenderer.MeasureText("화력", f).Width + TextRenderer.MeasureText(firepowerSum, f).Width + TextRenderer.MeasureText(firepowerDetail, f).Width, TextRenderer.MeasureText("뇌장", f).Width + TextRenderer.MeasureText(torpedoSum, f).Width + TextRenderer.MeasureText(torpedoDetail, f).Width, TextRenderer.MeasureText("대공", f).Width + TextRenderer.MeasureText(aaSum, f).Width + TextRenderer.MeasureText(aaDetail, f).Width, TextRenderer.MeasureText("장갑", f).Width + TextRenderer.MeasureText(armorSum, f).Width + TextRenderer.MeasureText(armorDetail, f).Width }.Max(); cols[1] = new int[] { TextRenderer.MeasureText("대잠", f).Width + TextRenderer.MeasureText(aswDetail, f).Width, TextRenderer.MeasureText("명중", f).Width + TextRenderer.MeasureText(hitDetail, f).Width, TextRenderer.MeasureText("회피", f).Width + TextRenderer.MeasureText(evadeDetail, f).Width }.Max(); #endregion #region First Column x = 4; y = 3; TextRenderer.DrawText(g, "화력", f, new Point(x, y), colorGray); x += TextRenderer.MeasureText("화력", f).Width; TextRenderer.DrawText(g, firepowerSum, f, new Point(x, y), colorWhite); x += TextRenderer.MeasureText(firepowerSum, f).Width; TextRenderer.DrawText(g, firepowerDetail, f, new Point(x, y), colorGray); x = 4; y += h; TextRenderer.DrawText(g, "뇌장", f, new Point(x, y), colorGray); x += TextRenderer.MeasureText("뇌장", f).Width; TextRenderer.DrawText(g, torpedoSum, f, new Point(x, y), colorWhite); x += TextRenderer.MeasureText(torpedoSum, f).Width; TextRenderer.DrawText(g, torpedoDetail, f, new Point(x, y), colorGray); x = 4; y += h; TextRenderer.DrawText(g, "대공", f, new Point(x, y), colorGray); x += TextRenderer.MeasureText("대공", f).Width; TextRenderer.DrawText(g, aaSum, f, new Point(x, y), colorWhite); x += TextRenderer.MeasureText(aaSum, f).Width; TextRenderer.DrawText(g, aaDetail, f, new Point(x, y), colorGray); x = 4; y += h; TextRenderer.DrawText(g, "장갑", f, new Point(x, y), colorGray); x += TextRenderer.MeasureText("장갑", f).Width; TextRenderer.DrawText(g, armorSum, f, new Point(x, y), colorWhite); x += TextRenderer.MeasureText(armorSum, f).Width; TextRenderer.DrawText(g, armorDetail, f, new Point(x, y), colorGray); #endregion #region Second Column x = 4 + cols[0]; y = 3; TextRenderer.DrawText(g, "대잠", f, new Point(x, y), colorGray); x += TextRenderer.MeasureText("대잠", f).Width; TextRenderer.DrawText(g, aswDetail, f, new Point(x, y), colorGray); x = 4 + cols[0]; y += h; TextRenderer.DrawText(g, "명중", f, new Point(x, y), colorGray); x += TextRenderer.MeasureText("명중", f).Width; TextRenderer.DrawText(g, hitDetail, f, new Point(x, y), colorGray); x = 4 + cols[0]; y += h; TextRenderer.DrawText(g, "회피", f, new Point(x, y), colorGray); x += TextRenderer.MeasureText("회피", f).Width; TextRenderer.DrawText(g, evadeDetail, f, new Point(x, y), colorGray); #endregion #region Last Column x = 4 + cols[0] + cols[1]; y = 3; foreach (var slot in ship.Slots.Where(_ => _.Equipped)) { var icon = ImageAssets.GetSlotIconImage(slot.Source.IconType); g.DrawImage(icon, new Rectangle(x + 1, y + 1, 14, 14)); TextRenderer.DrawText(g, slot.Source.Name, f, new Point(x + 14 + 2, y), colorWhite); y += h; } if (ship.ExSlot?.Equipped ?? false) { using (Pen p = new Pen(colorGray)) g.DrawLine(p, x + 2, y, e.Bounds.Width - 2, y); var slot = ship.ExSlot; var icon = ImageAssets.GetSlotIconImage(slot.Source.IconType); g.DrawImage(icon, new Rectangle(x + 1, y + 1, 14, 14)); TextRenderer.DrawText(g, slot.Source.Name, f, new Point(x + 14 + 2, y), colorWhite); y += h; } #endregion }; this.OwnerDraw = true; }