/// <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); }
/// <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); } }
/// <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); } }
public void OnMouseMove(MouseState e) { _bar.MouseNow = e; // バーの位置だけ再描画 var br = _tarPane.GetPaneRect(); br.LT.X = br.RB.X - PartsScrollbarV.Width; Pane.Invalidate(br); if (_bar.IsOn) { var k = _speed * _bar.Acc; var ly = (_downPos.Y - e.Pos.Y) * k; ly = Math.Pow(Math.Abs(ly), 1.25) * (ly > 0 ? 1 : -1); // たくさん移動したら、加速度的に移動する Pane.Scroll = ScreenPos.FromInt(Pane.Scroll.X, _downScroll.Y + (int)ly); _bar.SetHighlight(false); Pane.Invalidate(null); } else { _bar.SetHighlight(true); } }
public void OnMouseDown(MouseState e) { var pr = getPaneRect(); if (_lp != null && Math.Abs(e.Pos.Y - (pr.RB.Y - _lp.Rect.Height)) < 4 && pr.LR.IsIn(e.Pos)) // ログパネルサイズ変更 { _sizingHeightOrg = e.Pos.Clone() as ScreenPos; Pane.Control.Cursor = Cursors.SizeNS; } else { foreach (var kv in _clickArea) { var re = ScreenRect.FromLTWH(kv.Value.X, kv.Value.Y, 20, 20); if (re.IsIn(e.Pos)) { LOG.ChangeDispLevel(kv.Key); if (kv.Key == 0) // クローズボタン { triggerCloseButtonProc(); } } } } }
public void OnMouseMove(MouseState e) { _bar.MouseNow = e; // バーの位置だけ再描画 var br = _tarPane.GetPaneRect(); br.LT.Y = br.RB.Y - PartsScrollbarH.Height; Pane.Invalidate(br); if (_bar.IsOn) { var k = Pane.Zoom.X > 84 ? Pane.Zoom.X / 84 : 1.0; k *= _speed * _bar.Acc; var lx = (_downPos.X - e.Pos.X) * k; lx = Math.Pow(Math.Abs(lx), 1.25) * (lx > 0 ? 1 : -1); // たくさん移動したら、加速度的に移動する Pane.Scroll = ScreenPos.FromInt(_downScroll.X + (int)lx, Pane.Scroll.Y); _bar.SetHighlight(false); Pane.Invalidate(null); } else { _bar.SetHighlight(true); } }
/// <summary> /// 指定量のズームを行う /// </summary> /// <param name="value"></param> private void zoom(int x, int y) { // 選択ペーンの描画領域の中心をズームのセンターの設定 var _posDown = new ScreenPos { X = _tarPane.GetPaneRect().LT.X + _tarPane.GetPaneRect().Width / 2 - _tarPane.GetPaneRect().LT.X, Y = _tarPane.GetPaneRect().LT.Y + _tarPane.GetPaneRect().Height / 2 - _tarPane.GetPaneRect().LT.Y }; var _scrollDown = (ScreenPos)Pane.Scroll.Clone(); var _zoomDown = (XyBase)Pane.Zoom.Clone(); // 画面の拡大/縮小 XyBase zoomNow; if (_isX && !_isY) { zoomNow = Pane.Zoom + XyBase.FromInt(x, 0); // ズーム値の算出 } else if (!_isX && _isY) { zoomNow = Pane.Zoom + XyBase.FromInt(0, y); // ズーム値の算出 } else { zoomNow = Pane.Zoom + x; // ズーム値の算出 } // ズーム値を規定範囲内に収める if (zoomNow.X > 4000) { zoomNow.X = 4000; } if (zoomNow.Y > 4000) { zoomNow.Y = 4000; } if (zoomNow.X < 5) { zoomNow.X = 5; } if (zoomNow.Y < 5) { zoomNow.Y = 5; } Pane.Zoom = (XyBase)zoomNow.Clone(); // ズーム値の反映 // クリックした位置を基準にしてズームするように画面をスクロールする。 var ZoomRatioX = (double)zoomNow.X / _zoomDown.X; // X方向のズーム率の算出 var ZoomRatioY = (double)zoomNow.Y / _zoomDown.Y; // Y方向のズーム率の算出 var beforeDownPos = _posDown - _scrollDown - _tarPane.GetPaneRect().LT; // var afterDownPos = ScreenPos.FromInt((int)(ZoomRatioX * beforeDownPos.X), (int)(ZoomRatioY * beforeDownPos.Y)); Pane.Scroll = _scrollDown - (afterDownPos - beforeDownPos); Pane.Invalidate(null); }
public void OnMouseUp(MouseState e) { if (_sizingHeightOrg != null) { _sizingHeightOrg = null; savePanelHeight(); } }
public void OnMouseMove(MouseState e) { var pr = getPaneRect(); if (_sizingHeightOrg != null) { if (e.Attr.IsButton) { var adp = e.Pos.Clone() as ScreenPos; if (adp.Y < pr.LT.Y) { adp.Y = pr.LT.Y; } if (pr.RB.Y - adp.Y < foldingHeight) { adp.Y = pr.RB.Y - foldingHeight; } Pane.Control.Cursor = Cursors.SizeNS; _lp.Rect.RB.Y = pr.RB.Y - adp.Y; _tarPane.Invalidate(null); } else { Pane.Control.Cursor = Cursors.Arrow; _sizingHeightOrg = null; savePanelHeight(); } } else { if (_lp != null && Math.Abs(e.Pos.Y - (pr.RB.Y - _lp.Rect.Height)) < 4 && pr.LR.IsIn(e.Pos)) // ログパネルサイズ変更 { Pane.Control.Cursor = Cursors.SizeNS; } else { var isCur = false; foreach (var kv in _clickArea) { var re = ScreenRect.FromLTWH(kv.Value.X, kv.Value.Y, 20, 20); if (re.IsIn(e.Pos)) { isCur = true; } } if (isCur) { Pane.Control.Cursor = Cursors.Hand; } else { Pane.Control.Cursor = Cursors.Arrow; } } } }
/// <summary> /// 値を指定してインスタンスを作る /// </summary> /// <param name="v1">値1</param> /// <param name="v2">値2</param> /// <returns>インスタンス</returns> public static new ScreenPos FromInt(int v1, int v2) { var ret = new ScreenPos { _v1 = v1, _v2 = v2 }; return(ret); }
/// <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="pos"></param> /// <returns></returns> protected bool isInSkipzone(ScreenPos pos) { foreach (var r in _skipzones) { if (r.IsIn(pos)) { return(true); } } return(false); }
/// <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> /// 移動情報を更新する /// 注意:いったんスクリーン座標に変換して移動するので、コード座標に変換誤差が生じる可能性がある。 /// </summary> /// <param name="dragStartPos">移動開始時のマウス座標(ドラッグ開始点)</param> /// <param name="currentPos">現在のマウス座標</param> /// <param name="type">座標変更タイプ</param> public void Develop(ScreenPos dragStartPos, ScreenPos currentPos, DevelopType type) { _lastDevelpType = type; var sdelta = currentPos - dragStartPos; // マウスの移動量 _prevShift = sdelta; foreach (DictionaryEntry de in this) // 選択中全パーツに対して行う { var p3 = (Pos3)de.Value; var target = (PartsBase)de.Key; p3.Pre = p3.Now; // ひとつ前の座標に記憶 p3.Now = (CodeRect)p3.Now.Clone(); // サイズ系の処理が正しく動作するために必要 var virtualPos = target.GetCdRect(p3.NowPane, target.GetScRect(p3.OrgPane, p3.Org) + sdelta); // 移動後の位置を計算 var d = target.GetCdPos(p3.NowPane, sdelta); //Debug.WriteLine( string.Format( "[{0}] Delta[{1}]:Offset[{2}]", i, d, p3.Offset) ); virtualPos = CodeRect.FromLTWH(virtualPos.LT.X + p3.Offset.X, virtualPos.LT.Y, virtualPos.Width, virtualPos.Height); switch (type) { case DevelopType.Move: p3.Now = virtualPos; if (p3.Now.Width != p3.Org.Width) { p3.Now.RB.X = p3.Now.LT.X + p3.Org.Width - 1; // 幅が変わらないようにする } break; case DevelopType.SizeRight: p3.Now.RB.X = virtualPos.RB.X; break; case DevelopType.SizeLeft: p3.Now.LT.X = virtualPos.LT.X; break; case DevelopType.SizeTop: p3.Now.LT.Y = virtualPos.LT.Y; break; case DevelopType.SizeBottom: p3.Now.RB.Y = virtualPos.RB.Y; break; } } }
/// <summary> /// マウスダウン処理の最終決定 /// </summary> protected virtual void _finalMouseDownPart() { var e = _clickPos; if (_selectedParts.Count > 0) { var tarPane = ClickPane; var parts = ClickParts; // Parts.GetPartsAt(e.Pos, true, out tarPane); if (parts != null) { if (parts.IsOn(e.Pos, tarPane) == PartsBase.PointType.Inside) { _pos.SetDevelop(_developmentMode = PartsPositionManager.DevelopType.Move); _mouseDownOriginal = e.Pos; _pos.Initialize(_selectedParts); Token.Add(TokenGeneral.TokenMouseDownNormalize, this); } } } }
/// <summary> /// マウスアップの最終処理 /// </summary> protected virtual void OnFinalizeMouseUpJob() { if (_mouseDownOriginal != null) { var movedCount = 0; // 移動パーツをデータに反映させる foreach (DictionaryEntry de in _pos) { var parts = (PartsBase)de.Key; var pos = (PartsPositionManager.Pos3)de.Value; if (pos.Now.LT.Equals(pos.Org.LT) == false || pos.Now.RB.X != pos.Org.RB.X) { if (movedCount == 0) { Persister[REDO].Save(_selectedParts, _meansSelectedParts); } // データ更新 Link.Equalization(parts, false); // Data~Partsのデータ連動 // REDO永続化(パーツ) //savePartsWithFriend(Persister[REDO], parts, new Hashtable()); // REDO永続化(レコード) foreach (RecordBase rb in Link.GetRecordset(parts)) { Persister[REDO].Save(rb, _meansSelectedParts); } movedCount++; } } // 移動終了 _mouseDownOriginal = null; _pos.Clear(); Persister[REDO].EndChunk(); // REDOを先に行うことは重要 Persister[UNDO].EndChunk(); Pane.Invalidate(Pane.GetPaneRect()); } }
public void OnMouseDown(MouseState e) { if (_bar.MouseNow == null) { return; } // 一度だけ、クリック不感帯を登録 if (_skipzone == null) { var pr = _tarPane.GetPaneRect(); _skipzone = ScreenRect.FromLTWH(pr.RB.X - PartsScrollbarV.Width, pr.LT.Y, PartsScrollbarV.Width, pr.Height); Parts.AddSkipZone(_skipzone); } // クリック操作 _bar.SetOn(true, true); _bar.SetHighlight(false); _downPos = (ScreenPos)e.Pos.Clone(); _downScroll = (ScreenPos)Pane.Scroll.Clone(); _bar.Acc = 1; if (e.Attr.IsShift && !e.Attr.IsCtrl) { _bar.Acc = 4; } if (!e.Attr.IsShift && e.Attr.IsCtrl) { _bar.Acc = 0.5f; } if (e.Attr.IsShift && e.Attr.IsCtrl) { _bar.Acc = 16; } Pane.Invalidate(null); }
/// <summary> /// オートスクロールする /// </summary> public void autoScroll() { try { var e = MouseState.Now; _timer = null; var pp = 0; if (e.Attr.IsButton) { var pr = _tarPane.GetPaneRect(); e.Pos = ThreadSafe.PointToClient(_tarPane.Control, e.Pos); if (e.Pos.Y > -24 && e.Pos.Y < pr.Height + 24) { if (e.Pos.X < 16) { pp = 20; } if (e.Pos.X > pr.Width - 32) { pp = -20; } } } if (pp != 0) { Pane.Scroll = ScreenPos.FromInt(Pane.Scroll.X + pp, Pane.Scroll.Y); Pane.Invalidate(null); _timer = Timer.AddTrigger(100, new GuiTimer.Proc0(autoScroll)); } else { _timer = null; } } catch (Exception) { } }
/// <summary> /// 指定マウス座標のパーツをひとつ取得する /// </summary> /// <param name="pos">パーツ座標</param> /// <returns>取得できたパーツ / null=なし</returns> public override PartsBase GetPartsAt(ScreenPos pos, bool isSelectableOnly, out IRichPane rp) { rp = null; if (isInSkipzone(pos)) { return(null); } // リッチペーンによるループ for (IDictionaryEnumerator de = _data.GetEnumerator(); de.MoveNext();) { var pane = (IRichPane)de.Key; if (pane.GetPaneRect().IsIn(pos) == false) { continue; } // レイヤーによるループ for (var layerde = ((IDictionary)de.Value).GetEnumerator(); layerde.MoveNext();) { if (_layerVisibleSwitch[(int)layerde.Key]) { // すべてのパーツを順に調査する、低速の処理。気に入らなければ機能をオーバーライドしてください // ただし、以下のプロジェクタを考慮した作りにする必要があります。 var pcol = (IList)layerde.Value; var ret = getparts(pos, pane, isSelectableOnly, pcol, out rp); if (ret != null) { return(ret); } } } } return(null); }
/// <summary> /// パーツ選択処理をマウスダウンイベントで行う /// </summary> public void OnMouseDown(MouseState e) { _clickPos = (ScreenPos)e.Pos.Clone(); }
private ScreenPos savePos(LLV lv, ScreenPos pos) { _clickArea[lv] = pos; return(pos); }
/// <summary> /// 指定マウス座標のパーツをひとつ取得する /// </summary> /// <param name="pos">座標</param> /// <param name="isSelectableOnly"></param> /// <returns>取得できたパーツ / null=なし</returns> public PartsBase GetPartsAt(ScreenPos pos, bool isSelectableOnly) { return(GetPartsAt(pos, isSelectableOnly, out var rp)); }
/// <summary> /// ボタンUpイベント /// </summary> /// <param name="e"></param> public virtual void OnMouseUp(MouseState e) { _posDown = null; _zoomDown = null; _scrollDown = null; }
/// <summary> /// 指定領域内のパーツを検索する /// </summary> /// <param name="pos">座標</param> /// <param name="rp">検索ペーン</param> /// <param name="layer">検索レイヤー</param> /// <param name="isSelectableOnly">選択可能なパーツのみ検索</param> /// <returns>取得できたパーツ / null=なし</returns> public virtual PartsBase GetPartsAt(ScreenPos pos, IRichPane rp, int layer, bool isSelectableOnly) { throw new NotSupportedException(); }
/// <summary> /// マウスMoveイベント /// </summary> /// <param name="e"></param> public virtual void OnMouseMove(MouseState e) { if (_posDown == null || _zoomDown == null || _scrollDown == null || e.Pane == null) { return; } if (e.Attr.Equals(_trigger)) { // 画面の拡大/縮小 ScreenPos movePos = e.Pos - _posDown; // カーソルの移動量の計算 ScreenPos pdBak = (ScreenPos)_posDown.Clone(); if (_isCenterLock) { _posDown.X = e.Pane.GetPaneRect().LT.X + (e.Pane.GetPaneRect().RB.X - e.Pane.GetPaneRect().LT.X) / 2; _posDown.Y = e.Pane.GetPaneRect().LT.Y + (e.Pane.GetPaneRect().RB.Y - e.Pane.GetPaneRect().LT.Y) / 2; } XyBase zoomNow = _zoomDown + movePos * 3; // ズーム値の算出 速度変更(高解像度に伴い) 2016.11.15 Tono 2→3 // ズーム値を規定範囲内に収める if (zoomNow.X > 4000) { zoomNow.X = 4000; } if (zoomNow.Y > 4000) { zoomNow.Y = 4000; } if (zoomNow.X < 5) { zoomNow.X = 5; } if (zoomNow.Y < 5) { zoomNow.Y = 5; } if (_isSameXY) { zoomNow.Y = zoomNow.X; } Pane.Zoom = (XyBase)zoomNow.Clone(); // ズーム値の反映 // クリックした位置を基準にしてズームするように画面をスクロールする。 double ZoomRatioX = (double)zoomNow.X / _zoomDown.X; // X方向のズーム率の算出 double ZoomRatioY = (double)zoomNow.Y / _zoomDown.Y; // Y方向のズーム率の算出 ScreenPos beforeDownPos = _posDown - _scrollDown - e.Pane.GetPaneRect().LT; // ScreenPos afterDownPos = ScreenPos.FromInt((int)(ZoomRatioX * beforeDownPos.X), (int)(ZoomRatioY * beforeDownPos.Y)); if (_noscrollmove.value == false) { Pane.Scroll = _scrollDown - (afterDownPos - beforeDownPos); } else { _noscrollmove.value = false; } Pane.Invalidate(null); _posDown = pdBak; } else { OnMouseUp(e); } }
/// <summary> /// デフォルトコンストラクタ /// </summary> public ScreenRect() { _lt = new ScreenPos(); _rb = new ScreenPos(); }