/// <summary> /// モーションして移動する先を指定する /// </summary> /// <param name="nStep"></param> /// <param name="pos"></param> public void SetMotionPosition(PartsBase part, CodePos pos, int nStep) { lock (_tarPos) { _tarPos[part] = new TargetPosition(pos, nStep); } }
/// <summary> /// 指定パーツと重なっているパーツをすべて取得する /// </summary> /// <param name="partsClass">パーツのクラスタイプ typeof(object)で全て</param> /// <param name="tar">取得対象</param> /// <param name="rp">ペーン</param> /// <param name="checkIllustion"></param> /// <returns>パーツのコレクション</returns> public override ICollection <PartsBase> GetOverlappedParts(Type partsClass, PartsBase tar, IRichPane rp, bool checkIllustion) { //HACK: Slow GetOverlappedParts method var ret = new List <PartsBase>(); if (_data.TryGetValue(rp, out var layers)) { var lnos = _layerNos[rp]; for (var lnosid = 0; lnosid < lnos.Count; lnosid++) { if (_layerVisibleSwitch[lnos[lnosid]]) { var list = layers[lnos[lnosid]]; foreach (var dp in list) { var t = dp.GetType(); if (dp != tar && (t.Equals(partsClass) || t.IsSubclassOf(partsClass))) { if (IsOverlapped(rp, tar, rp, dp, checkIllustion)) { ret.Add(dp); } } } } } } return(ret); }
/// <summary> /// パーツ指定してレコードを取得する /// </summary> /// <param name="key">パーツ</param> /// <returns>レコード</returns> public RecordBase GetRecord(PartsBase key) { var ret = GetRecordOrNull(key); System.Diagnostics.Debug.Assert(ret != null, "リンク情報がありません"); return(ret); }
/// <summary> /// 追加処理 /// </summary> /// <param name="target"></param> /// <param name="value"></param> /// <param name="layerLevel"></param> private void _addProc(IRichPane target, PartsBase value, int layerLevel) { try { if (!_data.TryGetValue(target, out var layers)) { // ペーンを登録 _data.Add(target, new Layers()); // TONO _addProc(target, value, layerLevel); return; } if (!layers.TryGetValue(layerLevel, out var ps)) { // レイヤーを登録 makeNewLayer(target, layerLevel, layers); _addProc(target, value, layerLevel); return; } ps.Add(value); } catch (System.NullReferenceException) { _data[target] = new Layers(); _addProc(target, value, layerLevel); } }
/// <summary> /// パーツを追加する /// </summary> /// <param name="target"></param> /// <param name="value">追加するパーツ</param> /// <param name="layerLevel"></param> public override void Add(IRichPane target, PartsBase value, int layerLevel) { lock (_data) { base.Add(target, value, layerLevel); // 必須 _addProc(target, value, layerLevel); } }
/// <summary> /// パーツ指定してレコードを取得する(NULLを許可する) /// </summary> /// <param name="key">パーツ</param> /// <returns>レコード</returns> public RecordBase GetRecordOrNull(PartsBase key) { var rs = GetRecordset(key); if (rs.Count == 0) { return(null); } var e = rs.GetEnumerator(); var ret = e.MoveNext(); return((RecordBase)e.Current); }
/// <summary> /// 指定領域から特定位置のパーツを探す /// </summary> /// <param name="pos">位置</param> /// <param name="pane">検索ペーン</param> /// <param name="layer">検索レイヤー</param> /// <param name="isSelectableOnly">選択可能のみ</param> /// <returns>取得できたパーツ / null=なし</returns> public override PartsBase GetPartsAt(ScreenPos pos, IRichPane pane, int layer, bool isSelectableOnly) { PartsBase ret = null; if (_data.TryGetValue(pane, out var layers)) { if (layers.TryGetValue(layer, out var pcol)) { ret = getparts(pos, pane, isSelectableOnly, pcol, out var rp); } } return(ret); }
/// <summary> /// Enumeratorを構築する /// </summary> /// <param name="parent">targetが0件の時に適用されるペーン</param> /// <param name="target">dfPartsIllusionProjector型のリスト</param> /// <param name="parts">参照中のパーツ</param> internal PaneEnumerator(IRichPane parent, IList target, PartsBase parts) { _parent = parent; _dat = target; if (_dat != null) { if (_dat.Count > 0) { _parent = ((PartsIllusionProjector)_dat[0]).OriginalPane; } } _parts = parts; Reset(); }
/// <summary> /// 領域更新を予約する(プロジェクタをサポートしているので、これを使用してください) /// </summary> /// <param name="parts">更新するパーツ</param> /// <param name="rp">使用するペーン</param> public override void Invalidate(PartsBase parts, IRichPane rp) { try { foreach (IRichPane pp in PartsIllusionProjector.GetEnumerator(rp, getProjectors(rp, false), parts)) { base.Invalidate(parts, pp); } } catch (Exception e) { System.Diagnostics.Debug.WriteLine(e.Message); } }
/// <summary> /// 指定したパーツをペーン内、レイヤーないで最上に移動する /// </summary> /// <param name="tar">移動させるパーツ</param> public virtual void MovePartsZOrderToTop(PartsBase tar) { foreach (var layers in _data.Values) { foreach (var list in layers.Values) { if (list.Contains(tar)) { list.Remove(tar); list.Insert(list.Count, tar); return; } } } }
/// <summary> /// レイヤーを変更する /// </summary> /// <param name="pane"></param> /// <param name="layer_from"></param> /// <param name="parts"></param> /// <param name="layer_to"></param> public void MovePartsLayer(IRichPane pane, int layer_from, PartsBase parts, int layer_to) { var ls = _data[pane]; if (ls.TryGetValue(layer_from, out var listf) == false) { listf = new List <PartsBase>(); } if (ls.TryGetValue(layer_to, out var listt) == false) { listt = makeNewLayer(pane, layer_to, ls); } listf.Remove(parts); listt.Remove(parts); listt.Add(parts); }
/// <summary> /// 指定パーツを削除する /// </summary> /// <param name="value"></param> public override void Remove(PartsBase value) { base.Remove(value); // 必須 foreach (var layers in _data.Values) { foreach (var co in layers.Values) { if (co.Contains(value)) { co.Remove(value); return; } } } }
/// <summary> /// パーツを指定してインスタンスを初期化する /// </summary> /// <param name="parts"></param> /// <param name="pane"></param> public void AddParts(PartsBase parts, IRichPane pane, CodePos offset) { _lastDevelpType = DevelopType.Unknown; var p = new Pos3 { OrgPane = RichPaneBinder.CreateCopyComplete(pane), NowPane = pane, Org = (CodeRect)parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) //p.Org = (uCdRect)parts.Rect.Clone() - parts.GetCdPos(pane, _prevShift); // 符号化の座標(符号しない場合、単なるパーツ座標) Pre = (CodeRect)parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Now = (CodeRect)parts.Rect.Clone(), // 符号化の座標(符号しない場合、単なるパーツ座標) Offset = (CodePos)offset.Clone() }; base[parts] = p; }
/// <summary> /// 変更されたパーツの値をレコードに反映させる /// (このメソッドを行う度にUNDO対象とするかどうかは、IsAutoChunkStateで指定する)) /// </summary> /// <param name="parts">新しくなったパーツ</param> /// <returns>反映後レコード参照(参考)</returns> public ICollection Equalization(PartsBase parts) { System.Diagnostics.Debug.Assert(_adapterPtoRs.Count >= 0, "Equalizationするには、まずSetPRAdapterでアダプターを指定する必要があります"); var records = GetRecordset(parts); if (records.Count > 0) { foreach (RecordBase record in records) { foreach (var pra in _adapterPtoRs) { // パーツの値をレコードに反映 pra(parts, record); } } } return(records); }
/// <summary> /// 指定した二つのパーツの重なり判定をする /// </summary> /// <param name="p1">パーツ1</param> /// <param name="p2">パーツ2</param> /// <param name="isIllusionCheck">true = イリュージョンを考慮する</param> /// <returns>true = 重なっている / false = 重なっていない</returns> public override bool IsOverlapped(IRichPane pane1, PartsBase parts1, IRichPane pane2, PartsBase parts2, bool isIllusionCheck) { try { if (isIllusionCheck) { foreach (IRichPane pp1 in PartsIllusionProjector.GetEnumerator(pane1, getProjectors(pane1, false), parts1)) { var sr1 = parts1.GetScRect(pp1, parts1.Rect); foreach (IRichPane pp2 in PartsIllusionProjector.GetEnumerator(pane2, getProjectors(pane2, false), parts2)) { var sr2 = parts2.GetScRect(pp2, parts2.Rect); var union = sr1 & sr2; if (union != null) { return(true); } } } } else { if (pane1 == pane2) { var pt1 = parts1.GetPtRect(parts1.Rect); var pt2 = parts2.GetPtRect(parts2.Rect); return(pt1.IsIn(pt2)); } else { var sr1 = parts1.GetScRect(pane1, parts1.Rect); var sr2 = parts2.GetScRect(pane2, parts2.Rect); return(sr1.IsIn(sr2)); } } } catch (Exception e) { System.Diagnostics.Debug.WriteLine("IsOverlappedは次の例外でキャンセル; " + e.Message); } return(false); }
/// <summary> /// 描画させる(Paintイベントから実行されるため、ユーザーは実行禁止 /// </summary> public override void ProvideDrawFunction() { try { for (IDictionaryEnumerator de = _data.GetEnumerator(); de.MoveNext();) { var pane = (IRichPane)de.Key; pane.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // 全体に影響する描画処理 var clipRect = pane.GetPaintClipRect() & pane.GetPaneRect(); if (clipRect != null) // クリップとペイントの領域内のみ描画する { PartsBase.Mask(pane); // ペーン領域をマスクする //System.Diagnostics.Debug.WriteLine(clipRect.ToString()); using (Brush brush = new SolidBrush(pane.Control.BackColor)) { pane.Graphics.FillRectangle(brush, clipRect); // 背景を描画 } // レイヤーでループする var layers = (Layers)de.Value; var lnos = _layerNos[pane]; for (var layerid = 0; layerid < lnos.Count; layerid++) { if (_layerVisibleSwitch[lnos[layerid]]) { IEnumerable <PartsBase> pts = layers[lnos[layerid]]; // 描画する drawLayer(pane, lnos[layerid], pts); } } } } } catch (Exception e) { System.Diagnostics.Debug.WriteLine("描画中に例外;" + e.Message); } }
/// <summary> /// 指定パーツと重なっているパーツをすべて取得する /// </summary> /// <param name="partsClass">パーツのクラスタイプ typeof(object)で全て</param> /// <param name="tar">取得対象</param> /// <param name="rp">ペーン</param> /// <param name="checkIllustion"></param> /// <returns>パーツのコレクション</returns> public virtual ICollection <PartsBase> GetOverlappedParts(Type partsClass, PartsBase tar, IRichPane rp, bool checkIllustion) { return(new List <PartsBase>()); }
/// <summary> /// 指定パーツを削除する /// </summary> /// <param name="value"></param> public virtual void Remove(PartsBase value) { _removedParts.Add(value); }
/// このメソッドは消してください by Tono チェックアウトできなかったので、暫定 public ICollection Equalization(PartsBase parts, bool dummy) { return(Equalization(parts)); }
/// <summary> /// パーツを指定してリンク情報を削除する /// </summary> /// <param name="parts">削除するパーツ</param> public abstract void RemoveEquivalent(PartsBase parts);
public override ICollection GetRecordset(PartsBase key) { return(Const.ZeroCollection); }
public override void SetEquivalent(RecordBase record, PartsBase parts) { }
/// <summary> /// パーツ指定してレコードを取得する /// </summary> /// <param name="key">パーツ</param> /// <returns>レコードのコレクション</returns> public abstract ICollection GetRecordset(PartsBase key);
/// <summary> /// 指定したキーの移動情報を削除する /// </summary> /// <param name="key">削除する位置情報のパーツ</param> public void Remove(PartsBase key) { base.Remove(key); }
/// <summary> /// パーツを指定して POSを得る /// </summary> /// <param name="key"></param> /// <returns></returns> public Pos3 this[PartsBase key] => (Pos3) base[key];
/// <summary> /// 指定パーツを再描画要求する /// </summary> /// <param name="parts">再描画するパーツの領域</param> /// <param name="rp">指定パーツに属すリッチペーン</param> public virtual void Invalidate(PartsBase parts, IRichPane rp) { var r = ((ScreenRect)parts.GetScRect(rp, parts.Rect).GetPpSize()) & rp.GetPaneRect(); rp.Invalidate(r); }
/// <summary> /// 初期化コンストラクタ /// </summary> /// <param name="parts">パーツ</param> /// <param name="pane">ペーン</param> /// <param name="layerLevel">レベル値</param> public PartsEntry(PartsBase parts, IRichPane pane, int layerLevel) { Parts = parts; Pane = pane; LayerLevel = layerLevel; }
/// <summary> /// データのリンク情報を保存する /// </summary> /// <param name="record">テーブルのレコード</param> /// <param name="parts">パーツ</param> public abstract void SetEquivalent(RecordBase record, PartsBase parts);
/// <summary> /// パーツを追加する /// </summary> /// <param name="target">主ペーン</param> /// <param name="value">追加するパーツ</param> /// <param name="layerLevel">パーツのレイヤー(0が最下)</param> public virtual void Add(IRichPane target, PartsBase value, int layerLevel) { _addedParts.Add(new PartsCollectionBase.PartsEntry(value, target, layerLevel)); }
public override void RemoveEquivalent(PartsBase parts) { }