internal protected override void OptionsChanged() { foldBgGC = editor.ColorStyle.FoldLine.CairoBackgroundColor; foldLineGC = editor.ColorStyle.FoldLine.CairoColor; foldLineHighlightedGC = editor.ColorStyle.FoldLineHighlighted; HslColor hslColor = new HslColor(editor.ColorStyle.Default.CairoBackgroundColor); double brightness = HslColor.Brightness(hslColor); if (brightness < 0.5) { hslColor.L = hslColor.L * 0.85 + hslColor.L * 0.25; } else { hslColor.L = hslColor.L * 0.9; } foldLineHighlightedGCBg = hslColor; foldToggleMarkerGC = editor.ColorStyle.FoldToggleMarker; lineStateChangedGC = new Cairo.Color(108 / 255.0, 226 / 255.0, 108 / 255.0); lineStateDirtyGC = new Cairo.Color(255 / 255.0, 238 / 255.0, 98 / 255.0); marginWidth = editor.LineHeight; }
internal protected override void OptionsChanged() { foldBgGC = SyntaxHighlightingService.GetColor(editor.EditorTheme, EditorThemeColors.Background); foldLineGC = SyntaxHighlightingService.GetColor(editor.EditorTheme, EditorThemeColors.FoldLine); foldLineHighlightedGC = SyntaxHighlightingService.GetColor(editor.EditorTheme, EditorThemeColors.Foreground); HslColor hslColor = SyntaxHighlightingService.GetColor(editor.EditorTheme, EditorThemeColors.Background); double brightness = HslColor.Brightness(hslColor); if (brightness < 0.5) { hslColor.L = hslColor.L * 0.85 + hslColor.L * 0.25; } else { hslColor.L = hslColor.L * 0.9; } foldLineHighlightedGCBg = hslColor; foldToggleMarkerGC = SyntaxHighlightingService.GetColor(editor.EditorTheme, EditorThemeColors.FoldCross); foldToggleMarkerBackground = SyntaxHighlightingService.GetColor(editor.EditorTheme, EditorThemeColors.FoldCrossBackground); lineStateChangedGC = SyntaxHighlightingService.GetColor(editor.EditorTheme, EditorThemeColors.QuickDiffChanged); lineStateDirtyGC = SyntaxHighlightingService.GetColor(editor.EditorTheme, EditorThemeColors.QuickDiffDirty); marginWidth = editor.LineHeight * 3 / 4; }
internal protected override void OptionsChanged() { foldBgGC = editor.ColorStyle.PlainText.Background; foldLineGC = editor.ColorStyle.FoldLineColor.Color; foldLineHighlightedGC = editor.ColorStyle.PlainText.Foreground; HslColor hslColor = new HslColor(editor.ColorStyle.PlainText.Background); double brightness = HslColor.Brightness(hslColor); if (brightness < 0.5) { hslColor.L = hslColor.L * 0.85 + hslColor.L * 0.25; } else { hslColor.L = hslColor.L * 0.9; } foldLineHighlightedGCBg = hslColor; foldToggleMarkerGC = editor.ColorStyle.FoldCross.Color; foldToggleMarkerBackground = editor.ColorStyle.FoldCross.SecondColor; lineStateChangedGC = editor.ColorStyle.QuickDiffChanged.Color; lineStateDirtyGC = editor.ColorStyle.QuickDiffDirty.Color; marginWidth = editor.LineHeight; }
static HslColor GetColor(Cairo.Color col) { HslColor hsl = col; if (HslColor.Brightness(hsl) < 0.5) { hsl.L = System.Math.Min(1.0, hsl.L + 0.5); } else { hsl.L = System.Math.Max(0.0, hsl.L - 0.5); } return(hsl); }
internal protected override void OptionsChanged() { DisposeGCs(); foldBgGC = new Gdk.GC(editor.GdkWindow); foldBgGC.RgbFgColor = editor.ColorStyle.FoldLine.BackgroundColor; foldLineGC = new Gdk.GC(editor.GdkWindow); foldLineGC.RgbFgColor = editor.ColorStyle.FoldLine.Color; foldLineHighlightedGC = new Gdk.GC(editor.GdkWindow); foldLineHighlightedGC.RgbFgColor = editor.ColorStyle.FoldLineHighlighted; HslColor hslColor = new HslColor(editor.ColorStyle.Default.BackgroundColor); double brightness = HslColor.Brightness(editor.ColorStyle.Default.BackgroundColor); if (brightness < 0.5) { hslColor.L = hslColor.L * 0.85 + hslColor.L * 0.25; } else { hslColor.L = hslColor.L * 0.9; } foldLineHighlightedGCBg = new Gdk.GC(editor.GdkWindow); foldLineHighlightedGCBg.RgbFgColor = hslColor; foldToggleMarkerGC = new Gdk.GC(editor.GdkWindow); foldToggleMarkerGC.RgbFgColor = editor.ColorStyle.FoldToggleMarker; lineStateChangedGC = new Gdk.GC(editor.GdkWindow); lineStateChangedGC.RgbFgColor = new Gdk.Color(108, 226, 108); lineStateDirtyGC = new Gdk.GC(editor.GdkWindow); lineStateDirtyGC.RgbFgColor = new Gdk.Color(255, 238, 98); marginWidth = editor.LineHeight; /* * layout.FontDescription = editor.Options.Font; * layout.SetText ("!"); * int tmp; * layout.GetPixelSize (out tmp, out this.marginWidth); * marginWidth *= 8; * marginWidth /= 10;*/ }
public override void OptionsChanged() { base.OptionsChanged(); foldBgGC = SyntaxHighlightingService.GetColor(Editor.EditorTheme, EditorThemeColors.Background); foldLineGC = SyntaxHighlightingService.GetColor(Editor.EditorTheme, EditorThemeColors.FoldLine); foldLineHighlightedGC = SyntaxHighlightingService.GetColor(Editor.EditorTheme, EditorThemeColors.Foreground); HslColor hslColor = SyntaxHighlightingService.GetColor(Editor.EditorTheme, EditorThemeColors.Background); double brightness = HslColor.Brightness(hslColor); if (brightness < 0.5) { hslColor.L = hslColor.L * 0.85 + hslColor.L * 0.25; } else { hslColor.L = hslColor.L * 0.9; } foldLineHighlightedGCBg = hslColor; foldToggleMarkerGC = SyntaxHighlightingService.GetColor(Editor.EditorTheme, EditorThemeColors.FoldCross); foldToggleMarkerBackground = SyntaxHighlightingService.GetColor(Editor.EditorTheme, EditorThemeColors.FoldCrossBackground); }
public void Draw(Cairo.Context cr, Cairo.Rectangle area) { TextViewMargin textViewMargin = editor.TextViewMargin; ISyntaxMode mode = Document.SyntaxMode != null && editor.Options.EnableSyntaxHighlighting ? Document.SyntaxMode : new SyntaxMode(Document); TextViewMargin.LayoutWrapper lineLayout = null; double brightness = HslColor.Brightness(editor.ColorStyle.PlainText.Background); int colorCount = foldSegments.Count + 2; cr.SetSourceColor(GetColor(-1, brightness, colorCount)); cr.Rectangle(area); cr.Fill(); var rectangles = new Cairo.Rectangle[foldSegments.Count]; const int xPadding = 4; const int yPadding = 2; const int rightMarginPadding = 16; for (int i = foldSegments.Count - 1; i >= 0; i--) { var segment = foldSegments [i]; if (segment.IsInvalid) { continue; } var segmentStartLine = segment.StartLine; var segmentEndLine = segment.EndLine; int curWidth = 0; var endLine = segmentEndLine.NextLine; var y = editor.LineToY(segmentStartLine.LineNumber); if (y < editor.VAdjustment.Value) { segmentStartLine = editor.GetLine(editor.YToLine(editor.VAdjustment.Value)); y = editor.LineToY(segmentStartLine.LineNumber); } for (var curLine = segmentStartLine; curLine != endLine && y < editor.VAdjustment.Value + editor.Allocation.Height; curLine = curLine.NextLine) { var curLayout = textViewMargin.CreateLinePartLayout(mode, curLine, curLine.Offset, curLine.Length, -1, -1); var width = (int)(curLayout.Width); curWidth = System.Math.Max(curWidth, width); y += editor.GetLineHeight(curLine); } double xPos = textViewMargin.XOffset; double rectangleWidth = 0, rectangleHeight = 0; lineLayout = textViewMargin.CreateLinePartLayout(mode, segmentStartLine, segmentStartLine.Offset, segmentStartLine.Length, -1, -1); var rectangleStart = lineLayout.Layout.IndexToPos(GetFirstNonWsIdx(lineLayout.Layout.Text)); xPos = System.Math.Max(textViewMargin.XOffset, (textViewMargin.XOffset + textViewMargin.TextStartPosition + rectangleStart.X / Pango.Scale.PangoScale) - xPadding); lineLayout = textViewMargin.CreateLinePartLayout(mode, segmentEndLine, segmentEndLine.Offset, segmentEndLine.Length, -1, -1); var rectangleEnd = lineLayout.Layout.IndexToPos(GetFirstNonWsIdx(lineLayout.Layout.Text)); xPos = System.Math.Min(xPos, System.Math.Max(textViewMargin.XOffset, (textViewMargin.XOffset + textViewMargin.TextStartPosition + rectangleEnd.X / Pango.Scale.PangoScale) - xPadding)); rectangleWidth = textViewMargin.XOffset + textViewMargin.TextStartPosition + curWidth - xPos + xPadding * 2; if (i < foldSegments.Count - 1) { rectangleWidth = System.Math.Max((rectangles [i + 1].X + rectangles[i + 1].Width + rightMarginPadding) - xPos, rectangleWidth); } y = editor.LineToY(segment.StartLine.LineNumber); var yEnd = editor.LineToY(segment.EndLine.LineNumber + 1) + (segment.EndLine.LineNumber == editor.LineCount ? editor.LineHeight : 0); if (yEnd == 0) { yEnd = editor.VAdjustment.Upper; } rectangleHeight = yEnd - y; rectangles[i] = new Cairo.Rectangle(xPos, y - yPadding, rectangleWidth, rectangleHeight + yPadding * 2); } for (int i = 0; i < foldSegments.Count; i++) { Cairo.Rectangle clampedRect; var rect = rectangles[i]; if (i == foldSegments.Count - 1) { /* var radius = (int)(editor.Options.Zoom * 2); * int w = 2 * radius; * using (var shadow = new Blur ( * System.Math.Min ((int)rect.Width + w * 2, editor.Allocation.Width), * System.Math.Min ((int)rect.Height + w * 2, editor.Allocation.Height), * radius)) { * using (var gctx = shadow.GetContext ()) { * gctx.Color = new Cairo.Color (0, 0, 0, 0); * gctx.Fill (); * * var a = 0; * var b = 0; * DrawRoundRectangle (gctx, true, true, w - a, w - b, editor.LineHeight / 4, rect.Width + a * 2, rect.Height + a * 2); * var bg = editor.ColorStyle.Default.CairoColor; * gctx.Color = new Cairo.Color (bg.R, bg.G, bg.B, 0.6); * gctx.Fill (); * } * * cr.Save (); * cr.Translate (rect.X - w - editor.HAdjustment.Value, rect.Y - editor.VAdjustment.Value - w); * shadow.Draw (cr); * cr.Restore (); * }*/ var curPadSize = 1; var age = (DateTime.Now - startTime).TotalMilliseconds; var alpha = 0.1; if (age < animationLength) { var animationState = age / (double)animationLength; curPadSize = (int)(3 + System.Math.Sin(System.Math.PI * animationState) * 3); alpha = 0.1 + (1.0 - animationState) / 5; } var bg = editor.ColorStyle.PlainText.Foreground; cr.SetSourceRGBA(bg.R, bg.G, bg.B, alpha); clampedRect = ClampRect(rect.X - editor.HAdjustment.Value - curPadSize, rect.Y - editor.VAdjustment.Value - curPadSize, editor.LineHeight / 2, rect.Width + curPadSize * 2, rect.Height + curPadSize * 2, area); DrawRoundRectangle(cr, true, true, clampedRect.X, clampedRect.Y, editor.LineHeight / 2, clampedRect.Width, clampedRect.Height); cr.Fill(); if (age < animationLength) { var animationState = age / (double)animationLength; curPadSize = (int)(2 + System.Math.Sin(System.Math.PI * animationState) * 2); clampedRect = ClampRect(rect.X - editor.HAdjustment.Value - curPadSize, rect.Y - editor.VAdjustment.Value - curPadSize, editor.LineHeight / 2, rect.Width + curPadSize * 2, rect.Height + curPadSize * 2, area); DrawRoundRectangle(cr, true, true, clampedRect.X, clampedRect.Y, editor.LineHeight / 2, clampedRect.Width, clampedRect.Height); cr.SetSourceColor(GetColor(i, brightness, colorCount)); cr.Fill(); continue; } } clampedRect = ClampRect(rect.X - editor.HAdjustment.Value, rect.Y - editor.VAdjustment.Value, editor.LineHeight / 2, rect.Width, rect.Height, area); DrawRoundRectangle(cr, true, true, clampedRect.X, clampedRect.Y, editor.LineHeight / 2, clampedRect.Width, clampedRect.Height); cr.SetSourceColor(GetColor(i, brightness, colorCount)); cr.Fill(); } }
public void Draw(Cairo.Context cr, Cairo.Rectangle area, DocumentLine lineSegment, double x, double y, double lineHeight) { int foundSegment = -1; if (lineSegment != null) { for (int i = 0; i < foldSegments.Count; i++) { FoldSegment segment = foldSegments [i]; if (segment.StartLine.Offset <= lineSegment.Offset && lineSegment.EndOffsetIncludingDelimiter <= segment.EndLine.EndOffsetIncludingDelimiter) { foundSegment = i; roles [i] = Roles.Between; if (segment.StartLine.Offset == lineSegment.Offset) { roles [i] |= Roles.Start; if (segment.IsFolded) { roles [i] |= Roles.End; } } if (segment.EndLine.Offset == lineSegment.Offset) { roles [i] |= Roles.End; } } } } TextViewMargin textViewMargin = editor.TextViewMargin; ISyntaxMode mode = Document.SyntaxMode != null && editor.Options.EnableSyntaxHighlighting ? Document.SyntaxMode : new SyntaxMode(Document); // Gdk.Rectangle lineArea = new Gdk.Rectangle (textViewMargin.XOffset, y, editor.Allocation.Width - textViewMargin.XOffset, editor.LineHeight); // Gdk.GC gc = new Gdk.GC (drawable); TextViewMargin.LayoutWrapper lineLayout = null; double brightness = HslColor.Brightness(editor.ColorStyle.Default.BackgroundColor); int colorCount = foldSegments.Count + 2; for (int segment = -1; segment <= foundSegment; segment++) { HslColor hslColor = new HslColor(editor.ColorStyle.Default.BackgroundColor); int colorPosition = segment + 1; if (segment == foldSegments.Count - 1) { colorPosition += 2; } if (brightness < 0.5) { hslColor.L = hslColor.L * 0.81 + hslColor.L * 0.25 * (colorCount - colorPosition) / colorCount; } else { hslColor.L = hslColor.L * 0.86 + hslColor.L * 0.1 * colorPosition / colorCount; } Roles role = Roles.Between; double xPos = textViewMargin.XOffset; double rectangleWidth = editor.Allocation.Width - xPos; if (segment >= 0) { DocumentLine segmentStartLine = foldSegments [segment].StartLine; lineLayout = textViewMargin.CreateLinePartLayout(mode, segmentStartLine, segmentStartLine.Offset, segmentStartLine.Length, -1, -1); Pango.Rectangle rectangle = lineLayout.Layout.IndexToPos(GetFirstNonWsIdx(lineLayout.Layout.Text)); xPos = System.Math.Max(textViewMargin.XOffset, (textViewMargin.XOffset + rectangle.X / Pango.Scale.PangoScale - editor.HAdjustment.Value)); DocumentLine segmentEndLine = foldSegments [segment].EndLine; lineLayout = textViewMargin.CreateLinePartLayout(mode, segmentEndLine, segmentEndLine.Offset, segmentEndLine.Length, -1, -1); rectangle = lineLayout.Layout.IndexToPos(GetFirstNonWsIdx(lineLayout.Layout.Text)); xPos = System.Math.Min(xPos, System.Math.Max(textViewMargin.XOffset, (textViewMargin.XOffset + rectangle.X / Pango.Scale.PangoScale - editor.HAdjustment.Value))); int width = editor.Allocation.Width; if (editor.HAdjustment.Upper > width) { width = (int)(textViewMargin.XOffset + editor.HAdjustment.Upper - editor.HAdjustment.Value); } rectangleWidth = (int)(width - xPos - 6 * (segment + 1)); role = roles [segment]; } DrawRoundRectangle(cr, (role & Roles.Start) == Roles.Start, (role & Roles.End) == Roles.End, xPos, y, editor.LineHeight / 2, rectangleWidth, lineHeight); cr.Color = ColorScheme.ToCairoColor(hslColor); cr.Fill(); /* if (segment == foldSegments.Count - 1) { * cr.Color = new Cairo.Color (0.5, 0.5, 0.5, 1); * cr.Stroke (); * }*/ if (lineLayout != null && lineLayout.IsUncached) { lineLayout.Dispose(); lineLayout = null; } } // gc.Dispose (); }