private void UpdateRestoreChoicesInMenu() { // construct the new list of menu items, then populate them // this function is idempotent var snapshotsOldestFirst = new List <Snapshot>(CondenseSnapshots(_snapshots, 20)); var newMenuItems = new List <ToolStripItem> { quitToolStripMenuItem, aboutToolStripMenuItem, snapshotListEndLine }; var maxNumMonitors = 0; var maxNumMonitorPixels = 0L; var showMonitorIcons = false; foreach (var snapshot in snapshotsOldestFirst) { if (maxNumMonitors != snapshot.NumMonitors && maxNumMonitors != 0) { showMonitorIcons = true; } maxNumMonitors = Math.Max(maxNumMonitors, snapshot.NumMonitors); foreach (var monitorPixels in snapshot.MonitorPixelCounts) { maxNumMonitorPixels = Math.Max(maxNumMonitorPixels, monitorPixels); } } foreach (var snapshot in snapshotsOldestFirst) { var menuItem = new RightImageToolStripMenuItem(snapshot.GetDisplayString()) { Tag = snapshot }; menuItem.Click += snapshot.Restore; menuItem.MouseEnter += SnapshotMousedOver; if (snapshot.UserInitiated) { menuItem.Font = new Font(menuItem.Font, FontStyle.Bold); } // monitor icons var monitorSizes = new List <float>(); if (showMonitorIcons) { foreach (var monitorPixels in snapshot.MonitorPixelCounts) { monitorSizes.Add((float)Math.Sqrt((float)monitorPixels / maxNumMonitorPixels)); } } menuItem.MonitorSizes = monitorSizes.ToArray(); newMenuItems.Add(menuItem); } newMenuItems.Add(justNowToolStripMenuItem); newMenuItems.Add(snapshotListStartLine); newMenuItems.Add(clearSnapshotsToolStripMenuItem); newMenuItems.Add(snapshotToolStripMenuItem); // if showing monitor icons: subtract 34 pixels from the right due to too much right padding try { var textPaddingField = typeof(ToolStripDropDownMenu).GetField("TextPadding", BindingFlags.NonPublic | BindingFlags.Static); if (!_originalTrayMenuTextPadding.HasValue) { _originalTrayMenuTextPadding = (Padding)textPaddingField.GetValue(trayMenu); } textPaddingField.SetValue(trayMenu, new Padding(_originalTrayMenuTextPadding.Value.Left, _originalTrayMenuTextPadding.Value.Top, _originalTrayMenuTextPadding.Value.Right - (showMonitorIcons ? 34 : 0), _originalTrayMenuTextPadding.Value.Bottom)); } catch { // something went wrong with using reflection // there will be extra hanging off to the right but that's okay } // if showing monitor icons: make the menu item width 50 + 22 * maxNumMonitors pixels wider than without the icons, to make room // for the icons try { var arrowPaddingField = typeof(ToolStripDropDownMenu).GetField("ArrowPadding", BindingFlags.NonPublic | BindingFlags.Static); if (!_originalTrayMenuArrowPadding.HasValue) { _originalTrayMenuArrowPadding = (Padding)arrowPaddingField.GetValue(trayMenu); } arrowPaddingField.SetValue(trayMenu, new Padding(_originalTrayMenuArrowPadding.Value.Left, _originalTrayMenuArrowPadding.Value.Top, _originalTrayMenuArrowPadding.Value.Right + (showMonitorIcons ? 50 + 22 * maxNumMonitors : 0), _originalTrayMenuArrowPadding.Value.Bottom)); } catch { // something went wrong with using reflection if (showMonitorIcons) { // add padding a hacky way var toAppend = " "; for (var i = 0; i < maxNumMonitors; i++) { toAppend += " "; } foreach (var menuItem in newMenuItems) { menuItem.Text += toAppend; } } } trayMenu.Items.Clear(); trayMenu.Items.AddRange(newMenuItems.ToArray()); }
private void UpdateRestoreChoicesInMenu() { // construct the new list of menu items, then populate them // this function is idempotent var snapshotsOldestFirst = new List<Snapshot>(CondenseSnapshots(m_snapshots, 20)); var newMenuItems = new List<ToolStripItem>(); var maxNumMonitors = 0; var maxNumMonitorPixels = 0L; var showMonitorIcons = false; foreach (var snapshot in snapshotsOldestFirst) { if (maxNumMonitors != snapshot.NumMonitors && maxNumMonitors != 0) { showMonitorIcons = true; } maxNumMonitors = Math.Max(maxNumMonitors, snapshot.NumMonitors); foreach (var monitorPixels in snapshot.MonitorPixelCounts) { maxNumMonitorPixels = Math.Max(maxNumMonitorPixels, monitorPixels); } } foreach (var snapshot in snapshotsOldestFirst) { var menuItem = new RightImageToolStripMenuItem(snapshot.GetDisplayString()); menuItem.Tag = snapshot; menuItem.Click += snapshot.Restore; menuItem.MouseEnter += SnapshotMousedOver; if (snapshot.UserInitiated) { menuItem.Font = new Font(menuItem.Font, FontStyle.Bold); } // monitor icons var monitorSizes = new List<float>(); if (showMonitorIcons) { foreach (var monitorPixels in snapshot.MonitorPixelCounts) { monitorSizes.Add((float)Math.Sqrt(((float)monitorPixels) / maxNumMonitorPixels)); } } menuItem.MonitorSizes = monitorSizes.ToArray(); newMenuItems.Add(menuItem); } newMenuItems.Add(justNowToolStripMenuItem); newMenuItems.Add(snapshotListStartLine); newMenuItems.Add(clearSnapshotsToolStripMenuItem); newMenuItems.Add(snapshotToolStripMenuItem); newMenuItems.Add(snapshotListEndLine); newMenuItems.Add(quitToolStripMenuItem); // if showing monitor icons: subtract 34 pixels from the right due to too much right padding try { var textPaddingField = typeof(ToolStripDropDownMenu).GetField("TextPadding", BindingFlags.NonPublic | BindingFlags.Static); if (!m_originalTrayMenuTextPadding.HasValue) { m_originalTrayMenuTextPadding = (Padding)textPaddingField.GetValue(trayMenu); } textPaddingField.SetValue(trayMenu, new Padding(m_originalTrayMenuTextPadding.Value.Left, m_originalTrayMenuTextPadding.Value.Top, m_originalTrayMenuTextPadding.Value.Right - (showMonitorIcons ? 34 : 0), m_originalTrayMenuTextPadding.Value.Bottom)); } catch { // something went wrong with using reflection // there will be extra hanging off to the right but that's okay } // if showing monitor icons: make the menu item width 50 + 22 * maxNumMonitors pixels wider than without the icons, to make room // for the icons try { var arrowPaddingField = typeof(ToolStripDropDownMenu).GetField("ArrowPadding", BindingFlags.NonPublic | BindingFlags.Static); if (!m_originalTrayMenuArrowPadding.HasValue) { m_originalTrayMenuArrowPadding = (Padding)arrowPaddingField.GetValue(trayMenu); } arrowPaddingField.SetValue(trayMenu, new Padding(m_originalTrayMenuArrowPadding.Value.Left, m_originalTrayMenuArrowPadding.Value.Top, m_originalTrayMenuArrowPadding.Value.Right + (showMonitorIcons ? 50 + 22 * maxNumMonitors : 0), m_originalTrayMenuArrowPadding.Value.Bottom)); } catch { // something went wrong with using reflection if (showMonitorIcons) { // add padding a hacky way var toAppend = " "; for (int i = 0; i < maxNumMonitors; i++) { toAppend += " "; } foreach (var menuItem in newMenuItems) { menuItem.Text += toAppend; } } } trayMenu.Items.Clear(); trayMenu.Items.AddRange(newMenuItems.ToArray()); }