Example #1
0
        /// <summary>
        /// コントロールパネルを取得する。
        /// </summary>
        /// <param name="kind">コントロールパネル種別の設定先。</param>
        /// <param name="root">
        /// ルートコントロール。 null ならばメソッド内で取得される。
        /// </param>
        /// <param name="appVisualTree">
        /// ビジュアルツリー走査用オブジェクト。 null ならばメソッド内で取得される。
        /// </param>
        /// <returns>コントロール。見つからないならば null 。</returns>
        public Result <dynamic> GetAny(
            out ControlPanelKind kind,
            dynamic root = null,
            WpfVisualTree appVisualTree = null)
        {
            kind = ControlPanelKind.None;

            // ルートコントロールを取得
            var rootCtrl = root;

            if (rootCtrl == null)
            {
                var rv = this.Root.Get();
                if (rv.Value == null)
                {
                    return(null, rv.Message);
                }
                rootCtrl = rv.Value;
            }

            // ビジュアルツリー走査用オブジェクトを取得
            var vtree = appVisualTree ?? this.AppVisualTreeGetter();

            if (vtree == null)
            {
                return(null, @"本体の情報を取得できません。");
            }

            try
            {
                var editor = vtree.GetDescendant(rootCtrl.Children[3], 0, 0);
                try
                {
                    var panel = editor.Content;

                    kind =
                        ((int)panel.Children.Count < 4) ?
                        ControlPanelKind.None : ControlPanelKind.Talk;
                    return(panel, null);
                }
                catch
                {
                    // ソング用は階層構造が異なる
                    kind = ControlPanelKind.Song;
                    return(editor.Child.Content, null);
                }
            }
            catch (Exception ex)
            {
                ThreadTrace.WriteException(ex);
            }

            kind = ControlPanelKind.None;
            return(null, @"本体の操作画面が見つかりませんでした。");
        }
Example #2
0
        /// <summary>
        /// セリフデータグリッドを取得する。
        /// </summary>
        /// <param name="controlPanel">
        /// コントロールパネル。 null ならばメソッド内で取得される。
        /// </param>
        /// <param name="appVisualTree">
        /// ビジュアルツリー走査用オブジェクト。 null ならばメソッド内で取得される。
        /// </param>
        /// <returns>コントロール。見つからないか取得できない状態ならば null 。</returns>
        public Result <WpfDataGrid> Get(
            dynamic controlPanel        = null,
            WpfVisualTree appVisualTree = null)
        {
            // コントロールパネルを取得
            var ctrlPanel = controlPanel;

            if (ctrlPanel == null)
            {
                var cv = this.ControlPanel.GetTalk();
                if (cv.Value == null)
                {
                    return(null, cv.Message);
                }
                ctrlPanel = cv.Value;
            }

            // ビジュアルツリー走査用オブジェクトを取得
            var vtree = appVisualTree ?? this.AppVisualTreeGetter();

            if (vtree == null)
            {
                return(null, @"本体の情報を取得できません。");
            }

            try
            {
                var dataGrid =
                    new WpfDataGrid(ctrlPanel.Children[0].Content.Children[0], vtree);

                // コンテキストメニューを初期化して取得
                var menu = InitializeContextMenu(dataGrid);
                if (menu == null)
                {
                    return(null, @"本体のセリフ一覧表を初期化できません。");
                }

                // キャスト列を表示させる
                var castItem = FindCastMenuItem(menu);
                if (castItem == null)
                {
                    return(null, @"本体のセリフ一覧表を初期化できません。");
                }
                castItem.IsChecked = true;

                return(dataGrid);
            }
            catch (Exception ex)
            {
                ThreadTrace.WriteException(ex);
            }
            return(null, @"本体のセリフ一覧表が見つかりません。");
        }
        public WpfNumericAxisControl()
        {
            string test = nameof(WpfRenderingVisualTree);

            AbcVisualTree visualTree = null;

            if (test == nameof(WpfVisualTree))
            {
                visualTree = new WpfVisualTree();
            }
            else if (test == nameof(WpfRenderingVisualTree))
            {
                visualTree = new WpfRenderingVisualTree();
            }

            this.controlCoordinator = new WpfControlCoordinator <AbcNumericAxisControl>(this, new AbcNumericAxisControl(), visualTree);
            this.controlCoordinator.abcControl.UserMin  = this.Minimum;
            this.controlCoordinator.abcControl.UserMax  = this.Maximum;
            this.controlCoordinator.abcControl.UserStep = this.Step;
        }
Example #4
0
        /// <summary>
        /// トーク用コントロールパネルを取得する。
        /// </summary>
        /// <param name="root">
        /// ルートコントロール。 null ならばメソッド内で取得される。
        /// </param>
        /// <param name="appVisualTree">
        /// ビジュアルツリー走査用オブジェクト。 null ならばメソッド内で取得される。
        /// </param>
        /// <returns>コントロール。見つからないか取得できない状態ならば null 。</returns>
        public Result <dynamic> GetTalk(
            dynamic root = null,
            WpfVisualTree appVisualTree = null)
        {
            // ルートコントロールを取得
            var rootCtrl = root;

            if (rootCtrl == null)
            {
                var rv = this.Root.Get();
                if (rv.Value == null)
                {
                    return(null, rv.Message);
                }
                rootCtrl = rv.Value;
            }

            // コントロールパネル取得
            var(panel, panelMessage) =
                this.GetAny(out var kind, (DynamicAppVar)rootCtrl, appVisualTree);
            if (panel == null)
            {
                return(null, panelMessage);
            }

            // 既にトーク用トラック選択中ならそのまま返す
            if (kind == ControlPanelKind.Talk)
            {
                return(panel);
            }

            // トラック選択変更不可なら失敗扱い
            if (!this.CanChangeTrackGetter())
            {
                return(null, @"本体のトークトラックが選択されていません。");
            }

            // トラックセレクタ取得
            var(trackSelector, trackSelectorMessage) =
                this.Root.TrackSelector.Get((DynamicAppVar)rootCtrl);
            if (trackSelector == null)
            {
                return(null, trackSelectorMessage);
            }

            // トーク用トラックを選択する
            int?selectedIndex = null;

            try
            {
                // selector の Items[N].Category でトーク用/ソング用を判別できるが、
                // CeVIO定義の型を参照することになるのでやめておく。

                selectedIndex = (int)trackSelector.SelectedIndex;

                var count = (int)trackSelector.Items.Count;
                for (int ii = 0; ii < count; ++ii)
                {
                    // 元々選択していたものはトーク用ではないのでスキップ
                    if (ii == selectedIndex.Value)
                    {
                        continue;
                    }

                    // トラック選択変更
                    trackSelector.SelectedIndex = ii;

                    // 改めてコントロールパネル取得
                    (panel, panelMessage) =
                        this.GetAny(out kind, (DynamicAppVar)rootCtrl, appVisualTree);
                    if (panel == null)
                    {
                        return(null, panelMessage);
                    }

                    if (kind == ControlPanelKind.Talk)
                    {
                        selectedIndex = null; // finally での戻し処理を行わせない
                        return(panel, null);
                    }
                }
            }
            catch (Exception ex)
            {
                ThreadTrace.WriteException(ex);
            }
            finally
            {
                // トーク用トラックが見つからなければ選択を元に戻しておく
                // 失敗してもよい
                if (selectedIndex.HasValue)
                {
                    try
                    {
                        trackSelector.SelectedIndex = selectedIndex.Value;
                    }
                    catch (Exception ex)
                    {
                        ThreadDebug.WriteException(ex);
                    }
                }
            }

            return(null, @"本体にトークトラックが追加されていません。");
        }
Example #5
0
        /// <summary>
        /// <see cref="Talker.ProcessParameterSliders{T}"/> の実処理を行う。
        /// </summary>
        /// <typeparam name="T">処理結果値の型。</typeparam>
        /// <param name="mainWindow">メインウィンドウ。</param>
        /// <param name="visualTree">ビジュアルツリー走査用オブジェクト。</param>
        /// <param name="executer">
        /// 処理デリゲート。
        /// 戻り値の Message は成功ならば null 、失敗ならばエラーメッセージとすること。
        /// </param>
        /// <param name="targetIds">処理対象パラメータID列挙。 null ならばすべて対象。</param>
        /// <returns></returns>
        public Result <Dictionary <ParameterId, T> > Execute <T>(
            dynamic mainWindow,
            WpfVisualTree visualTree,
            Executer <T> executer,
            IEnumerable <ParameterId> targetIds = null)
        {
            ArgumentValidation.IsNotNull(mainWindow, nameof(mainWindow));
            ArgumentValidation.IsNotNull(visualTree, nameof(visualTree));
            ArgumentValidation.IsNotNull(executer, nameof(executer));

            // タブコントロールを取得
            dynamic tabControl;

            try
            {
                tabControl = mainWindow.Content.Children[1].Children[2];
            }
            catch (Exception ex)
            {
                ThreadTrace.WriteException(ex);
                return(null, @"本体のタブページが見つかりません。");
            }

            // タブアイテムコレクションを取得
            dynamic tabItems;

            try
            {
                tabItems = tabControl.Items;
            }
            catch (Exception ex)
            {
                ThreadTrace.WriteException(ex);
                return(null, @"本体のタブページが見つかりません。");
            }

            var results = new Dictionary <ParameterId, T>();

            var targetInfos = MakeGuiGroupTargetInfos(targetIds);

            // マスタータブ
            var masterGroups = new[] { GuiGroup.MasterEffect, GuiGroup.MasterPause };

            if (masterGroups.Any(g => targetInfos[g].IdIndices.Any()))
            {
                var sliders = new Dictionary <ParameterId, dynamic>();

                try
                {
                    var panelsParent =
                        tabItems[0].Content.Content.Children[0].Content.Children;
                    foreach (var group in masterGroups)
                    {
                        AddLogicalSlidersTo(panelsParent, targetInfos[group], sliders);
                    }
                }
                catch (Exception ex)
                {
                    ThreadTrace.WriteException(ex);
                    return(null, @"本体のマスタータブのスライダーが見つかりませんでした。");
                }

                var message = ApplyExecuter(sliders, executer, results);
                if (message != null)
                {
                    return(null, message);
                }
            }

            // ボイスタブ
            var presetEffectTargetInfo  = targetInfos[GuiGroup.PresetEffect];
            var presetEmotionTargetInfo = targetInfos[GuiGroup.PresetEmotion];

            if (
                presetEffectTargetInfo.IdIndices.Any() ||
                presetEmotionTargetInfo.IdIndices.Any())
            {
                var sliders  = new Dictionary <ParameterId, dynamic>();
                int tabIndex = -1;

                try
                {
                    try
                    {
                        var panelsParent =
                            tabItems[1].Content.Content.Children[2].Content.Children;

                        // 音声効果
                        AddLogicalSlidersTo(panelsParent, presetEffectTargetInfo, sliders);

                        // 現在のタブインデックスを保存
                        tabIndex = (int)tabControl.SelectedIndex;

                        // 感情
                        AddPresetEmotionSlidersTo(
                            tabControl,
                            panelsParent,
                            visualTree,
                            presetEmotionTargetInfo,
                            sliders);
                    }
                    catch (Exception ex)
                    {
                        ThreadTrace.WriteException(ex);
                        return(
                            null,
                            @"本体のボイスタブのスライダーが見つかりませんでした。");
                    }

                    var message = ApplyExecuter(sliders, executer, results);
                    if (message != null)
                    {
                        return(null, message);
                    }
                }
                finally
                {
                    // 元のタブを選択する
                    // 失敗してもよい
                    if (tabIndex >= 0)
                    {
                        try
                        {
                            tabControl.SelectedIndex = tabIndex;
                        }
                        catch (Exception ex)
                        {
                            ThreadDebug.WriteException(ex);
                        }
                    }
                }
            }

            return(results);
        }
Example #6
0
        /// <summary>
        /// パラメータスライダー群を取得する。
        /// </summary>
        /// <param name="targetParameterIds">
        /// 取得対象パラメータID列挙。 null ならばすべて対象。
        /// </param>
        /// <param name="operationPanel">
        /// 操作パネル。 null ならばメソッド内で取得される。
        /// </param>
        /// <param name="appVisualTree">
        /// ビジュアルツリー走査用オブジェクト。 null ならばメソッド内で取得される。
        /// </param>
        /// <returns>
        /// スライダーのディクショナリ。見つからないか取得できない状態ならば null 。
        /// </returns>
        public Result <Dictionary <ParameterId, dynamic> > Get(
            IEnumerable <ParameterId> targetParameterIds = null,
            dynamic operationPanel      = null,
            WpfVisualTree appVisualTree = null)
        {
            var dict = new Dictionary <ParameterId, dynamic>();

            var effectIdIndices =
                (targetParameterIds == null) ?
                AllEffectIdIndices :
                AllEffectIdIndices.Where(v => targetParameterIds.Contains(v.id));
            var emotionIds =
                (targetParameterIds ?? ParameterIdExtension.AllValues)
                .Where(id => id.IsEmotion());

            if (effectIdIndices.Any() || emotionIds.Any())
            {
                // 操作パネルを取得
                var opePanel = operationPanel;
                if (opePanel == null)
                {
                    var ov = this.OperationPanel.Get();
                    if (ov.Value == null)
                    {
                        return(null, ov.Message);
                    }
                    opePanel = ov.Value;
                }

                // ビジュアルツリー走査用オブジェクトを取得
                var vtree = appVisualTree ?? this.AppVisualTreeGetter();
                if (vtree == null)
                {
                    return(null, @"本体の情報を取得できません。");
                }

                try
                {
                    var panelChildren =
                        opePanel
                        .Children[1]        // Border
                        .Child              // DockPanel
                        .Children[0]        // StackPanel
                        .Children;

                    // 音声効果
                    if (effectIdIndices.Any())
                    {
                        var border = vtree.GetDescendant(panelChildren[0], 0);
                        var panel  = vtree.GetDescendant(border.Child, 0);

                        foreach (var ii in effectIdIndices)
                        {
                            var sliderPanel =
                                vtree.GetDescendant(panel.Children[ii.index], 0);
                            dict.Add(ii.id, sliderPanel.Children[1]);
                        }
                    }

                    // 感情
                    if (emotionIds.Any())
                    {
                        var border = vtree.GetDescendant(panelChildren[2], 0);
                        var panel  = vtree.GetDescendant(border.Child, 0);

                        foreach (var c in panel.Children)
                        {
                            var sliderPanel = vtree.GetDescendant(c, 0);

                            // 感情名からパラメータID検索
                            var name = (string)sliderPanel.Children[0].Child.Text;
                            var id   = ParameterIdExtension.FindEmotionByDisplayName(name);

                            if (id.HasValue && emotionIds.Contains(id.Value))
                            {
                                dict.Add(id.Value, sliderPanel.Children[1]);
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    ThreadTrace.WriteException(ex);
                    return(null, @"本体のパラメータスライダー群が見つかりません。");
                }
            }

            return(dict);
        }
Example #7
0
 /// <summary>
 /// ルートコントロールを取得する。
 /// </summary>
 /// <param name="mainWindow">
 /// メインウィンドウ。 null ならばメソッド内で取得される。
 /// </param>
 /// <param name="appVisualTree">
 /// ビジュアルツリー走査用オブジェクト。 null ならばメソッド内で取得される。
 /// </param>
 /// <returns>コントロール。見つからないか非表示ならば null 。</returns>
 public Result<dynamic> Get(
     dynamic mainWindow = null,
     WpfVisualTree appVisualTree = null) =>
     this.Get(out var _, (DynamicAppVar)mainWindow, appVisualTree);