/// <summary> /// The render method to draw this widget on the screen. /// /// Called on the GUI thread. /// </summary> /// <param name="drawArgs">The drawing arguments passed from the WW GUI thread.</param> public void Render(DrawArgs drawArgs) { if (!this.m_isInitialized) { this.Initialize(drawArgs); } if ((m_visible) && (m_enabled)) { // Draw the interior background JHU_Utilities.DrawBox( this.AbsoluteLocation.X, this.AbsoluteLocation.Y, m_size.Width, m_size.Height, 0.0f, m_BackgroundColor.ToArgb(), drawArgs.device); m_sprite.Begin(SpriteFlags.AlphaBlend); m_sprite.Transform = Matrix.Scaling(this.XScale, this.YScale, 0); m_sprite.Transform *= Matrix.Translation(AbsoluteLocation.X + m_size.Width / 2, AbsoluteLocation.Y + m_size.Height / 2, 0); m_sprite.Draw(m_iconTexture.Texture, new Vector3(m_iconTexture.Width >> 1, m_iconTexture.Height >> 1, 0), Vector3.Empty, m_normalColor); m_sprite.Transform = Matrix.Identity; m_sprite.End(); UpdateCrosshair(drawArgs); } }
public string DMS() { StringBuilder retStr = new StringBuilder(); retStr.AppendFormat("Lat: {0}", JHU_Utilities.Degrees2DMS(this.Latitude, 'N', 'S')); retStr.AppendFormat(" Lon: {0}", JHU_Utilities.Degrees2DMS(this.Longitude, 'E', 'W')); retStr.AppendFormat(" Alt: {0:F0}", this.Altitude); return(retStr.ToString()); }
/// <summary> /// The render method to draw this widget on the screen. /// /// Called on the GUI thread. /// </summary> /// <param name="drawArgs">The drawing arguments passed from the WW GUI thread.</param> public void Render(DrawArgs drawArgs) { if ((!m_visible) || (!m_enabled)) { return; } if (!m_isInitialized) { Initialize(drawArgs); } int widgetTop = this.Top; int widgetBottom = this.Bottom; int widgetLeft = this.Left; int widgetRight = this.Right; m_currHeaderHeight = 0; #region Header Rendering // If we should render the header if (HeaderEnabled) { m_currHeaderHeight = m_headerHeight; JHU_Utilities.DrawBox( this.AbsoluteLocation.X, this.AbsoluteLocation.Y, m_size.Width, m_currHeaderHeight, 0.0f, m_HeaderColor.ToArgb(), drawArgs.device); Rectangle nameBounds = m_TitleFont.MeasureString( null, m_name, DrawTextFormat.None, 0); int widthLeft = m_size.Width; m_TitleFont.DrawText( null, m_name, new System.Drawing.Rectangle(this.AbsoluteLocation.X + 2, this.AbsoluteLocation.Y + 2, widthLeft, m_currHeaderHeight), DrawTextFormat.None, m_TextColor.ToArgb()); // if we don't render the body add whatever is in the text field as annotation if (!m_renderBody) { widthLeft -= nameBounds.Width + 10; if (widthLeft > 20) { m_TextFont.DrawText( null, Text, new System.Drawing.Rectangle(this.AbsoluteLocation.X + 10 + nameBounds.Width, this.AbsoluteLocation.Y + 3, widthLeft, m_currHeaderHeight), DrawTextFormat.None, m_TextColor.ToArgb()); } } // Render border m_OutlineVertsHeader[0].X = AbsoluteLocation.X; m_OutlineVertsHeader[0].Y = AbsoluteLocation.Y; m_OutlineVertsHeader[1].X = AbsoluteLocation.X + m_size.Width; m_OutlineVertsHeader[1].Y = AbsoluteLocation.Y; m_OutlineVertsHeader[2].X = AbsoluteLocation.X + m_size.Width; m_OutlineVertsHeader[2].Y = AbsoluteLocation.Y + m_currHeaderHeight; m_OutlineVertsHeader[3].X = AbsoluteLocation.X; m_OutlineVertsHeader[3].Y = AbsoluteLocation.Y + m_currHeaderHeight; m_OutlineVertsHeader[4].X = AbsoluteLocation.X; m_OutlineVertsHeader[4].Y = AbsoluteLocation.Y; JHU_Utilities.DrawLine(m_OutlineVertsHeader, m_BorderColor.ToArgb(), drawArgs.device); } #endregion #region Body Rendering if (m_renderBody) { // Draw the interior background JHU_Utilities.DrawBox( this.AbsoluteLocation.X, this.AbsoluteLocation.Y + m_currHeaderHeight, m_size.Width, m_size.Height - m_currHeaderHeight, 0.0f, m_BackgroundColor.ToArgb(), drawArgs.device); int childrenHeight = 0; int childrenWidth = 0; int bodyHeight = m_size.Height - m_currHeaderHeight; int bodyWidth = m_size.Width; getChildrenSize(out childrenHeight, out childrenWidth); // Render each child widget int bodyLeft = this.BodyLocation.X; int bodyRight = this.BodyLocation.X + this.ClientSize.Width; int bodyTop = this.BodyLocation.Y; int bodyBottom = this.BodyLocation.Y + this.ClientSize.Height; int childLeft = 0; int childRight = 0; int childTop = 0; int childBottom = 0; for (int index = m_ChildWidgets.Count - 1; index >= 0; index--) { jhuapl.util.IWidget currentChildWidget = m_ChildWidgets[index] as jhuapl.util.IWidget; if (currentChildWidget != null) { if (currentChildWidget.ParentWidget == null || currentChildWidget.ParentWidget != this) { currentChildWidget.ParentWidget = this; } System.Drawing.Point childLocation = currentChildWidget.AbsoluteLocation; // if any portion is visible try to render childLeft = childLocation.X; childRight = childLocation.X + currentChildWidget.WidgetSize.Width; childTop = childLocation.Y; childBottom = childLocation.Y + currentChildWidget.WidgetSize.Height; if ((((childLeft >= bodyLeft) && (childLeft <= bodyRight)) || ((childRight >= bodyLeft) && (childRight <= bodyRight)) || ((childLeft <= bodyLeft) && (childRight >= bodyRight))) && (((childTop >= bodyTop) && (childTop <= bodyBottom)) || ((childBottom >= bodyTop) && (childBottom <= bodyBottom)) || ((childTop <= bodyTop) && (childBottom >= bodyBottom))) ) { currentChildWidget.Visible = true; currentChildWidget.Render(drawArgs); } else { currentChildWidget.Visible = false; } } } m_OutlineVerts[0].X = AbsoluteLocation.X; m_OutlineVerts[0].Y = AbsoluteLocation.Y + m_currHeaderHeight; m_OutlineVerts[1].X = AbsoluteLocation.X + m_size.Width; m_OutlineVerts[1].Y = AbsoluteLocation.Y + m_currHeaderHeight; m_OutlineVerts[2].X = AbsoluteLocation.X + m_size.Width; m_OutlineVerts[2].Y = AbsoluteLocation.Y + m_size.Height; m_OutlineVerts[3].X = AbsoluteLocation.X; m_OutlineVerts[3].Y = AbsoluteLocation.Y + m_size.Height; m_OutlineVerts[4].X = AbsoluteLocation.X; m_OutlineVerts[4].Y = AbsoluteLocation.Y + m_currHeaderHeight; JHU_Utilities.DrawLine(m_OutlineVerts, m_BorderColor.ToArgb(), drawArgs.device); } #endregion }
/// <summary> /// Specialized render for tree nodes /// </summary> /// <param name="drawArgs"></param> /// <param name="xOffset">The offset from the left based on how deep this node is nested</param> /// <param name="yOffset">The offset from the top based on how many treenodes are above this one</param> /// <returns>Total pixels consumed by this widget and its children</returns> public override int Render(DrawArgs drawArgs, int xOffset, int yOffset) { m_ConsumedSize.Height = 0; if (m_visible) { if (!m_isInitialized) { this.Initialize(drawArgs); } m_ConsumedSize.Height = NODE_HEIGHT; // This value is dynamic based on the number of expanded nodes above this one m_location.Y = yOffset; // store this value so the mouse events can figure out where the buttons are m_xOffset = xOffset; // compute the color int color = this.Enabled ? m_itemOnColor : m_itemOffColor; // create the bounds of the text draw area Rectangle bounds = new Rectangle(this.AbsoluteLocation, new System.Drawing.Size(this.ClientSize.Width, NODE_HEIGHT)); if (m_isMouseOver) { if (!Enabled) { color = m_mouseOverOffColor; } JHU_Utilities.DrawBox( bounds.X, bounds.Y, bounds.Width, bounds.Height, 0.0f, m_mouseOverColor, drawArgs.device); } #region Draw arrow bounds.X = this.AbsoluteLocation.X + xOffset; bounds.Width = NODE_ARROW_SIZE; // draw arrow if any children if (m_subNodes.Count > 0) { m_worldwinddingsFont.DrawText( null, (this.m_isExpanded ? "L" : "A"), bounds, DrawTextFormat.None, color); } #endregion Draw arrow #region Draw checkbox bounds.Width = NODE_CHECKBOX_SIZE; bounds.X += NODE_ARROW_SIZE; // Normal check symbol string checkSymbol; if (m_isRadioButton) { checkSymbol = this.IsChecked ? "O" : "P"; } else { checkSymbol = this.IsChecked ? "N" : "F"; } m_worldwinddingsFont.DrawText( null, checkSymbol, bounds, DrawTextFormat.NoClip, color); #endregion draw checkbox #region Draw name // compute the length based on name length // TODO: Do this only when the name changes Rectangle stringBounds = drawArgs.defaultDrawingFont.MeasureString(null, Name, DrawTextFormat.NoClip, 0); m_size.Width = NODE_ARROW_SIZE + NODE_CHECKBOX_SIZE + 5 + stringBounds.Width; m_ConsumedSize.Width = m_size.Width; bounds.Y += 2; bounds.X += NODE_CHECKBOX_SIZE + 5; bounds.Width = stringBounds.Width; drawArgs.defaultDrawingFont.DrawText( null, Name, bounds, DrawTextFormat.None, color); #endregion Draw name if (m_isExpanded) { int newXOffset = xOffset + NODE_INDENT; for (int i = 0; i < m_subNodes.Count; i++) { if (m_subNodes[i] is JHU_TreeNodeWidget) { m_ConsumedSize.Height += ((JHU_TreeNodeWidget)m_subNodes[i]).Render(drawArgs, newXOffset, m_ConsumedSize.Height); } else { System.Drawing.Point newLocation = m_subNodes[i].Location; newLocation.Y = m_ConsumedSize.Height; newLocation.X = newXOffset; m_ConsumedSize.Height += m_subNodes[i].WidgetSize.Height; m_subNodes[i].Location = newLocation; m_subNodes[i].Render(drawArgs); // render normal widgets as a stack of widgets } // if the child width is bigger than my width save it as the consumed width for widget size calculations if (m_subNodes[i].WidgetSize.Width + newXOffset > m_ConsumedSize.Width) { m_ConsumedSize.Width = m_subNodes[i].WidgetSize.Width + newXOffset; } } } } return(m_ConsumedSize.Height); }