private void EndSkinPreview() { if (_previewDelayTimer != null) { _previewDelayTimer.Change(Timeout.Infinite, Timeout.Infinite); // disable } if (_activeSkinPreview != null) { _activeSkinPreview?.Hide(); _activeSkinPreview.Dispose(); _activeSkinPreview = null; } }
private void HoverSkinPreview(object sender, Skin skin) { if (skin == null || skin.Path == _activeSkinPreview?.Skin?.Path || _busyRendering) { return; } try { // create a clone of requested skin var clonedSkin = Skin.Clone(skin); if (clonedSkin.LoadResult != SkinLoadResult.Ok) { return; } _activeSkinPreview?.Skin?.Deactivate(); _activeSkinPreview?.Hide(); Point loc = this.PointToClient(Cursor.Position); if (sender is ToolStripMenuItem tsmi) { // make sure preview is at least to the right of the toolstrip item int r = menu.Left; int t = menu.Bottom; ToolStripItem item = tsmi; while (item != null) { if (item.Owner != menu) { r += item.Bounds.Width; } // add vertical offset var parent = item.OwnerItem as ToolStripMenuItem; int i = 0; while (parent != null && i < parent.DropDownItems.Count) { if (parent.DropDownItems[i] == item) { break; } t += parent.DropDownItems[i].Height; i++; } item = parent; } loc = new Point(r, t); loc.Offset(5, 5); // small margin } if (_activeSkinPreview == null) { _activeSkinPreview = new SkinPreviewWindow(clonedSkin); _activeSkinPreview.Location = loc; Controls.Add(_activeSkinPreview); _activeSkinPreview.BringToFront(); } else { _activeSkinPreview.Location = loc; _activeSkinPreview.ChangeSkin(clonedSkin); } ControllerState state = new ControllerState(); skin.GetNumberOfElements(out int numButtons, out int numAxes); state.Buttons.EnsureSize(numButtons); state.Axes.EnsureSize(numAxes); _activeSkinPreview.RenderSkin(state); _activeSkinPreview.Show(); } finally { _busyRendering = false; } }