/// <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, @"本体の操作画面が見つかりませんでした。"); }
/// <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; }
/// <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, @"本体にトークトラックが追加されていません。"); }
/// <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); }
/// <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); }
/// <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);