Пример #1
0
        private void MenuViewFormUpdate(bool setWindowLocation = true)
        {
            appsListView.BeginUpdate();
            try
            {
                appsListView.Items.Clear();
                appsListView.SmallImageList?.Images.Clear();
                if (!appsListView.Scrollable)
                {
                    appsListView.Scrollable = true;
                }

                var largeImages = Settings.Window.LargeImages;
                imageList.Images.Clear();
                foreach (var appData in CacheData.CurrentAppInfo)
                {
                    var key = appData.Key;
                    if (string.IsNullOrWhiteSpace(key))
                    {
                        continue;
                    }

                    var name = appData.Name;
                    if (string.IsNullOrWhiteSpace(name))
                    {
                        continue;
                    }

                    Image image;
                    if (CacheData.CurrentImages.ContainsKey(key))
                    {
                        image = CacheData.CurrentImages[key];
                        goto Finalize;
                    }
                    if (CacheData.AppImages.ContainsKey(key))
                    {
                        image = CacheData.AppImages[key];
                        goto UpdateCache;
                    }

                    var exePath = appData.FilePath;
                    if (!File.Exists(exePath))
                    {
                        continue;
                    }
                    try
                    {
                        var imgPath   = Path.ChangeExtension(exePath, ".ico");
                        var indicator = largeImages ? 32 : 16;
                        if (File.Exists(imgPath))
                        {
                            exePath = imgPath;
                            goto FromFile;
                        }
                        imgPath = Path.ChangeExtension(exePath, ".png");
                        if (!File.Exists(imgPath))
                        {
                            var appDir = Path.GetDirectoryName(exePath);
                            var imgDir = Path.Combine(appDir, "App\\AppInfo");
                            if (largeImages)
                            {
                                var sizes = new[] { 32, 40, 48, 64, 96, 128, 256 };
                                foreach (var size in sizes)
                                {
                                    imgPath = Path.Combine(imgDir, $"appicon_{size}.png");
                                    if (File.Exists(imgPath))
                                    {
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                imgPath = Path.Combine(imgDir, "appicon_16.png");
                            }
                        }
                        if (File.Exists(imgPath))
                        {
                            image = Image.FromFile(imgPath);
                            if (image != default)
                            {
                                if (image.Width != image.Height || image.Width != indicator)
                                {
                                    image = image.Redraw(indicator, indicator);
                                }
                                goto UpdateCache;
                            }
                        }
                        if (exePath.EndsWithEx(".bat", ".cmd", ".jse", ".vbe", ".vbs"))
                        {
                            image = CacheData.GetSystemImage(ImageResourceSymbol.CommandPrompt, largeImages);
                            goto UpdateCache;
                        }
FromFile:
                        using (var ico = ResourcesEx.GetIconFromFile(exePath, 0, largeImages))
                        {
                            image = ico?.ToBitmap()?.Redraw(indicator, indicator);
                            if (image != default)
                            {
                                goto UpdateCache;
                            }
                        }
                    }
                    catch (Exception ex) when(ex.IsCaught())
                    {
                        Log.Write(ex);
                    }

                    image = CacheData.GetSystemImage(ImageResourceSymbol.Application, largeImages);
                    if (image == default)
                    {
                        continue;
                    }

UpdateCache:
                    if (!CacheData.CurrentImages.ContainsKey(key))
                    {
                        CacheData.CurrentImages.Add(key, image);
                    }

Finalize:
                    imageList.Images.Add(image);
                    appsListView.Items.Add(name, imageList.Images.Count - 1);
                }

                if (largeImages)
                {
                    imageList.ImageSize = new Size(32, 32);
                }
                appsListView.SmallImageList = imageList;
                CacheData.UpdateCurrentImagesFile();

                if (!setWindowLocation)
                {
                    return;
                }
                var taskbarLocation = TaskBar.GetLocation(Handle);
                if (Settings.Window.DefaultPosition == 0 && taskbarLocation != TaskBarLocation.Hidden)
                {
                    var screen = Screen.PrimaryScreen.WorkingArea;
                    foreach (var scr in Screen.AllScreens)
                    {
                        if (!scr.Bounds.Contains(Cursor.Position))
                        {
                            continue;
                        }
                        screen = scr.WorkingArea;
                        break;
                    }
                    switch (taskbarLocation)
                    {
                    case TaskBarLocation.Left:
                    case TaskBarLocation.Top:
                        Left = screen.X;
                        Top  = screen.Y;
                        break;

                    case TaskBarLocation.Right:
                        Left = screen.Width - Width;
                        Top  = screen.Y;
                        break;

                    default:
                        Left = screen.X;
                        Top  = screen.Height - Height;
                        break;
                    }
                }
                else
                {
                    Left = Cursor.Position.X - Width / 2;
                    Top  = Cursor.Position.Y - Height / 2;
                    if (!WinApi.NativeHelper.WindowIsOutOfScreenArea(Handle, out var newRect))
                    {
                        return;
                    }
                    Left = newRect.X;
                    Top  = newRect.Y;
                }
            }
            finally
            {
                appsListView.EndUpdate();
                appsCount.Text = string.Format(CultureInfo.InvariantCulture, Language.GetText(appsCount), appsListView.Items.Count, appsListView.Items.Count == 1 ? Language.GetText(nameof(en_US.App)) : Language.GetText(nameof(en_US.Apps)));
                if (!appsListView.Focus())
                {
                    appsListView.Select();
                }
            }
        }
Пример #2
0
        private void MenuViewForm_Update(bool setWindowLocation = true)
        {
            Main.CheckAvailableApps();
            appsListView.BeginUpdate();
            try
            {
                appsListView.Items.Clear();
                if (!appsListView.Scrollable)
                {
                    appsListView.Scrollable = true;
                }

                imgList.Images.Clear();

                var cachePath = Path.Combine(Main.TmpDir, "images.dat");
                var cacheDict = new Dictionary <string, Image>();
                var cacheSize = 0;

                string dictPath = null;
                Dictionary <string, Image> imgDict = null;
                Image defExeIcon = null;

                for (var i = 0; i < Main.AppsInfo.Count; i++)
                {
                    var appInfo  = Main.AppsInfo[i];
                    var longName = appInfo.LongName;
                    if (string.IsNullOrWhiteSpace(longName))
                    {
                        continue;
                    }

                    appsListView.Items.Add(longName, i);
                    var shortName = appInfo.ShortName;
                    if (File.Exists(cachePath))
                    {
                        if (cacheDict?.Any() != true)
                        {
                            cacheDict = File.ReadAllBytes(cachePath).DeserializeObject <Dictionary <string, Image> >();
                            cacheSize = cacheDict.Count;
                        }
                        if (cacheDict?.ContainsKey(shortName) == true)
                        {
                            var img = cacheDict[shortName];
                            imgList.Images.Add(shortName, img);
                            continue;
                        }
                    }

                    if (dictPath == null)
                    {
                        dictPath = PathEx.Combine(PathEx.LocalDir, "Assets\\images.dat");
                    }
                    if (!File.Exists(dictPath))
                    {
                        goto TryHard;
                    }
                    if (imgDict == null)
                    {
                        imgDict = File.ReadAllBytes(dictPath).DeserializeObject <Dictionary <string, Image> >();
                    }
                    if (imgDict == null)
                    {
                        goto TryHard;
                    }
                    if (imgDict?.ContainsKey(shortName) == true)
                    {
                        var img = imgDict[shortName];
                        imgList.Images.Add(shortName, img);
                        cacheDict.Add(shortName, img);
                        continue;
                    }

TryHard:
                    try
                    {
                        var   exePath = appInfo.ExePath;
                        var   imgPath = Path.ChangeExtension(exePath, ".png");
                        Image img;
                        if (!string.IsNullOrEmpty(imgPath) && File.Exists(imgPath))
                        {
                            img = Image.FromFile(imgPath);
                            imgList.Images.Add(shortName, img);
                            cacheDict.Add(shortName, img);
                            continue;
                        }
                        var appDir = Path.GetDirectoryName(exePath);
                        if (!string.IsNullOrEmpty(appDir) && !File.Exists(imgPath))
                        {
                            imgPath = Path.Combine(appDir, "App\\AppInfo\\appicon_16.png");
                        }
                        if (!string.IsNullOrEmpty(imgPath) && File.Exists(imgPath))
                        {
                            img = Image.FromFile(imgPath)?.Redraw(16, 16);
                            imgList.Images.Add(shortName, img);
                            cacheDict.Add(shortName, img);
                            continue;
                        }
                        using (var ico = ResourcesEx.GetIconFromFile(exePath))
                        {
                            img = ico?.ToBitmap()?.Redraw(16, 16);
                            if (img == null)
                            {
                                goto Default;
                            }
                            imgList.Images.Add(shortName, img);
                            cacheDict.Add(shortName, img);
                            continue;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Write(ex);
                    }

Default:
                    if (defExeIcon == null)
                    {
                        defExeIcon = ResourcesEx.GetSystemIcon(ResourcesEx.IconIndex.ExeFile, Main.SystemResourcePath)?.ToBitmap().Redraw(16, 16);
                    }
                    if (defExeIcon == null)
                    {
                        continue;
                    }
                    imgList.Images.Add(shortName, defExeIcon);
                }

                appsListView.SmallImageList = imgList;
                if (cacheDict.Count > 0 && (cacheDict.Count != cacheSize || !File.Exists(cachePath)))
                {
                    File.WriteAllBytes(cachePath, cacheDict.SerializeObject());
                }

                if (!setWindowLocation)
                {
                    return;
                }
                var defaultPos      = Ini.Read("Settings", "Window.DefaultPosition", 0);
                var taskbarLocation = TaskBar.GetLocation(Handle);
                if (defaultPos == 0 && taskbarLocation != TaskBar.Location.Hidden)
                {
                    var screen = Screen.PrimaryScreen.WorkingArea;
                    foreach (var scr in Screen.AllScreens)
                    {
                        if (!scr.Bounds.Contains(Cursor.Position))
                        {
                            continue;
                        }
                        screen = scr.WorkingArea;
                        break;
                    }
                    switch (taskbarLocation)
                    {
                    case TaskBar.Location.Left:
                    case TaskBar.Location.Top:
                        Left = screen.X;
                        Top  = screen.Y;
                        break;

                    case TaskBar.Location.Right:
                        Left = screen.Width - Width;
                        Top  = screen.Y;
                        break;

                    default:
                        Left = screen.X;
                        Top  = screen.Height - Height;
                        break;
                    }
                }
                else
                {
                    var newLocation = GetWindowStartPos(new Point(Width, Height));
                    Left = newLocation.X;
                    Top  = newLocation.Y;
                }
            }
            finally
            {
                appsListView.EndUpdate();
                appsCount.Text = string.Format(Lang.GetText(appsCount), appsListView.Items.Count, appsListView.Items.Count == 1 ? Lang.GetText(nameof(en_US.App)) : Lang.GetText(nameof(en_US.Apps)));
                if (!appsListView.Focus())
                {
                    appsListView.Select();
                }
            }
        }