public override bool Draw(IRichPane rp) { if (IsMasking) { var sr = rp.GetPaneRect(); rp.Graphics.DrawString("PAUSE", _font, Brushes.DarkGray, sr.LT.X + 48, sr.RB.Y - 42); } else { // Left side RED curtain var sr = rp.GetPaneRect(); var W = 240; var rc1 = ScreenRect.FromLTWH(sr.LT.X, sr.LT.Y, W, sr.Height); rp.Graphics.FillRectangle(new LinearGradientBrush(new Point(0, 0), new PointF(W, 0), Color.FromArgb(128, 255, 0, 0), Color.FromArgb(0, 255, 0, 0)), rc1); // Now pointer RED curtain var now = DateTime.Now; now = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second); var rc2 = GetScRect(rp, CodeRect.FromLTRB((int)(now - Hot.FirstSpeech).TotalSeconds, 0, 0, 0)); rc2 = ScreenRect.FromLTRB(rc2.LT.X, sr.LT.Y, sr.RB.X, sr.RB.Y); rp.Graphics.FillRectangle(new LinearGradientBrush(new Point(rc2.LT.X, rc2.LT.Y), new PointF(rc2.RB.X, rc2.RB.Y), Color.FromArgb(8, 255, 0, 0), Color.FromArgb(96, 255, 0, 0)), rc2); // REC LABEL if (++_cnt % 2 == 0) { rp.Graphics.DrawString("REC", _font, Brushes.Yellow, sr.LT.X + 48, sr.RB.Y - 42); } } return(true); }
/// <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="rp">ペーン</param> /// <returns>true = 調査範囲が描画クリップ内 / false = そうでない</returns> public bool isInClip(IRichPane rp) { var rect = GetScRect(rp, Rect); var r = rect & rp.GetPaneRect(); return(r != null); }
/// <summary> /// 初期化コンストラクタ /// </summary> public PartsCollection(IRichPane pane, ICollection <PartsBase> tars) : base() { foreach (var pt in tars) { Add(pane, pt); } }
/// <summary> /// 指定したパーツコレクションから、該当するパーツを検索する /// </summary> /// <param name="pos"></param> /// <param name="pane"></param> /// <param name="isSelectableOnly"></param> /// <param name="pcol"></param> /// <param name="rp">ペーンを返す(イリュージョンプロジェクタのペーンが返るので、paneと異なる場合がある)</param> /// <returns></returns> private PartsBase getparts(ScreenPos pos, IRichPane pane, bool isSelectableOnly, IList pcol, out IRichPane rp) { for (var pidx = pcol.Count - 1; pidx >= 0; pidx--) { var dp = (PartsBase)pcol[pidx]; if (dp is IPartsVisible) { if (((IPartsVisible)dp).Visible == false) { continue; } } if (isSelectableOnly) { if (dp is IPartsSelectable == false) { continue; } } // プロジェクタを通して、パーツ座標を調査する foreach (IRichPane pp in PartsIllusionProjector.GetEnumerator(pane, getProjectors(pane, false), dp)) { if (dp.IsOn(pos, pp) != PartsBase.PointType.Outside) { rp = pp; return(dp); } } } rp = null; return(null); }
public override void Add(IRichPane target, PartsBase value, int layerLevel) { lock (SyncRoot) { base.Add(target, value, layerLevel); } }
/// <summary> /// 使用するペーンを指定する /// 記述例: Pane=Resource /// </summary> /// <param name="param"></param> public override void ParseParameter(string param) { base.ParseParameter(param); var coms = new List <string>(StrUtil.SplitTrim(param, ";")); foreach (var com in coms) { var ops = new List <string>(StrUtil.SplitTrim(com, "=")); if (ops.Count == 2) { if (ops[0].ToUpper() == "PANE") { _tarPane = Pane.GetPane(ops[1]); } if (ops[0].ToUpper() == "SPEED") { try { _speed = double.Parse(ops[1]); if (_speed == 0.0 || Math.Abs(_speed) > 1000) { throw new Exception(); } } catch (Exception e) { Debug.Assert(false, GetType().Name + " : 'Speed' Parameter syntax error\r\nusage : Speed=<value>\r\nvalue> 1.0=Normal speed / 0.5=Half.(max 1000)"); throw e.InnerException; } } } } }
/// <summary> /// BMPキャッシュ機能を追加したレイヤー描画 /// </summary> /// <param name="pane"></param> /// <param name="layerid"></param> /// <param name="pts"></param> protected override void drawLayer(IRichPane pane, int layerid, IEnumerable <PartsBase> pts) { if (_enabledLayers.ContainsKey(layerid)) { if (bmps.ContainKeys(pane, layerid) == false) { var pr = MotherPane.GetPaneRect(); bmps[pane, layerid] = new Bitmap(pr.Width, pr.Height); } var bmp = bmps[pane, layerid]; if (EnableShot == false) { var rp = RichPaneCustomGraphicsBinder.CreateCopy(MotherPane, Graphics.FromImage(bmp)); rp.SetParent(MotherPane); rp.Graphics.Clear(Color.Transparent); base.drawLayer(rp, layerid, pts); var sr = pane.GetPaneRect(); MotherPane.Graphics.DrawImageUnscaledAndClipped(bmp, sr); panebak[pane, layerid] = rp; } else { var sr = pane.GetPaneRect(); var rpbak = panebak[pane, layerid]; // pane.Graphics.SetClip(sr); sr += ScreenPos.FromInt(pane.Scroll.X - rpbak.Scroll.X, pane.Scroll.Y - rpbak.Scroll.Y); MotherPane.Graphics.DrawImageUnscaledAndClipped(bmp, sr); } } else { base.drawLayer(pane, layerid, pts); } }
/// <summary> /// フィーチャー初期化 /// </summary> public override void OnInitInstance() { base.OnInitInstance(); _tarPane = Pane.GetPane("Resource"); // デフォルト。ParseParameterで指定してください _bar = createScrollBarPart(); Parts.Add(_tarPane, _bar, Const.Layer.StaticLayers.ScrollBarH); }
/// <summary> /// パラメータを取得する /// </summary> /// <param name="param"></param> public override void ParseParameter(string param) { base.ParseParameter(param); foreach (var c1 in StrUtil.SplitTrim(param, ";")) { var com = StrUtil.SplitTrim(c1, "="); if (com.Length != 2) { continue; } if (com[0].Equals("Pane", StringComparison.CurrentCultureIgnoreCase)) { _tarPane = Pane.GetPane(com[1]); } if (com[0].Equals("MarginL", StringComparison.CurrentCultureIgnoreCase)) { _margin.LT.X = int.Parse(com[1]); } if (com[0].Equals("MarginT", StringComparison.CurrentCultureIgnoreCase)) { _margin.LT.Y = int.Parse(com[1]); } if (com[0].Equals("MarginR", StringComparison.CurrentCultureIgnoreCase)) { _margin.RB.X = int.Parse(com[1]); } if (com[0].Equals("MarginB", StringComparison.CurrentCultureIgnoreCase)) { _margin.RB.Y = int.Parse(com[1]); } } }
/// <summary> /// モーションスクロールする位置を設定する /// </summary> /// <param name="pane">スクロールしたいペーン</param> /// <param name="pos">スクロール目的地</param> /// <param name="step">モーションステップ数 20位をセットするとちょうど良い</param> public void SetMotionScrollPosition(IRichPane pane, ScreenPos pos, int step) { lock (_motionScroll) { _motionScroll[pane] = new ScrollCommand(pos, step); } }
public override bool Draw(IRichPane rp) { #if true base.Draw(rp); IsLogDrawing = true; #endif return(true); }
/// <summary> /// パラメータ解析 /// </summary> /// <param name="param"></param> public override void ParseParameter(string param) { base.ParseParameter(param); var coms = param.Split(new char[] { ';' }); foreach (var com in coms) { var od = com.Split(new char[] { '=' }); if (od.Length < 2) { continue; } if (od[0].ToLower() == "pane") { _filterPane = Pane.GetPane(od[1]); } if (od[0].ToLower() == "layer") { _filterLayer = int.Parse(od[1]); } if (od[0].ToLower() == "avoid") { var ts = od[1].Split(new char[] { ',' }); foreach (var tt in ts) { var t = tt.Trim().ToLower(); switch (t) { case "top": _isTop = false; break; case "left": _isLeft = false; break; case "right": _isRight = false; break; case "bottom": _isBottom = false; break; case "inside": _isInside = false; break; case "move": _isMove = false; break; } } } } }
/// <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> /// ボタンDownイベント /// </summary> /// <param name="e"></param> public virtual void OnMouseDown(MouseState e) { if (e.Attr.Equals(_trigger)) { _posDown = (ScreenPos)e.Pos.Clone(); _paneDown = Pane; _zoomDown = (XyBase)Pane.Zoom.Clone(); _scrollDown = (ScreenPos)Pane.Scroll.Clone(); } }
/// <summary> /// レイヤーを指定してパーツを取得する /// </summary> /// <param name="layer">指定レイヤー</param> /// <param name="pane">指定ペーン</param> /// <returns></returns> public virtual IList <PartsBase> GetLayerParts(int layer, IRichPane pane) { var layers = _data[pane]; if (layers.TryGetValue(layer, out var ret)) { return(ret); } return(new List <PartsBase>()); }
/// <summary> /// 指定ペーンのパーツを削除する /// </summary> public override void Clear(IRichPane targetPane) { lock (_data) { if (_data.TryGetValue(targetPane, out var ls)) { ls.Clear(); targetPane.Invalidate(targetPane.GetPaneRect()); // 削除した様子を再描画 } } }
/// <summary> /// シリアライズ用に実体としてインスタンスを生成する(_parentの参照もコピーする) /// </summary> /// <param name="value">元になるIRichPane</param> /// <returns>新しいインスタンス</returns> public static RichPaneBinder CreateCopyComplete(IRichPane value) { var ret = new RichPaneBinder { _parent = value, _zoom = value.Zoom, _scroll = value.Scroll, _idtext = value.IdText }; return(ret); }
/// <summary> /// イリュージョンプロジェクタを登録する /// </summary> /// <param name="original">投影元</param> /// <param name="idtext"></param> /// <returns></returns> public PartsIllusionProjector AddIllusionProjector(IRichPane original, string idtext) { var ret = new PartsIllusionProjector(original, idtext); if (_projectors.TryGetValue(original, out var prs) == false) { _projectors.Add(original, prs = new Illustios()); } prs.Add(ret); _projectorsRevKey.Add(ret.ScreenPane, original); return(ret); }
/// <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> /// Graphicsを指定したインスタンスを構築 /// </summary> /// <param name="value"></param> /// <param name="g"></param> /// <returns></returns> public static RichPaneCustomGraphicsBinder CreateCopy(IRichPane value, Graphics g) { var ret = new RichPaneCustomGraphicsBinder { _parent = null, _zoom = value.Zoom, _scroll = value.Scroll, _idtext = value.IdText, _graphics = g }; return(ret); }
/// <summary> /// 描画 /// </summary> /// <param name="rp"></param> public override bool Draw(IRichPane rp) { var pos = GetScRect(rp); // 位置を取得する // InClipをすると右下がりの線しか描画できない為、InClipはやらない //if( isInClip(rp, pos) == false ) // 描画不要であれば、なにもしない //{ // return false; //} //Mask(rp, eMask.Specification); // 特定マスクのみで表示 rp.Graphics.DrawLine(_pen, pos.LT, pos.RB); return(true); }
/// <summary> /// 選択領域の矩形を描画する /// </summary> /// <param name="rp"></param> /// <returns></returns> public override bool Draw(IRichPane rp) { if (_isVisible) { var spos = GetScRect(rp); if (isInClip(rp, spos) == false) // 描画不要であれば、なにもしない { return(false); } rp.Graphics.FillRectangle(_maskBG, spos); rp.Graphics.DrawRectangle(_maskPen, spos); } return(true); }
/// <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> /// 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="layer"></param> /// <param name="retPane">指定レイヤーが属するペーンが返る</param> /// <returns>パーツコレクション</returns> public virtual IList <PartsBase> GetLayerParts(int layer, out IRichPane retPane) { foreach (var de in _data) { var layers = de.Value; if (layers.TryGetValue(layer, out var ret)) { retPane = de.Key; return(ret); } } retPane = null; return(new List <PartsBase>()); }
/// <summary> /// スクロール変更イベント転送 /// </summary> /// <param name="target"></param> public virtual void ScrollChanged(IRichPane target) { //lock(_children.SyncRoot) // 途中でAddChildしないので、スレッドセーフ。途中でAddChildしてしまうと下のループでAssertされる { foreach (var c in _children) { if (c is FeatureBase && ((FeatureBase)c).Enabled == false) { continue; } if (c is IScrollListener) { foreach (var t in ((IScrollListener)c).ScrollEventTargets) { if (target == null || t == target) { #if DEBUG if (c is FeatureBase) { TimeKeeper.SetStart(TimeKeeper.RecordType.ScrollChanged, ((FeatureBase)c).ID); } #endif #if DEBUG == false try #endif { ((IScrollListener)c).ScrollChanged(target); } #if DEBUG == false catch (Exception ex) { LOG.WriteLineException(ex); } #endif #if DEBUG if (c is FeatureBase) { TimeKeeper.SetEnd(TimeKeeper.RecordType.ScrollChanged, ((FeatureBase)c).ID); } #endif } } } } } checkAndFireDataChanged(); // パーツ削除イベント }
/// <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="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; }
public override bool Draw(IRichPane rp) { var sr = GetScRect(rp); if (sr.RB.X < 0) { return(true); } var srf = new RectangleF(sr.LT.X, sr.LT.Y, sr.Width, sr.Height); var tf = new StringFormat { Alignment = StringAlignment.Far, LineAlignment = StringAlignment.Center, Trimming = StringTrimming.EllipsisCharacter, }; var brush = new SolidBrush(BarColor); if (IsCancelled) { if (sr.Width > 2) { rp.Graphics.FillRectangle(brush, sr); rp.Graphics.DrawString(Text, FontTalk, brush, srf, tf); } } else { rp.Graphics.FillRectangle(brush, sr); rp.Graphics.DrawString(Text, FontTalk, Brushes.White, srf, tf); if (IsSelected) { foreach (var col in new[] { Color.Yellow, Color.FromArgb(160, Color.LightGreen), Color.FromArgb(120, Color.Blue), }) { rp.Graphics.DrawRectangle(new Pen(col), sr); sr.Inflate(1); } } } return(true); }