/// <summary> /// モーション移動対象パーツを1モーションステップ分 進める /// </summary> /// <returns>true=もう一度自己Invalidateでモーション継続が必要</returns> private bool move1step() { var dels = new List <PartsBase>(); var nDone = 0; var ret = false; lock (_tarPos) { foreach (var kv in _tarPos) { var part = kv.Key; var tar = kv.Value; if (part.Rect.LT.Equals(tar.Pos)) { dels.Add(part); tar.StepN = 0; } else { tar.StepN--; if (tar.StepN == 0) { part.Rect = CodeRect.FromLTWH(tar.Pos.X, tar.Pos.Y, part.Rect.Width, part.Rect.Height); dels.Add(part); } else { float dx = tar.Pos.X - part.Rect.LT.X; float dy = tar.Pos.Y - part.Rect.LT.Y; var div = (float)tar.StepN * 2; dx /= div; dy /= div; part.Rect += CodePos.FromInt((int)dx, (int)dy); } nDone++; } } } if (nDone > 0) { ret = true; } foreach (var del in dels) { _tarPos.Remove(del); } _isMoving |= _tarPos.Count > 0 ? Moving.Parts : Moving.None; 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> /// <param name="who"></param> public override void Start(NamedId who) { base.Start(who); if (MultiTokenTriggerID[0].Equals(who)) { var ph = (int)ConfigRegister.Current["LogPanelGroupHeight", 128]; _lp = createLogPartInstance(_clickArea); LOG.JumpInf.Jumping += new EventHandler(onJumping); LOG.JumpErr.Jumping += new EventHandler(onJumping); LOG.JumpWar.Jumping += new EventHandler(onJumping); LOG.JumpDev.Jumping += new EventHandler(onJumping); _lp.SetMargin(_margin); _lp.Rect = CodeRect.FromLTWH(0, 0, 0, ph); // 高さの初期値(単位;ドット) Parts.Add(_tarPane, _lp, Const.Layer.StaticLayers.LogPanel); _tarPane.Invalidate(null); Timer.AddTrigger(320, new GuiTimer.Proc0(refresh0)); } if (MultiTokenTriggerID[1].Equals(who)) { triggerCloseButtonProc(); } }