public TableEnemyMemberControl( FormCompass parent ) { #region Initialize Parent = parent; ToolTipInfo = parent.ToolTipInfo; ShipName = new ImageLabel(); ShipName.Anchor = AnchorStyles.Left; ShipName.ForeColor = parent.MainFontColor; ShipName.ImageAlign = ContentAlignment.MiddleCenter; ShipName.Padding = new Padding( 0, 1, 0, 1 ); ShipName.Margin = new Padding( 2, 0, 2, 0 ); ShipName.MaximumSize = new Size( 120, 20 ); ShipName.AutoEllipsis = true; ShipName.AutoSize = true; ShipName.Cursor = Cursors.Help; ShipName.MouseClick += ShipName_MouseClick; Equipments = new ShipStatusEquipment(); Equipments.SuspendLayout(); Equipments.Anchor = AnchorStyles.Left; Equipments.Padding = new Padding( 0, 2, 0, 1 ); Equipments.Margin = new Padding( 2, 0, 2, 0 ); Equipments.Size = new Size( 40, 20 ); //checkme: 要る? Equipments.AutoSize = true; Equipments.ResumeLayout(); ConfigurationChanged(); #endregion }
public TableFleetControl( FormFleetOverview parent, int fleetID ) { #region Initialize Number = new ImageLabel(); Number.Anchor = AnchorStyles.Left; Number.ImageAlign = ContentAlignment.MiddleCenter; Number.Margin = new Padding( 3, 2, 3, 2 ); Number.Text = string.Format( "#{0}:", fleetID ); Number.Tag = null; State = new ImageLabel(); State.Anchor = AnchorStyles.Left; State.Margin = new Padding( 3, 2, 3, 2 ); State.ImageList = ResourceManager.Instance.Icons; State.Text = "-"; State.Tag = FleetData.FleetStates.NoShip; ConfigurationChanged( parent ); this.fleetID = fleetID; ToolTipInfo = parent.ToolTipInfo; #endregion }
public StateLabel() { Label = GetDefaultLabel(); Label.MouseEnter += Label_MouseEnter; Label.MouseLeave += Label_MouseLeave; Enabled = false; }
public static ImageLabel GetDefaultLabel() { var label = new ImageLabel(); label.Anchor = AnchorStyles.Left; label.ImageList = ResourceManager.Instance.Icons; label.Padding = new Padding(2, 2, 2, 2); label.Margin = new Padding(2, 0, 2, 0); label.AutoSize = true; return(label); }
public TableFleetControl( FormFleet parent ) { #region Initialize Name = new Label(); Name.Text = "[" + parent.FleetID.ToString() + "]"; Name.Anchor = AnchorStyles.Left; Name.ForeColor = parent.MainFontColor; Name.BackColor = parent.BackColor; Name.Padding = new Padding( 0, 1, 0, 1 ); Name.Margin = new Padding( 2, 0, 2, 0 ); Name.AutoSize = true; //Name.Visible = false; StateMain = new ImageLabel(); StateMain.Anchor = AnchorStyles.Left; StateMain.ForeColor = parent.MainFontColor; StateMain.BackColor = parent.BackColor; StateMain.ImageList = ResourceManager.Instance.Icons; StateMain.Padding = new Padding( 2, 2, 2, 2 ); StateMain.Margin = new Padding( 2, 0, 2, 0 ); StateMain.AutoSize = true; AirSuperiority = new ImageLabel(); AirSuperiority.Anchor = AnchorStyles.Left; AirSuperiority.ForeColor = parent.MainFontColor; AirSuperiority.BackColor = parent.BackColor; AirSuperiority.ImageList = ResourceManager.Instance.Equipments; AirSuperiority.ImageIndex = (int)ResourceManager.EquipmentContent.CarrierBasedFighter; AirSuperiority.Padding = new Padding( 2, 2, 2, 2 ); AirSuperiority.Margin = new Padding( 2, 0, 2, 0 ); AirSuperiority.AutoSize = true; SearchingAbility = new ImageLabel(); SearchingAbility.Anchor = AnchorStyles.Left; SearchingAbility.ForeColor = parent.MainFontColor; SearchingAbility.BackColor = parent.BackColor; SearchingAbility.ImageList = ResourceManager.Instance.Equipments; SearchingAbility.ImageIndex = (int)ResourceManager.EquipmentContent.CarrierBasedRecon; SearchingAbility.Padding = new Padding( 2, 2, 2, 2 ); SearchingAbility.Margin = new Padding( 2, 0, 2, 0 ); SearchingAbility.AutoSize = true; ConfigurationChanged( parent ); ToolTipInfo = parent.ToolTipInfo; State = FleetData.FleetStates.NoShip; Timer = DateTime.Now; #endregion }
public static ImageLabel GetDefaultLabel() { var label = new ImageLabel { Anchor = AnchorStyles.Left, ImageList = ResourceManager.Instance.Icons, Padding = new Padding(2, 2, 2, 2), Margin = new Padding(2, 0, 2, 0), AutoSize = true }; return(label); }
public FormFleetOverview( FormMain parent ) { InitializeComponent(); ConfigurationChanged(); ControlHelper.SetDoubleBuffered( TableFleet ); ControlFleet = new List<TableFleetControl>( 4 ); for ( int i = 0; i < 4; i++ ) { ControlFleet.Add( new TableFleetControl( this, i + 1, TableFleet ) ); } #region CombinedTag { CombinedTag = new ImageLabel(); CombinedTag.Anchor = AnchorStyles.Left; CombinedTag.Font = Utility.Configuration.Config.UI.MainFont; CombinedTag.Margin = new Padding( 3, 2, 3, 2 ); CombinedTag.ImageList = ResourceManager.Instance.Icons; CombinedTag.ImageIndex = (int)ResourceManager.IconContent.FleetCombined; CombinedTag.Text = "-"; CombinedTag.Visible = false; TableFleet.Controls.Add( CombinedTag, 1, 4 ); #region set RowStyle RowStyle rs = new RowStyle( SizeType.AutoSize, 0 ); if ( TableFleet.RowStyles.Count > 4 ) TableFleet.RowStyles[4] = rs; else while ( TableFleet.RowStyles.Count <= 4 ) TableFleet.RowStyles.Add( rs ); #endregion } #endregion Icon = ResourceManager.ImageToIcon( ResourceManager.Instance.Icons.Images[(int)ResourceManager.IconContent.FormFleet] ); Utility.SystemEvents.UpdateTimerTick += UpdateTimerTick; }
/// <summary> /// 艦隊の状態の情報をラベルに適用します。 /// </summary> /// <param name="fleet">艦隊データ。</param> /// <param name="label">適用するラベル。</param> /// <param name="tooltip">適用するツールチップ。</param> /// <param name="prevstate">前回の状態。</param> /// <param name="timer">日時。</param> /// <returns>艦隊の状態を表す定数。</returns> public static FleetStates UpdateFleetState( FleetData fleet, ImageLabel label, ToolTip tooltip, FleetStates prevstate, ref DateTime timer ) { KCDatabase db = KCDatabase.Instance; //初期化 tooltip.SetToolTip( label, null ); label.BackColor = Color.Transparent; //所属艦なし if ( fleet == null || fleet.Members.Count( id => id != -1 ) == 0 ) { label.Text = "所属艦なし"; label.ImageIndex = (int)ResourceManager.IconContent.FleetNoShip; return FleetStates.NoShip; } { //入渠中 long ntime = db.Docks.Values.Max( dock => { if ( dock.State == 1 && fleet.Members.Count( ( id => id == dock.ShipID ) ) > 0 ) return dock.CompletionTime.Ticks; else return 0; } ); if ( ntime > 0 ) { //入渠中 timer = new DateTime( ntime ); label.Text = "入渠中 " + DateTimeHelper.ToTimeRemainString( timer ); label.ImageIndex = (int)ResourceManager.IconContent.FleetDocking; tooltip.SetToolTip( label, "完了日時 : " + DateTimeHelper.TimeToCSVString( timer ) ); return FleetStates.Docking; } } if ( fleet.IsInSortie ) { //大破出撃中 if ( fleet.MembersInstance.Count( s => ( s != null && !fleet.EscapedShipList.Contains( s.MasterID ) && (double)s.HPCurrent / s.HPMax <= 0.25 ) ) > 0 ) { label.Text = "!!大破進撃中!!"; label.ImageIndex = (int)ResourceManager.IconContent.FleetSortieDamaged; return FleetStates.SortieDamaged; } else { //出撃中 label.Text = "出撃中"; label.ImageIndex = (int)ResourceManager.IconContent.FleetSortie; return FleetStates.Sortie; } } //遠征中 if ( fleet.ExpeditionState != 0 ) { timer = fleet.ExpeditionTime; label.Text = "遠征中 " + DateTimeHelper.ToTimeRemainString( timer ); label.ImageIndex = (int)ResourceManager.IconContent.FleetExpedition; tooltip.SetToolTip( label, string.Format( "{0} : {1}\r\n完了日時 : {2}", KCDatabase.Instance.Mission[fleet.ExpeditionDestination].ID, KCDatabase.Instance.Mission[fleet.ExpeditionDestination].Name, DateTimeHelper.TimeToCSVString( timer ) ) ); return FleetStates.Expedition; } //大破艦あり if ( fleet.MembersInstance.Count( s => ( s != null && !fleet.EscapedShipList.Contains( s.MasterID ) && (double)s.HPCurrent / s.HPMax <= 0.25 ) ) > 0 ) { label.Text = "大破艦あり!"; label.ImageIndex = (int)ResourceManager.IconContent.FleetDamaged; //label.BackColor = Color.LightCoral; return FleetStates.Damaged; } //泊地修理中 { if ( fleet.CanAnchorageRepairing && fleet.MembersInstance.Take( 2 + KCDatabase.Instance.Ships[fleet[0]].SlotInstanceMaster.Count( eq => eq != null && eq.CategoryType == 31 ) ) .Any( s => s != null && s.HPRate < 1.0 && s.HPRate > 0.5 && s.RepairingDockID == -1 ) ) { label.Text = "泊地修理中 " + DateTimeHelper.ToTimeElapsedString( KCDatabase.Instance.Fleet.AnchorageRepairingTimer ); label.ImageIndex = (int)ResourceManager.IconContent.FleetAnchorageRepairing; tooltip.SetToolTip( label, string.Format( "開始日時 : {0}", DateTimeHelper.TimeToCSVString( KCDatabase.Instance.Fleet.AnchorageRepairingTimer ) ) ); return FleetStates.AnchorageRepairing; } } //未補給 { int fuel = fleet.MembersInstance.Sum( ship => ship == null ? 0 : (int)( ( ship.FuelMax - ship.Fuel ) * ( ship.IsMarried ? 0.85 : 1.00 ) ) ); int ammo = fleet.MembersInstance.Sum( ship => ship == null ? 0 : (int)( ( ship.AmmoMax - ship.Ammo ) * ( ship.IsMarried ? 0.85 : 1.00 ) ) ); int aircraft = fleet.MembersInstance.Sum( ship => { if ( ship == null ) return 0; else { int c = 0; for ( int i = 0; i < ship.Slot.Count; i++ ) { c += ship.MasterShip.Aircraft[i] - ship.Aircraft[i]; } return c; } } ); int bauxite = aircraft * 5; if ( fuel > 0 || ammo > 0 || bauxite > 0 ) { label.Text = "未補給"; label.ImageIndex = (int)ResourceManager.IconContent.FleetNotReplenished; tooltip.SetToolTip( label, string.Format( "燃 : {0}\r\n弾 : {1}\r\nボ : {2} ({3}機)", fuel, ammo, bauxite, aircraft ) ); return FleetStates.NotReplenished; } } //疲労 { int cond = fleet.MembersInstance.Min( s => s == null ? 100 : s.Condition ); if ( cond < Configuration.Config.Control.ConditionBorder && fleet.ConditionTime != null ) { timer = (DateTime)fleet.ConditionTime; label.Text = "疲労 " + DateTimeHelper.ToTimeRemainString( timer ); if ( cond < 20 ) label.ImageIndex = (int)ResourceManager.IconContent.ConditionVeryTired; else if ( cond < 30 ) label.ImageIndex = (int)ResourceManager.IconContent.ConditionTired; else label.ImageIndex = (int)ResourceManager.IconContent.ConditionLittleTired; tooltip.SetToolTip( label, string.Format( "回復目安日時: {0}", DateTimeHelper.TimeToCSVString( timer ) ) ); return FleetStates.Tired; } else if ( cond >= 50 ) { //戦意高揚 label.Text = "戦意高揚!"; label.ImageIndex = (int)ResourceManager.IconContent.ConditionSparkle; tooltip.SetToolTip( label, string.Format( "最低cond: {0}\r\nあと {1} 回遠征可能", cond, Math.Ceiling( ( cond - 49 ) / 3.0 ) ) ); return FleetStates.Sparkled; } } //出撃可能! { label.Text = "出撃可能!"; label.ImageIndex = (int)ResourceManager.IconContent.FleetReady; return FleetStates.Ready; } }
/// <summary> /// ShipViewを指定したタブに切り替えます。 /// </summary> private void ChangeShipView( ImageLabel target ) { if ( target == null ) return; int groupID = (int)target.Tag; var group = KCDatabase.Instance.ShipGroup[groupID]; if ( group == null ) { Utility.Logger.Add( 3, "エラー:存在しないグループを参照しようとしました。開発者に連絡してください" ); return; } if ( SelectedTab != null ) SelectedTab.BackColor = TabInactiveColor; SelectedTab = target; BuildShipView( SelectedTab ); SelectedTab.BackColor = TabActiveColor; }
private ImageLabel InitializeImageLabel() { var label = new ImageLabel(); label.Anchor = AnchorStyles.Left; label.ForeColor = Parent.MainFontColor; label.ImageAlign = ContentAlignment.MiddleCenter; label.Padding = new Padding( 0, 1, 0, 1 ); label.Margin = new Padding( 4, 0, 4, 0 ); label.MaximumSize = new Size( 60, 20 ); label.AutoEllipsis = true; label.AutoSize = true; return label; }
public TableEnemyCandidateControl( FormCompass parent ) { #region Initialize Parent = parent; ToolTipInfo = parent.ToolTipInfo; ShipNames = new ImageLabel[6]; for ( int i = 0; i < ShipNames.Length; i++ ) { ShipNames[i] = InitializeImageLabel(); ShipNames[i].Cursor = Cursors.Help; ShipNames[i].MouseClick += TableEnemyCandidateControl_MouseClick; } Formation = InitializeImageLabel(); Formation.Anchor = AnchorStyles.None; /* Formation.ImageAlign = ContentAlignment.MiddleLeft; Formation.ImageList = ResourceManager.Instance.Icons; Formation.ImageIndex = -1; */ AirSuperiority = InitializeImageLabel(); AirSuperiority.Anchor = AnchorStyles.Right; AirSuperiority.ImageAlign = ContentAlignment.MiddleLeft; AirSuperiority.ImageList = ResourceManager.Instance.Equipments; AirSuperiority.ImageIndex = (int)ResourceManager.EquipmentContent.CarrierBasedFighter; ConfigurationChanged(); #endregion }
/// <summary> /// グループデータにGUIからの操作を適用します。 /// </summary> private void ApplyGroupData( ImageLabel target ) { if ( target != null ) { //ソート順の保持 if ( KCDatabase.Instance.Ships.Count == 0 ) return; ShipGroupData g = KCDatabase.Instance.ShipGroup[(int)target.Tag]; if ( g == null ) return; g.Members.Clear(); g.Members.Capacity = ShipView.Rows.GetRowCount( DataGridViewElementStates.None ); foreach ( DataGridViewRow row in ShipView.Rows ) { g.Members.Add( (int)row.Cells[ShipView_ID.Index].Value ); } g.ColumnFilter = ShipView.Columns.OfType<DataGridViewColumn>().Select( c => c.Visible ).ToList(); g.ColumnWidth = ShipView.Columns.OfType<DataGridViewColumn>().Select( c => c.Width ).ToList(); g.ColumnAutoSize = MenuMember_ColumnAutoSize.Checked; g.LockShipNameScroll = MenuMember_LockShipNameScroll.Checked; } }
/// <summary> /// 艦隊の状態の情報をラベルに適用します。 /// </summary> /// <param name="fleet">艦隊データ。</param> /// <param name="label">適用するラベル。</param> /// <param name="tooltip">適用するツールチップ。</param> /// <param name="prevstate">前回の状態。</param> /// <param name="timer">日時。</param> /// <returns>艦隊の状態を表す定数。</returns> public static FleetStates UpdateFleetState( FleetData fleet, ImageLabel label, ToolTip tooltip, FleetStates prevstate, ref DateTime timer ) { KCDatabase db = KCDatabase.Instance; //初期化 tooltip.SetToolTip( label, null ); label.BackColor = Color.Transparent; //所属艦なし if ( fleet == null || fleet.Members.Count( id => id != -1 ) == 0 ) { label.Text = FleetRes.NoShips; label.ImageIndex = (int)ResourceManager.IconContent.FleetNoShip; return FleetStates.NoShip; } { //入渠中 long ntime = db.Docks.Values.Max( dock => { if ( dock.State == 1 && fleet.Members.Count( ( id => id == dock.ShipID ) ) > 0 ) return dock.CompletionTime.Ticks; else return 0; } ); if ( ntime > 0 ) { //入渠中 timer = new DateTime( ntime ); label.Text = FleetRes.Docking + DateTimeHelper.ToTimeRemainString( timer ); label.ImageIndex = (int)ResourceManager.IconContent.FleetDocking; tooltip.SetToolTip( label, FleetRes.CompletionTime + DateTimeHelper.TimeToCSVString( timer ) ); return FleetStates.Docking; } } if ( fleet.IsInSortie ) { //大破出撃中 if ( fleet.MembersInstance.Count( s => ( s != null && !fleet.EscapedShipList.Contains( s.MasterID ) && (double)s.HPCurrent / s.HPMax <= 0.25 ) ) > 0 ) { label.Text = FleetRes.CriticalDamageAdvance; label.ImageIndex = (int)ResourceManager.IconContent.FleetSortieDamaged; return FleetStates.SortieDamaged; } else { //出撃中 label.Text = FleetRes.OnSortie; label.ImageIndex = (int)ResourceManager.IconContent.FleetSortie; return FleetStates.Sortie; } } //遠征中 if ( fleet.ExpeditionState != 0 ) { timer = fleet.ExpeditionTime; label.Text = FleetRes.OnExped + DateTimeHelper.ToTimeRemainString( timer ); label.ImageIndex = (int)ResourceManager.IconContent.FleetExpedition; tooltip.SetToolTip( label, string.Format( "{0} : {1}\r\n" + FleetRes.CompletionTime + " {2}", KCDatabase.Instance.Mission[fleet.ExpeditionDestination].ID, KCDatabase.Instance.Mission[fleet.ExpeditionDestination].Name, DateTimeHelper.TimeToCSVString( timer ) ) ); return FleetStates.Expedition; } //大破艦あり if ( fleet.MembersInstance.Count( s => ( s != null && !fleet.EscapedShipList.Contains( s.MasterID ) && (double)s.HPCurrent / s.HPMax <= 0.25 ) ) > 0 ) { label.Text = FleetRes.CriticallyDamagedShip; label.ImageIndex = (int)ResourceManager.IconContent.FleetDamaged; //label.BackColor = Color.LightCoral; return FleetStates.Damaged; } //泊地修理中 { if ( fleet.CanAnchorageRepairing && fleet.MembersInstance.Take( 2 + KCDatabase.Instance.Ships[fleet[0]].SlotInstanceMaster.Count( eq => eq != null && eq.CategoryType == 31 ) ) .Any( s => s != null && s.HPRate < 1.0 && s.HPRate > 0.5 && s.RepairingDockID == -1 ) ) { label.Text = FleetRes.AnchorageRepairing + DateTimeHelper.ToTimeElapsedString( KCDatabase.Instance.Fleet.AnchorageRepairingTimer ); label.ImageIndex = (int)ResourceManager.IconContent.FleetAnchorageRepairing; StringBuilder sb = new StringBuilder(); sb.AppendFormat( FleetRes.StartTime, DateTimeHelper.TimeToCSVString( KCDatabase.Instance.Fleet.AnchorageRepairingTimer ) ); for ( int i = 0; i < fleet.Members.Count; i++ ) { var ship = fleet.MembersInstance[i]; if ( ship != null && ship.HPRate < 1.0 ) { var totaltime = DateTimeHelper.FromAPITimeSpan( ship.RepairTime ); var unittime = Calculator.CalculateDockingUnitTime( ship ); sb.AppendFormat( "#{0} : {1:00}:{2:00}:{3:00} @ {4:00}:{5:00}:{6:00} x -{7} HP\r\n", i + 1, (int)totaltime.TotalHours, totaltime.Minutes, totaltime.Seconds, (int)unittime.TotalHours, unittime.Minutes, unittime.Seconds, ship.HPMax - ship.HPCurrent ); } else { sb.Append( "#" ).Append( i + 1 ).Append( " : ----\r\n" ); } } tooltip.SetToolTip( label, sb.ToString() ); return FleetStates.AnchorageRepairing; } } //未補給 { int fuel = fleet.MembersInstance.Sum( ship => ship == null ? 0 : (int)( ( ship.FuelMax - ship.Fuel ) * ( ship.IsMarried ? 0.85 : 1.00 ) ) ); int ammo = fleet.MembersInstance.Sum( ship => ship == null ? 0 : (int)( ( ship.AmmoMax - ship.Ammo ) * ( ship.IsMarried ? 0.85 : 1.00 ) ) ); int aircraft = fleet.MembersInstance.Sum( ship => { if ( ship == null ) return 0; else { int c = 0; for ( int i = 0; i < ship.Slot.Count; i++ ) { c += ship.MasterShip.Aircraft[i] - ship.Aircraft[i]; } return c; } } ); int bauxite = aircraft * 5; if ( fuel > 0 || ammo > 0 || bauxite > 0 ) { label.Text = FleetRes.SupplyNeeded; label.ImageIndex = (int)ResourceManager.IconContent.FleetNotReplenished; tooltip.SetToolTip( label, string.Format( FleetRes.ResupplyTooltip, fuel, ammo, bauxite, aircraft ) ); return FleetStates.NotReplenished; } } //疲労 { int cond = fleet.MembersInstance.Min( s => s == null ? 100 : s.Condition ); if ( cond < Configuration.Config.Control.ConditionBorder && fleet.ConditionTime != null ) { timer = (DateTime)fleet.ConditionTime; label.Text = FleetRes.Fatigued + DateTimeHelper.ToTimeRemainString( timer ); if ( cond < 20 ) label.ImageIndex = (int)ResourceManager.IconContent.ConditionVeryTired; else if ( cond < 30 ) label.ImageIndex = (int)ResourceManager.IconContent.ConditionTired; else label.ImageIndex = (int)ResourceManager.IconContent.ConditionLittleTired; tooltip.SetToolTip( label, string.Format( FleetRes.EstimatedRecoveryTime + ": {0}", DateTimeHelper.TimeToCSVString( timer ) ) ); return FleetStates.Tired; } else if ( cond >= 50 ) { //戦意高揚 label.Text = FleetRes.FightingSpiritHigh; label.ImageIndex = (int)ResourceManager.IconContent.ConditionSparkle; tooltip.SetToolTip( label, string.Format( FleetRes.SparkledTooltip, cond, Math.Ceiling( ( cond - 49 ) / 3.0 ) ) ); return FleetStates.Sparkled; } } //出撃可能! { label.Text = FleetRes.ReadyToSortie; label.ImageIndex = (int)ResourceManager.IconContent.FleetReady; return FleetStates.Ready; } }
/// <summary> /// 指定したグループIDに基づいてタブ ラベルを生成します。 /// </summary> private ImageLabel CreateTabLabel( int id ) { ImageLabel label = new ImageLabel(); label.Text = KCDatabase.Instance.ShipGroup[id].Name; label.Anchor = AnchorStyles.Left; label.Font = ShipView.Font; label.BackColor = TabInactiveColor; label.BorderStyle = BorderStyle.FixedSingle; label.Padding = new Padding( 4, 4, 7, 7 ); label.Margin = new Padding( 0, 0, 0, 0 ); label.ImageAlign = ContentAlignment.MiddleCenter; label.AutoSize = true; label.Cursor = Cursors.Hand; //イベントと固有IDの追加(内部データとの紐付) label.Click += TabLabel_Click; label.MouseDown += TabLabel_MouseDown; label.MouseMove += TabLabel_MouseMove; label.MouseUp += TabLabel_MouseUp; label.ContextMenuStrip = MenuGroup; label.Tag = id; return label; }
/// <summary> /// 指定したタブのグループのShipViewを作成します。 /// </summary> /// <param name="target">作成するビューのグループデータ</param> private void BuildShipView( ImageLabel target ) { if ( target == null ) return; ShipGroupData group = KCDatabase.Instance.ShipGroup[(int)target.Tag]; IsRowsUpdating = true; ShipView.SuspendLayout(); UpdateMembers( group ); ShipView.Rows.Clear(); var ships = group.MembersInstance; var rows = new List<DataGridViewRow>( ships.Count() ); foreach ( ShipData ship in ships ) { if ( ship == null ) continue; DataGridViewRow row = CreateShipViewRow( ship ); rows.Add( row ); } for ( int i = 0; i < rows.Count; i++ ) rows[i].Tag = i; ShipView.Rows.AddRange( rows.ToArray() ); // 設定に抜けがあった場合補充 if ( group.ViewColumns == null ) { group.ViewColumns = new Dictionary<string, ShipGroupData.ViewColumnData>(); } if ( ShipView.Columns.Count != group.ViewColumns.Count ) { foreach ( DataGridViewColumn column in ShipView.Columns ) { if ( !group.ViewColumns.ContainsKey( column.Name ) ) { var newdata = new ShipGroupData.ViewColumnData( column ); newdata.Visible = true; //初期状態でインビジだと不都合なので group.ViewColumns.Add( newdata.Name, newdata ); } } } ApplyViewData( group ); ApplyAutoSort( group ); ShipView.ResumeLayout(); IsRowsUpdating = false; //status bar if ( KCDatabase.Instance.Ships.Count > 0 ) { Status_ShipCount.Text = string.Format( "所属: {0}隻", group.Members.Count ); Status_LevelTotal.Text = string.Format( "合計Lv: {0}", group.MembersInstance.Where( s => s != null ).Sum( s => s.Level ) ); Status_LevelAverage.Text = string.Format( "平均Lv: {0:F2}", group.Members.Count > 0 ? group.MembersInstance.Where( s => s != null ).Average( s => s.Level ) : 0 ); } }
public TableMemberControl( FormFleet parent ) { #region Initialize Name = new ImageLabel(); Name.SuspendLayout(); Name.Text = "*nothing*"; Name.Anchor = AnchorStyles.Left; Name.TextAlign = ContentAlignment.MiddleLeft; Name.ImageAlign = ContentAlignment.MiddleCenter; Name.ForeColor = parent.MainFontColor; Name.Padding = new Padding( 0, 1, 0, 1 ); Name.Margin = new Padding( 2, 0, 2, 0 ); Name.AutoSize = true; //Name.AutoEllipsis = true; Name.Visible = false; Name.Cursor = Cursors.Help; Name.MouseDown += Name_MouseDown; Name.ResumeLayout(); Level = new ShipStatusLevel(); Level.SuspendLayout(); Level.Anchor = AnchorStyles.Left | AnchorStyles.Bottom; Level.Value = 0; Level.MaximumValue = ExpTable.ShipMaximumLevel; Level.ValueNext = 0; Level.MainFontColor = parent.MainFontColor; Level.SubFontColor = parent.SubFontColor; //Level.TextNext = "n."; Level.Padding = new Padding( 0, 0, 0, 0 ); Level.Margin = new Padding( 2, 0, 2, 1 ); Level.AutoSize = true; Level.Visible = false; Level.ResumeLayout(); HP = new ShipStatusHP(); HP.SuspendLayout(); HP.Anchor = AnchorStyles.Left; HP.Value = 0; HP.MaximumValue = 0; HP.MaximumDigit = 999; HP.UsePrevValue = false; HP.MainFontColor = parent.MainFontColor; HP.SubFontColor = parent.SubFontColor; HP.Padding = new Padding( 0, 0, 0, 0 ); HP.Margin = new Padding( 2, 1, 2, 2 ); HP.AutoSize = true; HP.Visible = false; HP.ResumeLayout(); Condition = new ImageLabel(); Condition.SuspendLayout(); Condition.Text = "*"; Condition.Anchor = AnchorStyles.Left | AnchorStyles.Right; Condition.ForeColor = parent.MainFontColor; Condition.TextAlign = ContentAlignment.BottomRight; Condition.ImageAlign = ContentAlignment.MiddleLeft; Condition.ImageList = ResourceManager.Instance.Icons; Condition.Padding = new Padding( 2, 2, 2, 2 ); Condition.Margin = new Padding( 2, 0, 2, 0 ); Condition.Size = new Size( 40, 20 ); Condition.AutoSize = true; Condition.Visible = false; Condition.ResumeLayout(); ShipResource = new ShipStatusResource( parent.ToolTipInfo ); ShipResource.SuspendLayout(); ShipResource.FuelCurrent = 0; ShipResource.FuelMax = 0; ShipResource.AmmoCurrent = 0; ShipResource.AmmoMax = 0; ShipResource.Anchor = AnchorStyles.Left; ShipResource.Padding = new Padding( 0, 2, 0, 1 ); ShipResource.Margin = new Padding( 2, 0, 2, 0 ); ShipResource.Size = new Size( 30, 20 ); ShipResource.AutoSize = false; ShipResource.Visible = false; ShipResource.ResumeLayout(); Equipments = new ShipStatusEquipment(); Equipments.SuspendLayout(); Equipments.Anchor = AnchorStyles.Left; Equipments.Padding = new Padding( 0, 2, 0, 1 ); Equipments.Margin = new Padding( 2, 0, 2, 0 ); Equipments.Size = new Size( 40, 20 ); Equipments.AutoSize = true; Equipments.Visible = false; Equipments.ResumeLayout(); ConfigurationChanged( parent ); ToolTipInfo = parent.ToolTipInfo; Parent = parent; #endregion }
private void MenuGroup_Delete_Click( object sender, EventArgs e ) { ImageLabel senderLabel = MenuGroup.SourceControl as ImageLabel; if ( senderLabel == null ) return; //想定外 ShipGroupData group = KCDatabase.Instance.ShipGroup[(int)senderLabel.Tag]; if ( group != null && group.GroupID >= 0 ) { if ( MessageBox.Show( string.Format( GeneralRes.DeleteGroup, group.Name ), Properties.Resources.Confirm, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2 ) == System.Windows.Forms.DialogResult.Yes ) { if ( SelectedTab == senderLabel ) { ShipView.Rows.Clear(); SelectedTab = null; } KCDatabase.Instance.ShipGroup.ShipGroups.Remove( group ); TabPanel.Controls.Remove( senderLabel ); senderLabel.Dispose(); } } else { MessageBox.Show( GeneralRes.CannotDeleteGroup, Properties.Resources.Error, MessageBoxButtons.OK, MessageBoxIcon.Exclamation ); } }
/// <summary> /// ShipViewを指定したタブに切り替えます。 /// </summary> private void ChangeShipView( ImageLabel target ) { if ( target == null ) return; int groupID = (int)target.Tag; var group = KCDatabase.Instance.ShipGroup[groupID]; ApplyGroupData( SelectedTab ); if ( group == null ) { Utility.Logger.Add( 3, GeneralRes.NonexistentGroup ); return; } if ( group.GroupID < 0 ) { group.Members = group.Members.Intersect( KCDatabase.Instance.Ships.Keys ).Union( KCDatabase.Instance.Ships.Keys ).Distinct().ToList(); } if ( SelectedTab != null ) SelectedTab.BackColor = TabInactiveColor; SelectedTab = target; // 艦これ起動前にタブを選択した場合はフラグを立てておく(APIUpdatedで使う) if ( KCDatabase.Instance.Ships.Count == 0 ) IsTabSelectedBeforeBoot = true; BuildShipView( SelectedTab ); SelectedTab.BackColor = TabActiveColor; }
/// <summary> /// 指定したタブのグループのShipViewを作成します。 /// </summary> /// <param name="target">作成するビューのグループデータ</param> private void BuildShipView( ImageLabel target ) { if ( target == null ) return; int groupID = (int)target.Tag; ShipGroupData group = KCDatabase.Instance.ShipGroup[groupID]; ShipView.SuspendLayout(); ShipView.Rows.Clear(); var ships = group.MembersInstance; var rows = new List<DataGridViewRow>( ships.Count() ); foreach ( ShipData ship in ships ) { if ( ship == null ) continue; DataGridViewRow row = CreateShipViewRow( ship ); rows.Add( row ); } for ( int i = 0; i < rows.Count; i++ ) rows[i].Tag = i; ShipView.Rows.AddRange( rows.ToArray() ); { int columnCount = ShipView.Columns.Count; if ( group.ColumnFilter != null ) columnCount = Math.Min( columnCount, group.ColumnFilter.Count ); if ( group.ColumnWidth != null ) columnCount = Math.Min( columnCount, group.ColumnWidth.Count ); for ( int i = 0; i < columnCount; i++ ) { ShipView.Columns[i].Visible = group.ColumnFilter[i]; ShipView.Columns[i].Width = group.ColumnWidth[i]; } } SetColumnAutoSize( group.ColumnAutoSize ); SetLockShipNameScroll( group.LockShipNameScroll ); ShipView.ResumeLayout(); //status bar if ( KCDatabase.Instance.Ships.Count > 0 ) { Status_ShipCount.Text = string.Format( GeneralRes.AssignedCount, group.Members.Count ); Status_LevelTotal.Text = string.Format( GeneralRes.TotalLevel, group.MembersInstance.Where( s => s != null ).Sum( s => s.Level ) ); Status_LevelAverage.Text = string.Format( GeneralRes.AverageLevel, group.Members.Count > 0 ? group.MembersInstance.Where( s => s != null ).Average( s => s.Level ) : 0 ); } }
private void SetParameterText( ImageLabel label, int value ) { if ( value > 0 ) { label.ForeColor = SystemColors.ControlText; label.Text = "+" + value.ToString(); } else if ( value == 0 ) { label.ForeColor = Color.Silver; label.Text = "0"; } else { label.ForeColor = Color.Red; label.Text = value.ToString(); } }
/// <summary> /// 艦隊の状態の情報をラベルに適用します。 /// </summary> /// <param name="fleet">艦隊データ。</param> /// <param name="label">適用するラベル。</param> /// <param name="tooltip">適用するツールチップ。</param> /// <param name="prevstate">前回の状態。</param> /// <param name="timer">日時。</param> /// <returns>艦隊の状態を表す定数。</returns> public static FleetStates UpdateFleetState( FleetData fleet, ImageLabel label, ToolTip tooltip, FleetStates prevstate, ref DateTime timer ) { KCDatabase db = KCDatabase.Instance; //初期化 tooltip.SetToolTip( label, null ); label.BackColor = Color.Transparent; //所属艦なし if ( fleet == null || fleet.Members.Count( id => id != -1 ) == 0 ) { label.Text = "所属艦なし"; label.ImageIndex = (int)ResourceManager.IconContent.FleetNoShip; return FleetStates.NoShip; } // その他の状態は設定した順番に判定 foreach ( var key in Configuration.Config.FormFleetPlus.FleetIconOrder.List ) { var result = fleetStateFuncs[(int)key]( fleet, label, tooltip, prevstate ); if (result != null ) { if ( result.Item2 != null ) { timer = result.Item2.Value; } return result.Item1; } } //出撃可能! { label.Text = "出撃可能!"; label.ImageIndex = (int)ResourceManager.IconContent.FleetReady; return FleetStates.Ready; } }
/// <summary> /// ShipViewを指定したタブに切り替えます。 /// </summary> private void ChangeShipView( ImageLabel target ) { if ( target == null ) return; var group = KCDatabase.Instance.ShipGroup[(int)target.Tag]; var currentGroup = CurrentGroup; int headIndex = 0; List<int> selectedIDList = new List<int>(); if ( group == null ) { Utility.Logger.Add( 3, "エラー:存在しないグループを参照しようとしました。開発者に連絡してください" ); return; } if ( currentGroup != null ) { UpdateMembers( currentGroup ); if ( CurrentGroup.GroupID != group.GroupID ) { ShipView.Rows.Clear(); //別グループの行の並び順を引き継がせないようにする } else { headIndex = ShipView.FirstDisplayedScrollingRowIndex; selectedIDList = ShipView.SelectedRows.Cast<DataGridViewRow>().Select( r => (int)r.Cells[ShipView_ID.Index].Value ).ToList(); } } if ( SelectedTab != null ) SelectedTab.BackColor = TabInactiveColor; SelectedTab = target; BuildShipView( SelectedTab ); SelectedTab.BackColor = TabActiveColor; if ( 0 <= headIndex && headIndex < ShipView.Rows.Count ) ShipView.FirstDisplayedScrollingRowIndex = headIndex; if ( selectedIDList.Count > 0 ) { ShipView.ClearSelection(); for ( int i = 0; i < ShipView.Rows.Count; i++ ) { var row = ShipView.Rows[i]; if ( selectedIDList.Contains( (int)row.Cells[ShipView_ID.Index].Value ) ) { row.Selected = true; } } } }
/// <summary> /// 艦隊の状態の情報をもとにラベルを更新します。 /// </summary> /// <param name="label">更新するラベル。</param> /// <param name="state">艦隊の状態。</param> /// <param name="timer">日時。</param> public static void RefreshFleetState( ImageLabel label, FleetStates state, DateTime timer ) { switch ( state ) { case FleetStates.Damaged: case FleetStates.SortieDamaged: label.BackColor = DateTime.Now.Second % 2 == 0 ? Color.LightCoral : Color.Transparent; break; case FleetStates.Docking: label.Text = "入渠中 " + DateTimeHelper.ToTimeRemainString( timer ); if ( Utility.Configuration.Config.FormFleet.BlinkAtCompletion && ( timer - DateTime.Now ).TotalMilliseconds <= Utility.Configuration.Config.NotifierRepair.AccelInterval ) label.BackColor = DateTime.Now.Second % 2 == 0 ? Color.LightGreen : Color.Transparent; break; case FleetStates.Expedition: label.Text = "遠征中 " + DateTimeHelper.ToTimeRemainString( timer ); if ( Utility.Configuration.Config.FormFleet.BlinkAtCompletion && ( timer - DateTime.Now ).TotalMilliseconds <= Utility.Configuration.Config.NotifierExpedition.AccelInterval ) label.BackColor = DateTime.Now.Second % 2 == 0 ? Color.LightGreen : Color.Transparent; break; case FleetStates.Tired: label.Text = "疲労 " + DateTimeHelper.ToTimeRemainString( timer ); if ( Utility.Configuration.Config.FormFleet.BlinkAtCompletion && ( timer - DateTime.Now ).TotalMilliseconds <= 0 ) label.BackColor = DateTime.Now.Second % 2 == 0 ? Color.LightGreen : Color.Transparent; break; case FleetStates.AnchorageRepairing: label.Text = "泊地修理中 " + DateTimeHelper.ToTimeElapsedString( KCDatabase.Instance.Fleet.AnchorageRepairingTimer ); break; } }
/// <summary> /// ShipViewを指定したタブに切り替えます。 /// </summary> private void ChangeShipView( ImageLabel target ) { if ( target == null ) return; var group = KCDatabase.Instance.ShipGroup[(int)target.Tag]; var currentGroup = CurrentGroup; if ( group == null ) { Utility.Logger.Add( 3, "エラー:存在しないグループを参照しようとしました。開発者に連絡してください" ); return; } if ( currentGroup != null ) { UpdateMembers( currentGroup ); if ( CurrentGroup.GroupID != group.GroupID ) ShipView.Rows.Clear(); //別グループの行の並び順を引き継がせないようにする } if ( SelectedTab != null ) SelectedTab.BackColor = TabInactiveColor; SelectedTab = target; BuildShipView( SelectedTab ); SelectedTab.BackColor = TabActiveColor; }
/// <summary> /// 艦隊の状態の情報をもとにラベルを更新します。 /// </summary> /// <param name="label">更新するラベル。</param> /// <param name="state">艦隊の状態。</param> /// <param name="timer">日時。</param> public static void RefreshFleetState( ImageLabel label, FleetStates state, DateTime timer ) { switch ( state ) { case FleetStates.Damaged: case FleetStates.SortieDamaged: label.BackColor = DateTime.Now.Second % 2 == 0 ? Color.LightCoral : Color.Transparent; break; case FleetStates.Docking: label.Text = FleetRes.Docking + DateTimeHelper.ToTimeRemainString( timer ); break; case FleetStates.Expedition: label.Text = FleetRes.OnExped + DateTimeHelper.ToTimeRemainString( timer ); break; case FleetStates.Tired: label.Text = FleetRes.Fatigued + DateTimeHelper.ToTimeRemainString( timer ); break; case FleetStates.AnchorageRepairing: label.Text = FleetRes.AnchorageRepairing + DateTimeHelper.ToTimeElapsedString( KCDatabase.Instance.Fleet.AnchorageRepairingTimer ); break; } }
private void MenuGroup_Delete_Click( object sender, EventArgs e ) { ImageLabel senderLabel = MenuGroup.SourceControl as ImageLabel; if ( senderLabel == null ) return; //想定外 ShipGroupData group = KCDatabase.Instance.ShipGroup[(int)senderLabel.Tag]; if ( group != null ) { if ( MessageBox.Show( string.Format( "グループ [{0}] を削除しますか?\r\nこの操作は元に戻せません。", group.Name ), "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2 ) == System.Windows.Forms.DialogResult.Yes ) { if ( SelectedTab == senderLabel ) { ShipView.Rows.Clear(); SelectedTab = null; } KCDatabase.Instance.ShipGroup.ShipGroups.Remove( group ); TabPanel.Controls.Remove( senderLabel ); senderLabel.Dispose(); } } else { MessageBox.Show( "このグループは削除できません。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Exclamation ); } }
/// <summary> /// 艦隊の状態の情報をラベルに適用します。 /// </summary> /// <param name="fleet">艦隊データ。</param> /// <param name="label">適用するラベル。</param> /// <param name="tooltip">適用するツールチップ。</param> /// <param name="prevstate">前回の状態。</param> /// <param name="timer">日時。</param> /// <returns>艦隊の状態を表す定数。</returns> public static FleetStates UpdateFleetState( FleetData fleet, ImageLabel label, ToolTip tooltip, FleetStates prevstate, ref DateTime timer ) { KCDatabase db = KCDatabase.Instance; //初期化 tooltip.SetToolTip( label, null ); label.BackColor = Color.Transparent; //所属艦なし if ( fleet == null || fleet.Members.Count( id => id != -1 ) == 0 ) { label.Text = FleetRes.NoShips; label.ImageIndex = (int)ResourceManager.IconContent.FleetNoShip; return FleetStates.NoShip; } { //入渠中 long ntime = db.Docks.Values.Max( dock => { if ( dock.State == 1 && fleet.Members.Count( ( id => id == dock.ShipID ) ) > 0 ) return dock.CompletionTime.Ticks; else return 0; } ); if ( ntime > 0 ) { //入渠中 timer = new DateTime( ntime ); label.Text = FleetRes.Docking + DateTimeHelper.ToTimeRemainString( timer ); label.ImageIndex = (int)ResourceManager.IconContent.FleetDocking; tooltip.SetToolTip( label, FleetRes.CompletionTime + ": " + timer ); return FleetStates.Docking; } } if ( fleet.IsInSortie ) { //大破出撃中 if ( fleet.MembersInstance.Count( s => ( s != null && !fleet.EscapedShipList.Contains( s.MasterID ) && (double)s.HPCurrent / s.HPMax <= 0.25 ) ) > 0 ) { label.Text = FleetRes.CriticalDamageAdvance; label.ImageIndex = (int)ResourceManager.IconContent.FleetSortieDamaged; return FleetStates.SortieDamaged; } else { //出撃中 label.Text = FleetRes.OnSortie; label.ImageIndex = (int)ResourceManager.IconContent.FleetSortie; return FleetStates.Sortie; } } //遠征中 if ( fleet.ExpeditionState != 0 ) { timer = fleet.ExpeditionTime; label.Text = FleetRes.OnExped + DateTimeHelper.ToTimeRemainString( timer ); label.ImageIndex = (int)ResourceManager.IconContent.FleetExpedition; tooltip.SetToolTip( label, string.Format( "{0} : {1}\r\n" + FleetRes.CompletionTime + " : {2}", KCDatabase.Instance.Mission[fleet.ExpeditionDestination].ID, KCDatabase.Instance.Mission[fleet.ExpeditionDestination].Name, timer ) ); return FleetStates.Expedition; } //大破艦あり if ( fleet.MembersInstance.Count( s => ( s != null && !fleet.EscapedShipList.Contains( s.MasterID ) && (double)s.HPCurrent / s.HPMax <= 0.25 ) ) > 0 ) { label.Text = FleetRes.CriticallyDamagedShip; label.ImageIndex = (int)ResourceManager.IconContent.FleetDamaged; //label.BackColor = Color.LightCoral; return FleetStates.Damaged; } //泊地修理中 { if ( fleet.IsAnchorageRepairing ) { label.Text = FleetRes.AnchorageRepairing + DateTimeHelper.ToTimeElapsedString( KCDatabase.Instance.Fleet.AnchorageRepairingTimer ); label.ImageIndex = (int)ResourceManager.IconContent.FleetAnchorageRepairing; tooltip.SetToolTip( label, string.Format( FleetRes.StartTime + ": {0}", KCDatabase.Instance.Fleet.AnchorageRepairingTimer ) ); return FleetStates.AnchorageRepairing; } } //未補給 { int fuel = fleet.MembersInstance.Sum( ship => ship == null ? 0 : (int)( ( ship.MasterShip.Fuel - ship.Fuel ) * ( ship.IsMarried ? 0.85 : 1.00 ) ) ); int ammo = fleet.MembersInstance.Sum( ship => ship == null ? 0 : (int)( ( ship.MasterShip.Ammo - ship.Ammo ) * ( ship.IsMarried ? 0.85 : 1.00 ) ) ); int aircraft = fleet.MembersInstance.Sum( ship => { if ( ship == null ) return 0; else { int c = 0; for ( int i = 0; i < ship.Slot.Count; i++ ) { c += ship.MasterShip.Aircraft[i] - ship.Aircraft[i]; } return c; } } ); int bauxite = aircraft * 5; if ( fuel > 0 || ammo > 0 || bauxite > 0 ) { label.Text = FleetRes.SupplyNeeded; label.ImageIndex = (int)ResourceManager.IconContent.FleetNotReplenished; tooltip.SetToolTip( label, string.Format( FleetRes.ResupplyTooltip, fuel, ammo, bauxite, aircraft ) ); return FleetStates.NotReplenished; } } //疲労 { int cond = fleet.MembersInstance.Min( s => s == null ? 100 : s.Condition ); if ( cond < Configuration.Config.Control.ConditionBorder && fleet.ConditionTime != null ) { timer = (DateTime)fleet.ConditionTime; label.Text = FleetRes.Fatigued + DateTimeHelper.ToTimeRemainString( timer ); if ( cond < 20 ) label.ImageIndex = (int)ResourceManager.IconContent.ConditionVeryTired; else if ( cond < 30 ) label.ImageIndex = (int)ResourceManager.IconContent.ConditionTired; else label.ImageIndex = (int)ResourceManager.IconContent.ConditionLittleTired; tooltip.SetToolTip( label, string.Format( FleetRes.EstimatedRecoveryTime + ": {0}", timer ) ); return FleetStates.Tired; } else if ( cond >= 50 ) { //戦意高揚 label.Text = FleetRes.FightingSpiritHigh; label.ImageIndex = (int)ResourceManager.IconContent.ConditionSparkle; tooltip.SetToolTip( label, string.Format( FleetRes.SparkledTooltip, cond, Math.Ceiling( ( cond - 49 ) / 3.0 ) ) ); return FleetStates.Sparkled; } } //出撃可能! { label.Text = FleetRes.ReadyToSortie; label.ImageIndex = (int)ResourceManager.IconContent.FleetReady; return FleetStates.Ready; } }