Пример #1
0
        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());
        }
Пример #2
0
        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());
        }