public void DrawMenuPage(int pageIndex, bool showBorder, bool showOrnaments) { _gc.StartPage(); try { if (_pageBackgroundBrush != null) { _gc.DrawRectangle(0, 0, PageWidth, PageHeight, Brushes.Transparent, _pageBackgroundBrush, 1.0); } if (_fontFamily == null) { _fontFamily = new FontFamily("Arial"); } Typeface plainFont = new Typeface(_fontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal); Typeface boldFont = new Typeface(_fontFamily, FontStyles.Normal, FontWeights.Bold, FontStretches.Normal); if (_menu == null) { _gc.DrawText("No Menu", boldFont, 36.0, _themeColorBrush, 0, 75.0, true); return; } if (pageIndex < 0 || pageIndex >= _menuPages.Count) { _gc.DrawText($"Page {pageIndex + 1} does not exist", boldFont, 36.0, _themeColorBrush, 0, 75.0, true); return; } if (showBorder) { _gc.DrawRectangle(20, 20, PageWidth - 40, PageHeight - 40, _themeColorBrush, Brushes.Transparent, 4.0); _gc.DrawRectangle(30, 30, PageWidth - 60, PageHeight - 60, _themeColorBrush, Brushes.Transparent, 1.0); } if (showOrnaments) { _gc.DrawCurve(45, 52, 114, 18, 195, 105, 236, 48, _themeColorBrush, 2.0); _gc.DrawCurve(549, 52, 480, 18, 399, 105, 358, 48, _themeColorBrush, 2.0); _gc.DrawCurve(45, 782, 114, 748, 195, 835, 236, 778, _themeColorBrush, 2.0); _gc.DrawCurve(549, 782, 480, 748, 399, 835, 358, 778, _themeColorBrush, 2.0); } if (pageIndex == 0) { _gc.DrawText(_menu.Name, boldFont, 36.0, _themeColorBrush, 0, 75.0, true); _gc.DrawText(_menu.Description, plainFont, 15.0, Brushes.Black, 0, 115.0, true); } _menuPages[pageIndex].Draw(_gc, _plainFont, _boldFont, _themeColorBrush); } finally { _gc.EndPage(); } }
public override void Draw(IGraphicsContext gc) { if (_SelectionBand.Width > 0 || _SelectionBand.Height > 0) { if (_DrawDirection) { gc.Color = Color.LightGray; gc.DrawRectangle(_SelectionBand); gc.DrawLine(StartPoint, EndPoint, Color.LightGray, Color.DarkGray); gc.DrawTrianglePointer(StartPoint, EndPoint, 5, 5); } else { gc.Color = Color.Gray; gc.DrawRectangle(_SelectionBand); } } }
public override void Draw(IGraphicsContext gc) { if (_SelectionBand.Width > 0 || _SelectionBand.Height > 0) { if (_DrawDirection) { gc.Color = Color.LightGray; gc.DrawRectangle (_SelectionBand); gc.DrawLine (StartPoint, EndPoint, Color.LightGray, Color.DarkGray); gc.DrawTrianglePointer (StartPoint, EndPoint, 5, 5); } else { gc.Color = Color.Gray; gc.DrawRectangle (_SelectionBand); } } }
public void Render(IGraphicsContext context) { // Value range is the size between max and min track bar value. // Ex: Min = 50, Max = 150. Value range = 100 + 1 (because we include 50 and 100) _valueRange = (Maximum - Minimum) + 1; // Get track bar value relative to value range (value - minimum value). // Ex: Min = 50, Max = 150, Value = 100. Value relative to value range = 50. _valueRelativeToValueRange = Value - Minimum; // Draw background context.DrawRectangle(new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight), _brushBackground, _penTransparent); // Return if value range is zero if (_valueRange == 0) return; // Draw fader track float trackX = context.BoundsWidth / 2; float trackY = Margin; float trackY2 = context.BoundsHeight - Margin; // Draw shadow track context.DrawLine(new BasicPoint(trackX + 1, trackY + 1), new BasicPoint(trackX + 1, trackY2 + 1), new BasicPen(new BasicBrush(_centerLineShadowColor), 1)); // Draw track context.DrawLine(new BasicPoint(trackX, trackY), new BasicPoint(trackX, trackY2), new BasicPen(new BasicBrush(_centerLineColor), 1)); // Get the track height (remove margin from top and bottom) _trackHeight = context.BoundsHeight - (Margin * 2); // Get tick width float tickHeight = _trackHeight / _valueRange; // Get the percentage of the value relative to value range (needed to draw the fader). // We need to divide the value relative to value range to the value range to get the ratio. // Ex: Min = 50, Max = 150, Value = 100. Value relative to value range = 50. Value range = 100. Value ratio = 0.5 _valueRatio = (_valueRelativeToValueRange / _valueRange); // Calculate fader position // We need to invert the values (i.e. max is on top, min is bottom) //float valueY = (valueRatio * trackHeight) + Margin; float valueY = _trackHeight - (_valueRatio * _trackHeight) + Margin; float faderY = valueY + ((tickHeight - FaderHeight) / 2); float tickCenterY = valueY + (tickHeight / 2); // Create fader rectangle _rectFader = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2), faderY, FaderWidth, FaderHeight); // // Draw tick zone (for debug) // //RectangleF rectTickZone = new RectangleF(valueX, 0, tickWidth, Height); // //g.FillRectangle(Brushes.DarkGray, rectTickZone); var rectFaderShadowTop = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2) + 1, faderY + 1, FaderWidth, 8); var rectFaderShadowBottom = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2) + 1, faderY + FaderHeight - 8 + 1, FaderWidth, 8); var rectFaderShadowCenter = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2) + 1, faderY + 4 + 1, FaderWidth, FaderHeight - 8); context.DrawEllipsis(rectFaderShadowTop, _brushFaderShadowColor, _penTransparent); context.DrawEllipsis(rectFaderShadowBottom, _brushFaderShadowColor, _penTransparent); context.DrawRectangle(rectFaderShadowCenter, _brushFaderShadowColor, _penTransparent); // Draw fader outline (with 8px border) var rectFaderTop = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2), faderY, FaderWidth, 8); var rectFaderBottom = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2), faderY + FaderHeight - 8, FaderWidth, 8); var rectFaderBottomCenter = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2), faderY + FaderHeight - 10, FaderWidth, 6); var rectFaderCenter = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2), faderY + 4, FaderWidth, FaderHeight - 8); context.DrawEllipsis(rectFaderTop, _brushFaderGradient, _penTransparent); context.DrawEllipsis(rectFaderBottom, _brushFaderShadowColor1, _penTransparent); context.DrawRectangle(rectFaderCenter, _brushFaderColor2, _penTransparent); context.DrawRectangle(rectFaderBottomCenter, _brushFaderShadowColor1, _penTransparent); // Draw fader inside (with 4px border) var rectFaderInsideBottom = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2) + 1, faderY + FaderHeight - 8, FaderWidth - 2, 4); var rectFaderInsideBottomCenter = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2) + 1, faderY + FaderHeight - 12, FaderWidth - 2, FaderHeight - 24); var rectFaderInsideTop = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2) + 1, faderY + 4, FaderWidth - 2, 8); var rectFaderInsideTopCenter = new BasicRectangle((context.BoundsWidth / 2) - (FaderWidth / 2) + 1, faderY + 8, FaderWidth - 2, FaderHeight - 24); context.DrawEllipsis(rectFaderInsideTop, _brushFaderShadowColor1, _penTransparent); context.DrawEllipsis(rectFaderInsideTopCenter, _brushFaderShadowGradient, _penTransparent); context.DrawEllipsis(rectFaderInsideBottom, _brushFaderColor2, _penTransparent); context.DrawRectangle(rectFaderInsideBottomCenter, _brushFaderColor2, _penTransparent); context.DrawLine(new BasicPoint((context.BoundsWidth / 2) - (FaderWidth / 2), tickCenterY), new BasicPoint((context.BoundsWidth / 2) - (FaderWidth / 2) + FaderWidth, tickCenterY), _penMiddleLineColor); }
public void Render(IGraphicsContext context) { // Value range is the size between max and min track bar value. // Ex: Min = 50, Max = 150. Value range = 100 + 1 (because we include 50 and 100) _valueRange = (Maximum - Minimum) + 1; // Get track bar value relative to value range (value - minimum value). // Ex: Min = 50, Max = 150, Value = 100. Value relative to value range = 50. _valueRelativeToValueRange = Value - Minimum; // Draw background context.DrawRectangle(new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight), _brushBackground, _penTransparent); // Return if value range is zero if (_valueRange == 0) return; // Draw fader track float trackX = Margin; // add margin from left float trackX2 = context.BoundsWidth - Margin; // add margin from right float trackY = context.BoundsHeight / 2; // right in the center context.DrawLine(new BasicPoint(trackX + 1, trackY + 1), new BasicPoint(trackX2 + 1, trackY + 1), _penCenterLineShadow); context.DrawLine(new BasicPoint(trackX, trackY), new BasicPoint(trackX2, trackY), _penCenterLine); // Get the track width (remove margin from left and right) _trackWidth = context.BoundsWidth - (Margin * 2); // Get tick width float tickWidth = _trackWidth / _valueRange; // Get the percentage of the value relative to value range (needed to draw the fader). // We need to divide the value relative to value range to the value range to get the ratio. // Ex: Min = 50, Max = 150, Value = 100. Value relative to value range = 50. Value range = 100. Value ratio = 0.5 _valueRatio = (_valueRelativeToValueRange / _valueRange); // Get the value X coordinate by multiplying the value ratio to the track bar width (removed 3 pixels from left // and right). Add margin from left. float valueX = (_valueRatio * _trackWidth) + Margin; // this gives the LEFT x for our zone float faderX = valueX + ((tickWidth - FaderWidth) / 2); float tickCenterX = valueX + (tickWidth / 2); // Create fader rectangle _rectFader = new BasicRectangle(faderX, (context.BoundsHeight / 2) - (FaderHeight / 2), FaderWidth, FaderHeight); //// Draw tick zone (for debug) ////RectangleF rectTickZone = new RectangleF(valueX, 0, tickWidth, Height); ////g.FillRectangle(Brushes.DarkGray, rectTickZone); // Draw fader outline (with 8px border) //var rectFaderLeft = new BasicRectangle(faderX, (context.BoundsHeight / 2) - (FaderHeight / 2), 8, FaderHeight); //var rectFaderRight = new BasicRectangle(faderX + FaderWidth - 8, (context.BoundsHeight / 2) - (FaderHeight / 2), 8, FaderHeight); var rectFaderCenter = new BasicRectangle(faderX + 4, (context.BoundsHeight / 2) - (FaderHeight / 2), FaderWidth - 8, FaderHeight); //context.DrawEllipsis(rectFaderLeft, new BasicGradientBrush(_faderColor1, _faderColor, 90), new BasicPen()); //context.DrawEllipsis(rectFaderLeft, new BasicGradientBrush(new BasicColor(255, 0, 0), new BasicColor(0, 0, 255), 90), new BasicPen()); //context.DrawEllipsis(rectFaderRight, new BasicGradientBrush(_faderColor1, _faderColor, 90), new BasicPen()); //context.DrawEllipsis(rectFaderRight, new BasicGradientBrush(new BasicColor(0, 255, 0), new BasicColor(255, 0, 255), 90), new BasicPen()); context.DrawEllipsis(rectFaderCenter, _brushFaderColor2, _penShadowColor1); //context.DrawEllipsis(rectFaderCenter, new BasicBrush(_faderColor), new BasicPen()); // Draw fader inside (with 4px border) //var rectFaderInsideLeft = new BasicRectangle(faderX + 2, (context.BoundsHeight / 2) - (FaderHeight / 2) + 2, 4, FaderHeight - 4); //var rectFaderInsideRight = new BasicRectangle(faderX + FaderWidth - 6, (context.BoundsHeight / 2) - (FaderHeight / 2) + 2, 4, FaderHeight - 4); //context.DrawEllipsis(rectFaderInsideLeft, new BasicGradientBrush(_faderShadowColor, _faderShadowColor, 90), new BasicPen()); //context.DrawEllipsis(rectFaderInsideRight, new BasicGradientBrush(_faderShadowColor, _faderShadowColor, 90), new BasicPen()); context.DrawLine(new BasicPoint(tickCenterX, (context.BoundsHeight / 2) - (FaderHeight / 2)), new BasicPoint(tickCenterX, (context.BoundsHeight / 2) - (FaderHeight / 2) + FaderHeight), _penShadowColor1); }
public void Render(IGraphicsContext context) { Frame = new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight); var rectBackground = new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight); //context.DrawRectangle(rectBackground, _brushBackground, _penTransparent); const float padding = 2; const float checkPadding = padding + 4; var rectForeground = new BasicRectangle(padding, padding, context.BoundsWidth - (padding * 2), context.BoundsHeight - (padding * 2)); context.DrawRectangle(rectForeground, _brushTransparent, _penBorder); if (_value) { context.DrawLine(new BasicPoint(checkPadding, checkPadding), new BasicPoint(context.BoundsWidth - checkPadding, context.BoundsHeight - checkPadding), _penForeground); context.DrawLine(new BasicPoint(context.BoundsWidth - checkPadding, checkPadding), new BasicPoint(checkPadding, context.BoundsHeight - checkPadding), _penForeground); } }
private void DrawLoops(IGraphicsContext context, float cursorHeight, float realScrollBarHeight) { if (_loop != null) { for (int a = 0; a < _loop.Segments.Count; a++) { var nextSegment = _loop.GetNextSegment(a); float segmentPositionPercentage = (float)_loop.Segments[a].PositionBytes / (float)Length; float startX = (segmentPositionPercentage * ContentSize.Width) - ContentOffset.X; float nextSegmentPositionPercentage = 0; float endX = 0; if (nextSegment != null) { nextSegmentPositionPercentage = (float)nextSegment.PositionBytes / (float)Length; endX = (nextSegmentPositionPercentage * ContentSize.Width) - ContentOffset.X; } // Draw loop lines //var pen = _markers[a].MarkerId == _activeMarkerId ? _penSelectedMarkerLine : _penMarkerLine; context.SetPen(_penLoopLine); context.StrokeLine(new BasicPoint(startX, 0), new BasicPoint(startX, cursorHeight)); // Draw text //var rectText = new BasicRectangle(startX, Frame.Height - 12, 12, 12); var rectText = new BasicRectangle(startX, Frame.Height - realScrollBarHeight -12, endX > startX ? endX - startX : 12, 12); //var brush = _markers [a].MarkerId == _activeMarkerId ? _brushSelectedMarkerBackground : _brushMarkerBackground; context.DrawRectangle(rectText, _brushLoopBackground, _penTransparent); context.DrawText((a+1).ToString(), new BasicPoint(startX + 2, Frame.Height - realScrollBarHeight - 12), _textColor, LetterFontFace, LetterFontSize); } } }
private void DrawAlbumCoverZone(IGraphicsContext context, int row, AudioFile audioFile2, DrawCellState state) { var pen = new BasicPen(); var penTransparent = new BasicPen(); var brushGradient = new BasicGradientBrush(); var item = _items[row]; //string albumTitle = audioFile != null ? audioFile.AlbumTitle : state.CurrentAlbumTitle; // if this is an empty row, keep last album title // Check for an album title change (or the last item of the grid) if (state.CurrentAlbumArtKey == item.AlbumArtKey) return; state.CurrentAlbumArtKey = item.AlbumArtKey; int albumCoverStartIndex = 0; int albumCoverEndIndex = 0; // For displaying the album cover, we need to know how many songs of the same album are bundled together // Start by getting the start index for (int c = row; c > 0; c--) { var previousItem = _items[c]; if (previousItem.AlbumArtKey != item.AlbumArtKey) { albumCoverStartIndex = c + 1; break; } } // Find the end index for (int c = row + 1; c < _items.Count; c++) { var nextItem = _items[c]; // If the album title is different, this means we found the next album title if (nextItem.AlbumArtKey != item.AlbumArtKey) { albumCoverEndIndex = c - 1; break; } // If this is the last item of the grid... else if (c == _items.Count - 1) { albumCoverEndIndex = c; break; } } var audioFile = _items[albumCoverStartIndex].AudioFile; // Calculate y and height int scrollbarOffsetY = (_startLineNumber * _songCache.LineHeight) - VerticalScrollBar.Value; int y = ((albumCoverStartIndex - _startLineNumber) * _songCache.LineHeight) + _songCache.LineHeight + scrollbarOffsetY; // Calculate the height of the album cover zone (+1 on end index because the array is zero-based) int linesToCover = Math.Min(MinimumRowsPerAlbum, (albumCoverEndIndex + 1 - albumCoverStartIndex)); int albumCoverZoneHeight = linesToCover * _songCache.LineHeight; int heightWithPadding = Math.Min(albumCoverZoneHeight - (_theme.Padding * 2), _songCache.ActiveColumns[0].Width - (_theme.Padding * 2)); // Make sure the height is at least zero (not necessary to draw anything!) if (albumCoverZoneHeight > 0) { // Draw album cover background var rectAlbumCover = new BasicRectangle(0 - HorizontalScrollBar.Value, y, _songCache.ActiveColumns[0].Width, albumCoverZoneHeight); brushGradient = new BasicGradientBrush(_theme.AlbumCoverBackgroundColor, _theme.AlbumCoverBackgroundColor, 90); context.DrawRectangle(rectAlbumCover, brushGradient, penTransparent); // Measure available width for text int widthAvailableForText = _columns[0].Width - (_theme.Padding * 2); // Display titles depending on if an album art was found var rectAlbumCoverArt = new BasicRectangle(); var rectAlbumTitleText = new BasicRectangle(); var rectArtistNameText = new BasicRectangle(); var sizeAlbumTitle = new BasicRectangle(); var sizeArtistName = new BasicRectangle(); bool useAlbumArtOverlay = false; bool displayArtistNameAndAlbumTitle = false; // Try to extract image from cache IBasicImage imageAlbumCover = null; SongGridViewImageCache cachedImage = null; try { cachedImage = _imageCache.FirstOrDefault(x => x.Key == item.AlbumArtKey); } catch (Exception ex) { Tracing.Log(ex); } if (cachedImage != null) imageAlbumCover = cachedImage.Image; // Album art not found in cache; try to find an album cover in one of the file if (cachedImage == null) { try { // Check if the album cover is already in the pile bool albumCoverFound = false; foreach (var arg in _workerUpdateAlbumArtPile) { // Match by file path if (arg.AudioFile.FilePath.ToUpper() == audioFile.FilePath.ToUpper()) { albumCoverFound = true; } } // Add to the pile only if the album cover isn't already in it if (!albumCoverFound) { // Add item to update album art worker pile var arg = new SongGridViewBackgroundWorkerArgument(); arg.AudioFile = audioFile; arg.LineIndex = row; arg.RectAlbumArt = new BasicRectangle(0, 0, heightWithPadding, heightWithPadding); _workerUpdateAlbumArtPile.Add(arg); } } catch(Exception ex) { Console.WriteLine("SongGridViewControl - Failed to load cache image: {0}" , ex); } } // There are at least two lines; is there an album cover to display? if (imageAlbumCover == null) { // There is no album cover to display; display only text. // Set string format //stringFormat.Alignment = StringAlignment.Center; //stringFormat.Trimming = StringTrimming.EllipsisWord; sizeArtistName = context.MeasureText(audioFile.ArtistName, new BasicRectangle(0, 0, widthAvailableForText, heightWithPadding), _theme.FontNameAlbumArtTitle, _theme.FontSize + 2); sizeAlbumTitle = context.MeasureText(audioFile.AlbumTitle, new BasicRectangle(0, 0, widthAvailableForText, heightWithPadding), _theme.FontNameAlbumArtSubtitle, _theme.FontSize); // Display the album title at the top of the zome rectArtistNameText = new BasicRectangle(_theme.Padding - HorizontalScrollBar.Value, y + _theme.Padding, widthAvailableForText, heightWithPadding); rectAlbumTitleText = new BasicRectangle(_theme.Padding - HorizontalScrollBar.Value, y + _theme.Padding + sizeArtistName.Height, widthAvailableForText, heightWithPadding); displayArtistNameAndAlbumTitle = true; useAlbumArtOverlay = true; } else { // There is an album cover to display with more than 2 lines. // Set string format //stringFormat.Alignment = StringAlignment.Near; //stringFormat.Trimming = StringTrimming.EllipsisWord; float widthRemainingForText = _columns[0].Width - (_theme.Padding * 3) - heightWithPadding; sizeArtistName = context.MeasureText(audioFile.ArtistName, new BasicRectangle(0, 0, widthRemainingForText, heightWithPadding), _theme.FontNameAlbumArtTitle, _theme.FontSize + 2); sizeAlbumTitle = context.MeasureText(audioFile.AlbumTitle, new BasicRectangle(0, 0, widthRemainingForText, heightWithPadding), _theme.FontNameAlbumArtSubtitle, _theme.FontSize); // Try to center the cover art + padding + max text width //float maxWidth = Math.Max(sizeArtistName.Width, sizeAlbumTitle.Width); float albumCoverX = _theme.Padding - 2; // (_columns[0].Width - heightWithPadding - _theme.Padding - _theme.Padding - maxWidth) / 2; float artistNameY = _theme.Padding + 1; // (albumCoverZoneHeight - sizeArtistName.Height - sizeAlbumTitle.Height) / 2; // Display the album title at the top of the zome rectArtistNameText = new BasicRectangle(albumCoverX + heightWithPadding + _theme.Padding - HorizontalScrollBar.Value, y + artistNameY, widthRemainingForText, heightWithPadding); rectAlbumTitleText = new BasicRectangle(albumCoverX + heightWithPadding + _theme.Padding - HorizontalScrollBar.Value, y + artistNameY + sizeArtistName.Height + (_theme.Padding / 8f), widthRemainingForText, heightWithPadding); rectAlbumCoverArt = new BasicRectangle(albumCoverX - HorizontalScrollBar.Value, y + _theme.Padding, heightWithPadding, heightWithPadding); displayArtistNameAndAlbumTitle = widthRemainingForText > 20; useAlbumArtOverlay = true; } // Display album cover if (imageAlbumCover != null) context.DrawImage(rectAlbumCoverArt, new BasicRectangle(0, 0, imageAlbumCover.ImageSize.Width, imageAlbumCover.ImageSize.Height), imageAlbumCover.Image); //context.DrawImage(rectAlbumCoverArt, new BasicRectangle(0, 0, rectAlbumCoverArt.Width, rectAlbumCoverArt.Height), imageAlbumCover.Image); // if (useAlbumArtOverlay) // { // // Draw artist name and album title background // var rectArtistNameBackground = new BasicRectangle(rectArtistNameText.X - (_theme.Padding / 2), rectArtistNameText.Y - (_theme.Padding / 4), sizeArtistName.Width + _theme.Padding, sizeArtistName.Height + (_theme.Padding / 2)); // var rectAlbumTitleBackground = new BasicRectangle(rectAlbumTitleText.X - (_theme.Padding / 2), rectAlbumTitleText.Y - (_theme.Padding / 4), sizeAlbumTitle.Width + _theme.Padding, sizeAlbumTitle.Height + (_theme.Padding / 2)); // var brushTextBackground = new BasicBrush(new BasicColor(0, 0, 0, 30)); // context.DrawRectangle(rectArtistNameBackground, brushTextBackground, penTransparent); // context.DrawRectangle(rectAlbumTitleBackground, brushTextBackground, penTransparent); // } if (displayArtistNameAndAlbumTitle) { context.DrawText(audioFile.ArtistName, rectArtistNameText, _theme.HeaderTextColor, _theme.FontNameAlbumArtTitle, _theme.FontSize + 2); context.DrawText(audioFile.AlbumTitle, rectAlbumTitleText, _theme.HeaderTextColor, _theme.FontNameAlbumArtSubtitle, _theme.FontSize); } // Draw horizontal line to distinguish albums // Part 1: Draw line over grid pen = new BasicPen(new BasicBrush(new BasicColor(180, 180, 180)), 1); context.DrawLine(new BasicPoint(_columns[0].Width, y), new BasicPoint(Frame.Width, y), pen); // Part 2: Draw line over album art zone, in a lighter color pen = new BasicPen(new BasicBrush(new BasicColor(115, 115, 115)), 1); context.DrawLine(new BasicPoint(0, y), new BasicPoint(_columns[0].Width, y), pen); } }
private void DrawScrollBar(IGraphicsContext context, int tileSize, float realScrollBarHeight) { if (ShowScrollBar && Zoom > 1) { int startTile = 0; int numberOfTilesToFillWidth = (int)Math.Ceiling(Frame.Width / tileSize);// + 1; // maybe a bug here? when one of the tile is partially drawn, you need another one? var requestScrollBar = new WaveFormBitmapRequest() { StartTile = startTile, EndTile = numberOfTilesToFillWidth, TileSize = tileSize, BoundsWaveForm = new BasicRectangle(0, 0, Frame.Width, ScrollBarHeight), // Frame Zoom = 1, IsScrollBar = true, DisplayType = _displayType }; // TODO: Cache those tiles, we do not need to request them continually since these tiles are always at 100% var tilesScrollBar = _waveFormCacheService.GetTiles(requestScrollBar); foreach (var tile in tilesScrollBar) { context.DrawImage(new BasicRectangle(tile.ContentOffset.X, Frame.Height - realScrollBarHeight, tileSize, realScrollBarHeight), tile.Image.ImageSize, tile.Image.Image); } // Draw a veil over the area that's not visible. The veil alpha gets stronger as the zoom progresses. byte startAlpha = 170; byte maxAlpha = 210; byte alpha = (byte)Math.Min(maxAlpha, (startAlpha + (60 * (Zoom / 10)))); var colorVisibleArea = new BasicColor(32, 40, 46, alpha); float visibleAreaWidth = (1 / Zoom) * Frame.Width; float visibleAreaX = (1 / Zoom) * ContentOffset.X; var rectLeftArea = new BasicRectangle(0, Frame.Height - realScrollBarHeight, visibleAreaX, realScrollBarHeight); var rectRightArea = new BasicRectangle(visibleAreaX + visibleAreaWidth, Frame.Height - realScrollBarHeight, Frame.Width - visibleAreaX - visibleAreaWidth, realScrollBarHeight); //context.DrawRectangle(new BasicRectangle(visibleAreaX, Frame.Height - scrollBarHeight, visibleAreaWidth, scrollBarHeight), new BasicBrush(colorVisibleArea), new BasicPen()); context.DrawRectangle(rectLeftArea, new BasicBrush(colorVisibleArea), new BasicPen()); context.DrawRectangle(rectRightArea, new BasicBrush(colorVisibleArea), new BasicPen()); } }
private void DrawStatus(IGraphicsContext context, string status) { //Console.WriteLine("WaveFormControl - DrawStatus - status: {0}", status); context.DrawRectangle(Frame, new BasicBrush(_backgroundColor), new BasicPen()); var rectText = context.MeasureText(status, new BasicRectangle(0, 0, Frame.Width, 30), FontFace, FontSize); float x = (context.BoundsWidth - rectText.Width) / 2; float y = context.BoundsHeight / 2; context.DrawText(status, new BasicPoint(x, y), _textColor, FontFace, FontSize); }
private void DrawRows(IGraphicsContext context) { var state = new DrawCellState(); BasicGradientBrush brushGradient = null; var penTransparent = new BasicPen(); // Calculate how many lines must be skipped because of the scrollbar position _startLineNumber = Math.Max((int) Math.Floor((double) VerticalScrollBar.Value/(double) (_songCache.LineHeight)), 0); // Check if the total number of lines exceeds the number of icons fitting in height _numberOfLinesToDraw = 0; if (_startLineNumber + _songCache.NumberOfLinesFittingInControl > _items.Count) { // There aren't enough lines to fill the screen _numberOfLinesToDraw = _items.Count - _startLineNumber; } else { // Fill up screen _numberOfLinesToDraw = _songCache.NumberOfLinesFittingInControl; } // Add one line for overflow; however, make sure we aren't adding a line without content if (_startLineNumber + _numberOfLinesToDraw + 1 <= _items.Count) _numberOfLinesToDraw++; // Loop through lines for (int a = _startLineNumber; a < _startLineNumber + _numberOfLinesToDraw; a++) { // Calculate offsets, widths and other variants state.OffsetX = 0; state.OffsetY = (a * _songCache.LineHeight) - VerticalScrollBar.Value + _songCache.LineHeight; // compensate for scrollbar position int albumArtColumnWidth = _columns[0].Visible ? _columns[0].Width : 0; int lineBackgroundWidth = (int) (Frame.Width + HorizontalScrollBar.Value - albumArtColumnWidth); if (VerticalScrollBar.Visible) lineBackgroundWidth -= VerticalScrollBar.Width; // Check conditions to determine background color var audioFile = _items[a].AudioFile; var colorBackground1 = _theme.BackgroundColor; var colorBackground2 = _theme.BackgroundColor; if ((_mode == SongGridViewMode.AudioFile && audioFile != null && audioFile.Id == _nowPlayingAudioFileId) || (_mode == SongGridViewMode.Playlist && _items[a].PlaylistItemId == _nowPlayingPlaylistItemId)) { colorBackground1 = _theme.NowPlayingBackgroundColor; colorBackground2 = _theme.NowPlayingBackgroundColor; } if (_items[a].IsSelected) { colorBackground1 = _theme.SelectedBackgroundColor; colorBackground2 = _theme.SelectedBackgroundColor; // // Use darker color // byte diff = 4; // colorBackground1 = new BasicColor(255, // (byte)((colorBackground1.R - diff < 0) ? 0 : colorBackground1.R - diff), // (byte)((colorBackground1.G - diff < 0) ? 0 : colorBackground1.G - diff), // (byte)((colorBackground1.B - diff < 0) ? 0 : colorBackground1.B - diff)); // colorBackground2 = new BasicColor(255, // (byte)((colorBackground2.R - diff < 0) ? 0 : colorBackground2.R - diff), // (byte)((colorBackground2.G - diff < 0) ? 0 : colorBackground2.G - diff), // (byte)((colorBackground2.B - diff < 0) ? 0 : colorBackground2.B - diff)); } //// Check if mouse is over item //if (items[a].IsMouseOverItem) //{ // // Use lighter color // int diff = 20; // colorBackground1 = Color.FromArgb(255, // (colorBackground1.R + diff > 255) ? 255 : colorBackground1.R + diff, // (colorBackground1.G + diff > 255) ? 255 : colorBackground1.G + diff, // (colorBackground1.B + diff > 255) ? 255 : colorBackground1.B + diff); // colorBackground2 = Color.FromArgb(255, // (colorBackground2.R + diff > 255) ? 255 : colorBackground2.R + diff, // (colorBackground2.G + diff > 255) ? 255 : colorBackground2.G + diff, // (colorBackground2.B + diff > 255) ? 255 : colorBackground2.B + diff); //} //// Check conditions to determine background color //if ((_mode == SongGridViewMode.AudioFile && audioFile.Id == _nowPlayingAudioFileId) || // (_mode == SongGridViewMode.Playlist && _items[a].PlaylistItemId == _nowPlayingPlaylistItemId)) //{ // colorNowPlaying1 = colorBackground1; // colorNowPlaying2 = colorBackground2; //} // Draw row background var rectBackground = new BasicRectangle(albumArtColumnWidth - HorizontalScrollBar.Value, state.OffsetY, lineBackgroundWidth, _songCache.LineHeight + 1); brushGradient = new BasicGradientBrush(colorBackground1, colorBackground2, 90); context.DrawRectangle(rectBackground, brushGradient, penTransparent); // Loop through columns for (int b = 0; b < _songCache.ActiveColumns.Count; b++) { DrawCell(context, a, b, audioFile, state); } } // If no songs are playing, set the current now playing rectangle as "empty" if (!state.NowPlayingSongFound) _rectNowPlaying = new BasicRectangle(0, 0, 1, 1); }
/// <summary> /// Occurs when the control needs to be painted. /// </summary> public void Render(IGraphicsContext context) { if (_items == null) return; //var stopwatch = new Stopwatch(); //stopwatch.Start(); // If frame doesn't match, refresh frame and song cache if (Frame.Width != context.BoundsWidth || Frame.Height != context.BoundsHeight || _songCache == null) { Frame = new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight); InvalidateSongCache(); } // Draw background context.DrawRectangle(Frame, new BasicBrush(_theme.AlbumCoverBackgroundColor), new BasicPen()); DrawRows(context); DrawHeader(context); DrawDebugInformation(context); if (HorizontalScrollBar.Visible && VerticalScrollBar.Visible) { // Draw a bit of control color over the 16x16 area in the lower right corner var brush = new BasicBrush(new BasicColor(200, 200, 200)); context.DrawRectangle(new BasicRectangle(Frame.Width - 16, Frame.Height - 16, 16, 16), brush, new BasicPen()); } //stopwatch.Stop(); //Console.WriteLine("SongGridViewControl - Render - Completed in {0} - frame: {1} numberOfLinesToDraw: {2}", stopwatch.Elapsed, Frame, _numberOfLinesToDraw); }
private void DrawDebugInformation(IGraphicsContext context) { // Display debug information if enabled if (_displayDebugInformation) { // Build debug string var sbDebug = new StringBuilder(); sbDebug.AppendLine("Line Count: " + _items.Count.ToString()); sbDebug.AppendLine("Line Height: " + _songCache.LineHeight.ToString()); sbDebug.AppendLine("Lines Fit In Height: " + _songCache.NumberOfLinesFittingInControl.ToString()); sbDebug.AppendLine("Total Width: " + _songCache.TotalWidth); sbDebug.AppendLine("Total Height: " + _songCache.TotalHeight); sbDebug.AppendLine("Scrollbar Offset Y: " + _songCache.ScrollBarOffsetY); sbDebug.AppendLine("HScrollbar Maximum: " + HorizontalScrollBar.Maximum.ToString()); sbDebug.AppendLine("HScrollbar LargeChange: " + HorizontalScrollBar.LargeChange.ToString()); sbDebug.AppendLine("HScrollbar Value: " + HorizontalScrollBar.Value.ToString()); sbDebug.AppendLine("VScrollbar Maximum: " + VerticalScrollBar.Maximum.ToString()); sbDebug.AppendLine("VScrollbar LargeChange: " + VerticalScrollBar.LargeChange.ToString()); sbDebug.AppendLine("VScrollbar Value: " + VerticalScrollBar.Value.ToString()); // Measure string //stringFormat.Trimming = StringTrimming.Word; //stringFormat.LineAlignment = StringAlignment.Near; //SizeF sizeDebugText = g.MeasureString(sbDebug.ToString(), fontDefault, _columns[0].Width - 1, stringFormat); var sizeDebugText = context.MeasureText(sbDebug.ToString(), new BasicRectangle(0, 0, _columns[0].Width, 40), _theme.FontName, _theme.FontSize); var rect = new BasicRectangle(0, 0, _columns[0].Width - 1, sizeDebugText.Height); // Draw background var brush = new BasicBrush(new BasicColor(200, 0, 0)); var penTransparent = new BasicPen(); context.DrawRectangle(rect, brush, penTransparent); // Draw string context.DrawText(sbDebug.ToString(), rect, new BasicColor(255, 255, 255), _theme.FontName, _theme.FontSize); } }
private void DrawHeader(IGraphicsContext context) { var rect = new BasicRectangle(); var pen = new BasicPen(); var penTransparent = new BasicPen(); var brushGradient = new BasicGradientBrush(_theme.HeaderBackgroundColor, _theme.HeaderBackgroundColor, 90); // Draw header (for some reason, the Y must be set -1 to cover an area which isn't supposed to be displayed) var rectBackgroundHeader = new BasicRectangle(0, -1, Frame.Width, _songCache.LineHeight + 1); context.DrawRectangle(rectBackgroundHeader, brushGradient, penTransparent); // Loop through columns int offsetX = 0; for (int b = 0; b < _songCache.ActiveColumns.Count; b++) { var column = _songCache.ActiveColumns[b]; if (column.Visible) { // The last column always take the remaining width int columnWidth = column.Width; if (b == _songCache.ActiveColumns.Count - 1) { // Calculate the remaining width int columnsWidth = 0; for (int c = 0; c < _songCache.ActiveColumns.Count - 1; c++) columnsWidth += _songCache.ActiveColumns[c].Width; columnWidth = (int) (Frame.Width - columnsWidth + HorizontalScrollBar.Value); } // Check if mouse is over this column header if (column.IsMouseOverColumnHeader) { // Draw header (for some reason, the Y must be set -1 to cover an area which isn't supposed to be displayed) rect = new BasicRectangle(offsetX - HorizontalScrollBar.Value, -1, column.Width, _songCache.LineHeight + 1); brushGradient = new BasicGradientBrush(_theme.MouseOverHeaderBackgroundColor, _theme.MouseOverHeaderBackgroundColor, 90); context.DrawRectangle(rect, brushGradient, penTransparent); } else if (column.IsUserMovingColumn) { // Draw header (for some reason, the Y must be set -1 to cover an area which isn't supposed to be displayed) rect = new BasicRectangle(offsetX - HorizontalScrollBar.Value, -1, column.Width, _songCache.LineHeight + 1); brushGradient = new BasicGradientBrush(new BasicColor(0, 0, 255), new BasicColor(0, 255, 0), 90); context.DrawRectangle(rect, brushGradient, penTransparent); } // Check if the header title must be displayed if (_songCache.ActiveColumns[b].IsHeaderTitleVisible) { // Display title var rectTitle = new BasicRectangle(offsetX - HorizontalScrollBar.Value + 2, _theme.Padding / 2, column.Width, _songCache.LineHeight - _theme.Padding + 2); //stringFormat.Trimming = StringTrimming.EllipsisCharacter; context.DrawText(column.Title, rectTitle, _theme.HeaderTextColor, _theme.FontNameBold, _theme.FontSize); } // Draw column separator line; determine the height of the line int columnHeight = (int) Frame.Height; // Determine the height of the line; if the items don't fit the control height... if (_items.Count < _songCache.NumberOfLinesFittingInControl) { // Set height as the number of items (plus header) columnHeight = (_items.Count + 1) * _songCache.LineHeight; } // Draw column line //g.DrawLine(Pens.DarkGray, new Point(offsetX + column.Width - HorizontalScrollBar.Value, 0), new Point(offsetX + column.Width - HorizontalScrollBar.Value, columnHeight)); // Check if the column is ordered by if (column.FieldName == _orderByFieldName && !String.IsNullOrEmpty(column.FieldName)) { // Create triangle points,,, var ptTriangle = new BasicPoint[3]; // ... depending on the order by ascending value int triangleWidthHeight = 8; int trianglePadding = (_songCache.LineHeight - triangleWidthHeight) / 2; if (_orderByAscending) { // Create points for ascending ptTriangle[0] = new BasicPoint(offsetX + column.Width - triangleWidthHeight - (triangleWidthHeight / 2) - HorizontalScrollBar.Value, trianglePadding); ptTriangle[1] = new BasicPoint(offsetX + column.Width - triangleWidthHeight - HorizontalScrollBar.Value, _songCache.LineHeight - trianglePadding); ptTriangle[2] = new BasicPoint(offsetX + column.Width - triangleWidthHeight - triangleWidthHeight - HorizontalScrollBar.Value, _songCache.LineHeight - trianglePadding); } else { // Create points for descending ptTriangle[0] = new BasicPoint(offsetX + column.Width - triangleWidthHeight - (triangleWidthHeight / 2) - HorizontalScrollBar.Value, _songCache.LineHeight - trianglePadding); ptTriangle[1] = new BasicPoint(offsetX + column.Width - triangleWidthHeight - HorizontalScrollBar.Value, trianglePadding); ptTriangle[2] = new BasicPoint(offsetX + column.Width - triangleWidthHeight - triangleWidthHeight - HorizontalScrollBar.Value, trianglePadding); } // Draw triangle pen = new BasicPen(new BasicBrush(new BasicColor(255, 0, 0)), 1); } // Increment offset by the column width offsetX += column.Width; } } // Display column move marker if (IsColumnMoving) { // Draw marker pen = new BasicPen(new BasicBrush(new BasicColor(255, 0, 0)), 1); context.DrawRectangle(new BasicRectangle(_columnMoveMarkerX - HorizontalScrollBar.Value, 0, 1, Frame.Height), new BasicBrush(), pen); } }
public void Render(IGraphicsContext context) { context.DrawRectangle(new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight), _brushBackground, _penTransparent); }
private void DrawMarkers(IGraphicsContext context, float cursorHeight) { for (int a = 0; a < _markers.Count; a++) { float xPct = (float)_markers[a].PositionBytes / (float)Length; float x = (xPct * ContentSize.Width) - ContentOffset.X; // Draw cursor line var pen = _markers[a].MarkerId == _activeMarkerId ? _penSelectedMarkerLine : _penMarkerLine; context.SetPen(pen); context.StrokeLine(new BasicPoint(x, 0), new BasicPoint(x, cursorHeight)); // Draw text var rectText = new BasicRectangle(x, 0, 12, 12); var brush = _markers[a].MarkerId == _activeMarkerId ? _brushSelectedMarkerBackground : _brushMarkerBackground; context.DrawRectangle(rectText, brush, _penTransparent); string letter = Conversion.IndexToLetter(a).ToString(); context.DrawText(letter, new BasicPoint(x + 2, 0), _textColor, LetterFontFace, LetterFontSize); } }
public void Render(IGraphicsContext context) { lock (_locker) { if (_brushBackground == null) { _brushBackground = new BasicBrush(_backgroundColor); _penTransparent = new BasicPen(); _penBorder = new BasicPen(new BasicBrush(_borderColor), 1); _rectText = context.MeasureText("12345:678.90", new BasicRectangle(0, 0, Frame.Width, Frame.Height), "HelveticaNeue", 10); } } _density = context.Density; Frame = new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight); context.DrawRectangle(new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight), _brushBackground, _penTransparent); if (_audioFile == null || _audioFileLength == 0) return; // Check if scale type needs to be updated if (_lastWidth != ContentSize.Width) { _lastWidth = ContentSize.Width; CalculateScale(context.Density); } // Draw scale borders //Console.WriteLine("WaveFormScaleView - scaleType: {0} totalMinutes: {1} totalSeconds: {2} totalMinutesScaled: {3} totalSecondsScaled: {4}", scaleType.ToString(), totalMinutes, totalSeconds, totalMinutesScaled, totalSecondsScaled); context.SetPen(_penBorder); context.StrokeLine(new BasicPoint(0, ContentSize.Height - 1), new BasicPoint(ContentSize.Width, ContentSize.Height - 1)); int firstVisibleIndex = (int)Math.Floor(ContentOffset.X / _tickWidth); int lastVisibleIndex = firstVisibleIndex + (int)Math.Floor(context.BoundsWidth / _tickWidth); float tickX = -ContentOffset.X + (firstVisibleIndex * _tickWidth); int majorTickIndex = (int)Math.Ceiling(firstVisibleIndex / 10f); //for (int a = firstVisibleIndex; a < _tickCount; a++) for (int a = firstVisibleIndex; a < lastVisibleIndex; a++) { // Ignore ticks out of bounds bool isMajorTick = ((a % 10) == 0); if (tickX >= 0 && tickX <= Frame.Width) { //Console.WriteLine("####> WaveFormView - Scale - tick {0} x: {1} isMajorTick: {2} tickCount: {3}", a, tickX, isMajorTick, tickCount); if(isMajorTick) // //context.DrawLine(new BasicPoint(tickX, context.BoundsHeight - (context.BoundsHeight / 1.25f)), new BasicPoint(tickX, context.BoundsHeight), _penMajorTick); context.StrokeLine(new BasicPoint(tickX, 0), new BasicPoint(tickX, ContentSize.Height - 1)); else context.StrokeLine(new BasicPoint(tickX, ContentSize.Height - (ContentSize.Height / 6) - 1), new BasicPoint(tickX, ContentSize.Height - 1)); if (isMajorTick) { // Draw dashed traversal line for major ticks context.StrokeLine(new BasicPoint(tickX, ContentSize.Height - 1), new BasicPoint(tickX, ContentSize.Height - 1)); // Determine major scale text int minutes = 0; int seconds = 0; switch (_scaleType) { case WaveFormScaleType._10minutes: minutes = majorTickIndex * 10; seconds = 0; break; case WaveFormScaleType._5minutes: minutes = majorTickIndex * 5; seconds = 0; break; case WaveFormScaleType._2minutes: minutes = majorTickIndex * 2; seconds = 0; break; case WaveFormScaleType._1minute: minutes = majorTickIndex; seconds = 0; break; case WaveFormScaleType._30seconds: minutes = (int)Math.Floor(majorTickIndex / _scaleMultiplier); seconds = (majorTickIndex % _scaleMultiplier == 0) ? 0 : 30; break; case WaveFormScaleType._10seconds: minutes = (int)Math.Floor(majorTickIndex / _scaleMultiplier); seconds = ((int)Math.Floor(majorTickIndex % _scaleMultiplier)) * 10; break; case WaveFormScaleType._5seconds: minutes = (int)Math.Floor(majorTickIndex / _scaleMultiplier); seconds = ((int)Math.Floor(majorTickIndex % _scaleMultiplier)) * 5; break; case WaveFormScaleType._1second: minutes = (int)Math.Floor(majorTickIndex / _scaleMultiplier); seconds = (int)Math.Floor(majorTickIndex % _scaleMultiplier); break; } // Draw text at every major tick (minute count) string scaleMajorTitle = string.Format("{0}:{1:00}", minutes, seconds); //float y = ContentSize.Height - (ContentSize.Height/12f) - _rectText.Height - (0.5f * context.Density); float y = 3 * context.Density;//ContentSize.Height - _rectText.Height - (10 * context.Density); context.DrawText(scaleMajorTitle, new BasicPoint(tickX + (4 * context.Density), y), _textColor, FontFace, FontSize); } } if(isMajorTick) majorTickIndex++; tickX += _tickWidth; } }
public void Render(IGraphicsContext context) { Frame = new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight); var rectBackground = new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight); context.DrawRectangle(rectBackground, _brushBackground, _penTransparent); if (_isIndeterminate) { var rectForeground = new BasicRectangle(0, 0, context.BoundsWidth, context.BoundsHeight); context.DrawRectangle(rectForeground, _brushForeground, _penTransparent); const int pixelsPerIteration = 1; float inclination = 15 * context.Density; float barSize = 20 * context.Density; float widthBetweenBars = 0;//2 * context.Density; float totalBarWidth = barSize + inclination + widthBetweenBars; int barCount = (int)Math.Ceiling(context.BoundsWidth / totalBarWidth); for (int a = -1; a < barCount + 1; a++) // bleed paths out of bounds partially visible { float offset = (_animationCounter % totalBarWidth) * pixelsPerIteration; float x = (a * totalBarWidth) + offset; var path = new BasicPath(); path.AddLine(new BasicPathLine(new BasicPoint(x, context.BoundsHeight), new BasicPoint(x + barSize, context.BoundsHeight))); path.AddLine(new BasicPathLine(new BasicPoint(x + barSize, context.BoundsHeight), new BasicPoint(x + barSize + inclination, 0))); path.AddLine(new BasicPathLine(new BasicPoint(x + barSize + inclination, 0), new BasicPoint(x + inclination, 0))); path.AddLine(new BasicPathLine(new BasicPoint(x + inclination, 0), new BasicPoint(x, context.BoundsHeight))); context.DrawPath(path, _brushIndeterminateForeground, _penTransparent); } } else { var rectForeground = new BasicRectangle(0, 0, _value * context.BoundsWidth, context.BoundsHeight); context.DrawRectangle(rectForeground, _brushForeground, _penTransparent); } }