public void Initialize()
        {
            //!< 初期化フラグOn
            _initialized = true;
            //!< コンフィグファイルを読み込む
            var setting = _babumiConfigRepository.GetConfig();

            try
            {
                CharacterNotify.Instance.WindowResizeMessage(setting.ZoomLevel);
            }
            catch (Exception e)
            {
                Messenger.Raise(new CloseMessage(true, e.Message, "Error"));
            }
            //!< Windowの最前面かどうかをコンフィグから設定
            TopMostMessageSend(setting.Topmost);
            //!< 起動時に例外処理をしているので必ずnullではないと思うのだけど...
            Messenger.Raise(new CloseMessage(setting == null, "Configファイルを正しく読み込めてない可能性があるため終了します", "InfoMessage"));
            //!< GLのバージョンを表示してアプリケーションを終了する
            Messenger.Raise(new CloseMessage(
                                setting.RequiredVersion > GraphicsManager.Instance.GetVersion(),
                                string.Format("GL_VENDOR: {0} \nGL_RENDERER : {1} \nGL_VERSION : {2} \nOpenGLのバージョンが4.3以下です!\nコンピュートシェーダに対応していないため終了します",
                                              GraphicsManager.Instance.mVender,
                                              GraphicsManager.Instance.mRender,
                                              GraphicsManager.Instance.mVersion),
                                "InfoMessage"));
        }
        public LauncherMenuViewModel(MenuItemViewModel vm, Util.Math.Point screenSize)
        {
            _babumiConfigRepository = ServiceLocator.Instance.GetInstance <BabumiConfigRepository>();
            MenuVM          = vm;
            IsOpen          = true;
            ScreenSize      = screenSize;
            this.ItemSource = new List <RadialMenu.Controls.RadialMenuItem>();

            Func <LauncherSettingsDataSet, Tuple <WrapPanel, ICommand> > createItem = new Func <LauncherSettingsDataSet, Tuple <WrapPanel, ICommand> >((LauncherSettingsDataSet item ) =>
            {
                var wrapPanel = new WrapPanel();
                System.Windows.Controls.Image soruce = new System.Windows.Controls.Image();
                soruce.Source         = Imaging.CreateBitmapSourceFromHIcon(Icon.ExtractAssociatedIcon(item.Path).Handle, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                wrapPanel.Orientation = Orientation.Vertical;
                wrapPanel.Children.Add(soruce);
                wrapPanel.Children.Add(new TextBlock {
                    Text = item.DisplayName
                });
                return(new Tuple <WrapPanel, ICommand>(wrapPanel, new ViewModelCommand(() => { Process.Start(item.Path); })));
            });

            foreach (var launcherItem in _babumiConfigRepository.GetConfig().Dataset)
            {
                var item = createItem(launcherItem);
                this.ItemSource.Add(new RadialMenu.Controls.RadialMenuItem
                {
                    Content = item.Item1,
                    Command = item.Item2
                });
            }
        }
        /// <summary>
        /// ウィンドウサイズを変更する
        /// </summary>
        /// <param name="windowSize"></param>
        public void WindowResizeMessage(int zoomLevel)
        {
            const double VIEW_ANGLE = System.Math.PI / 4;
            var          setting    = _babumiConfigRepository.GetConfig();
            var          screenSize = new Point();
            double       x          = 0.1 / (2.0 * 1.0 * System.Math.Tan(VIEW_ANGLE / 2));
            double       d          = 1 / (1 - (x * System.Math.Abs(zoomLevel)) * System.Math.Tan(VIEW_ANGLE / 2) * 2);

            if (d == 0.0)
            {
                //!< 異常値なので終了させる
                WindowSizeMessageSubject.OnError(new Exception("Scale計算で異常値を検出しました"));
            }
            if (zoomLevel >= 0)
            {
                screenSize = setting.WindowSizeOrigin * new Point(d);
            }
            else
            {
                screenSize = setting.WindowSizeOrigin * new Point(1 / d);
            }
            //!< 10の倍数に補正(描画がおかしくなるので)
            //!< dが0.0でなければここで0割りが発生することはないはずなのでエラー処理はない
            screenSize = new Point {
                X = (screenSize.X + 10 - (screenSize.X % 10)), Y = (screenSize.Y + 10 - (screenSize.Y % 10))
            };
            WindowSizeMessageSubject.OnNext(screenSize);
        }
        public LauncherSettingViewModel()
        {
            _listCollection         = new ObservableCollection <LauncherItem>();
            _babumiConfigRepository = ServiceLocator.Instance.GetInstance <BabumiConfigRepository>();
            var config = _babumiConfigRepository.GetConfig();

            LaucnherItemAdd(config.Dataset.Select(e => e.Path).ToArray());
        }
        public void OnClose()
        {
            var config = _babumiConfigRepository.GetConfig();

            config.Dataset.Clear();
            foreach (var item in ListCollection)
            {
                config.Dataset.Add(new LauncherSettingsDataSet
                {
                    DisplayName = item.DisplayName,
                    Path        = item.Path
                });
            }
            config.Dataset = config.Dataset.Distinct().ToList();
            _babumiConfigRepository.Save(config);
        }