JavaScriptを色々あれこれしようとするがひたすら失敗を繰り返している
| Revision | 24 (tree) |
|---|---|
| Time | 2016-11-23 16:40:58 |
| Author | |
palette処理修正中
| @@ -14,6 +14,18 @@ | ||
| 14 | 14 | -moz-user-select: none; |
| 15 | 15 | user-select: none; |
| 16 | 16 | } |
| 17 | + | |
| 18 | + .buttonstyle { | |
| 19 | + border: 1px solid black; | |
| 20 | + border-radius: 4px 4px; | |
| 21 | + background-color: lightgray; | |
| 22 | + margin: 0px; | |
| 23 | + padding: 0px 2px; | |
| 24 | + text-decoration: none; | |
| 25 | + font-weight: normal; | |
| 26 | + } | |
| 27 | + | |
| 28 | + | |
| 17 | 29 | /* |
| 18 | 30 | [data-objid] { |
| 19 | 31 | transition: transform 2s linear 0s; |
| @@ -20,6 +32,7 @@ | ||
| 20 | 32 | } |
| 21 | 33 | */ |
| 22 | 34 | |
| 35 | + /* キャンバス要素の定義 */ | |
| 23 | 36 | #DispField{ |
| 24 | 37 | display:block; |
| 25 | 38 | width:400px; height:300px; |
| @@ -28,11 +41,32 @@ | ||
| 28 | 41 | } |
| 29 | 42 | |
| 30 | 43 | |
| 44 | + /* パレットグループ要素の定義 */ | |
| 45 | + .palgroup { | |
| 46 | + display: inline-block; | |
| 47 | + position: absolute; | |
| 48 | + left:0px; top:310px; | |
| 49 | + margin: 0px; | |
| 50 | + padding: 5px; | |
| 51 | + background-color: #ffffff; | |
| 52 | + box-shadow: 2px 2px 1px 1px rgba(0,0,0,0.4); | |
| 53 | + } | |
| 54 | + .palgrouphorizon { | |
| 55 | + width: 185px; /* (5+25+5) * 5 + (5+5) */ | |
| 56 | + height: 45px; | |
| 57 | + } | |
| 58 | + .pallegend { | |
| 59 | + background-color: transparent; | |
| 60 | + font-weight: bold; | |
| 61 | + font-size: small; | |
| 62 | + } | |
| 31 | 63 | |
| 64 | + /* パレット要素の定義 */ | |
| 32 | 65 | .palbg, |
| 33 | 66 | .paltxtcol, |
| 34 | 67 | .palact { |
| 35 | 68 | display: inline-block; |
| 69 | + position: absolute; | |
| 36 | 70 | width: 25px; height: 25px; |
| 37 | 71 | border: 2px solid blue; |
| 38 | 72 | margin: 2px; |
| @@ -41,7 +75,7 @@ | ||
| 41 | 75 | border: 2px solid black; |
| 42 | 76 | } |
| 43 | 77 | .paltxtcol { |
| 44 | - border: 2px solid brown; | |
| 78 | + border: 2px solid blue; | |
| 45 | 79 | text-align: center; |
| 46 | 80 | font-size: 100%; |
| 47 | 81 | } |
| @@ -50,7 +84,7 @@ | ||
| 50 | 84 | } |
| 51 | 85 | |
| 52 | 86 | |
| 53 | - | |
| 87 | + /* フォーカス枠と拡大縮小・回転用マーカー定義 */ | |
| 54 | 88 | .scaler { |
| 55 | 89 | border: 2px solid black; |
| 56 | 90 | border-radius: 50%; |
| @@ -63,45 +63,47 @@ | ||
| 63 | 63 | |
| 64 | 64 | .palact4 { animation: animeact4 2s ease-in 0.3s 1 normal; } |
| 65 | 65 | @keyframes animeact4 { to {color:black;} } |
| 66 | - | |
| 67 | - | |
| 68 | - | |
| 69 | - | |
| 70 | - | |
| 71 | - | |
| 72 | - | |
| 73 | 66 | </style> |
| 74 | - <div class="palbg palbg0" data-objid="palbg0" data-palid="0"></div> | |
| 75 | - <div class="palbg palbg1" data-objid="palbg1" data-palid="1"></div> | |
| 76 | - <div class="palbg palbg2" data-objid="palbg2" data-palid="2"></div> | |
| 77 | - <div class="palbg palbg3" data-objid="palbg3" data-palid="3"></div> | |
| 78 | - <div class="palbg palbg4" data-objid="palbg4" data-palid="4"></div> | |
| 79 | 67 | |
| 68 | + <fieldset class="palgroup palgrouphorizon" data-objid="palgroup0"> | |
| 69 | + <legend class="pallegend"> Background <button>横</button> </legend> | |
| 70 | + <div class="palbg palbg0" data-objid="palbg0" data-palid="0"></div> | |
| 71 | + <div class="palbg palbg1" data-objid="palbg1" data-palid="1"></div> | |
| 72 | + <div class="palbg palbg2" data-objid="palbg2" data-palid="2"></div> | |
| 73 | + <div class="palbg palbg3" data-objid="palbg3" data-palid="3"></div> | |
| 74 | + <div class="palbg palbg4" data-objid="palbg4" data-palid="4"></div> | |
| 75 | + </fieldset> | |
| 80 | 76 | <br /> |
| 81 | 77 | |
| 82 | - <div class="paltxtcol paltxtcol0" data-objid="paltxtcol0" data-palid="0">あ</div> | |
| 83 | - <div class="paltxtcol paltxtcol1" data-objid="paltxtcol1" data-palid="1">あ</div> | |
| 84 | - <div class="paltxtcol paltxtcol2" data-objid="paltxtcol2" data-palid="2">あ</div> | |
| 85 | - <div class="paltxtcol paltxtcol3" data-objid="paltxtcol3" data-palid="3">あ</div> | |
| 86 | - <div class="paltxtcol paltxtcol4" data-objid="paltxtcol4" data-palid="4">あ</div> | |
| 78 | + <fieldset class="palgroup palgrouphorizon" data-objid="palgroup1"> | |
| 79 | + <legend class="pallegend"> Text Color <button>横</button> </legend> | |
| 80 | + <div class="paltxtcol paltxtcol0" data-objid="paltxtcol0" data-palid="0">あ</div> | |
| 81 | + <div class="paltxtcol paltxtcol1" data-objid="paltxtcol1" data-palid="1">あ</div> | |
| 82 | + <div class="paltxtcol paltxtcol2" data-objid="paltxtcol2" data-palid="2">あ</div> | |
| 83 | + <div class="paltxtcol paltxtcol3" data-objid="paltxtcol3" data-palid="3">あ</div> | |
| 84 | + <div class="paltxtcol paltxtcol4" data-objid="paltxtcol4" data-palid="4">あ</div> | |
| 85 | + </fieldset> | |
| 87 | 86 | |
| 88 | - <br /> | |
| 87 | + <br /> | |
| 89 | 88 | |
| 90 | - <div class="palact palact0" data-objid="palact0" data-palid="0"></div> | |
| 91 | - <div class="palact palact1" data-objid="palact1" data-palid="1"></div> | |
| 92 | - <div class="palact palact2" data-objid="palact2" data-palid="2"></div> | |
| 93 | - <div class="palact palact3" data-objid="palact3" data-palid="3"></div> | |
| 94 | - <div class="palact palact4" data-objid="palact4" data-palid="4"></div> | |
| 89 | + <fieldset class="palgroup palgrouphorizon" data-objid="palgroup2"> | |
| 90 | + <legend class="pallegend"> Action <span class="buttonstyle">horizon</span> </legend> | |
| 91 | + <div class="palact palact0" data-objid="palact0" data-palid="0"></div> | |
| 92 | + <div class="palact palact1" data-objid="palact1" data-palid="1"></div> | |
| 93 | + <div class="palact palact2" data-objid="palact2" data-palid="2"></div> | |
| 94 | + <div class="palact palact3" data-objid="palact3" data-palid="3"></div> | |
| 95 | + <div class="palact palact4" data-objid="palact4" data-palid="4"></div> | |
| 96 | + </fieldset> | |
| 95 | 97 | |
| 96 | - <script type="text/javascript" src="js/Common.js"></script> | |
| 97 | - <script type="text/javascript" src="js/Queue.js"></script> | |
| 98 | - <script type="text/javascript" src="js/CommandObj.js"></script> | |
| 99 | - <script type="text/javascript" src="js/UI_parts.js"></script> | |
| 98 | + <script type="text/javascript" src="js/Common.js"></script> | |
| 99 | + <script type="text/javascript" src="js/Queue.js"></script> | |
| 100 | + <script type="text/javascript" src="js/CommandObj.js"></script> | |
| 101 | + <script type="text/javascript" src="js/UI_parts.js"></script> | |
| 100 | 102 | <script type="text/javascript" src="js/palette.js"></script> |
| 101 | - <script type="text/javascript" src="js/DispObj.js"></script> | |
| 102 | - <script type="text/javascript" src="js/ObjIDMgr.js"></script> | |
| 103 | - <script type="text/javascript" src="js/ThreadMessage.js"></script> | |
| 104 | - <script type="text/javascript" src="js/DisplayField.js"></script> | |
| 105 | - <script type="text/javascript" src="js/main.js"></script> | |
| 103 | + <script type="text/javascript" src="js/DispObj.js"></script> | |
| 104 | + <script type="text/javascript" src="js/ObjIDMgr.js"></script> | |
| 105 | + <script type="text/javascript" src="js/ThreadMessage.js"></script> | |
| 106 | + <script type="text/javascript" src="js/DisplayField.js"></script> | |
| 107 | + <script type="text/javascript" src="js/main.js"></script> | |
| 106 | 108 | </body> |
| 107 | 109 | </html> |
| @@ -26,7 +26,27 @@ | ||
| 26 | 26 | } |
| 27 | 27 | |
| 28 | 28 | |
| 29 | + // 操作関数 ------------------------------------ | |
| 29 | 30 | |
| 31 | + // 指定座標がこの要素の中にあるかを判定 | |
| 32 | + // DispalyField client座標基準 | |
| 33 | + hitCheck(x, y) { | |
| 34 | + let ret = false; | |
| 35 | + let chkx = parseFloat(x); | |
| 36 | + let chky = parseFloat(y); | |
| 37 | + | |
| 38 | + if (this.x <= chkx && chkx <= this.x + this.width) { | |
| 39 | + if (this.y <= chky && chky <= this.y + this.height) { | |
| 40 | + ret = true; | |
| 41 | + } | |
| 42 | + } | |
| 43 | + | |
| 44 | + return ret; | |
| 45 | + } | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 30 | 50 | // ブラウザ上への描画 ------------------------- |
| 31 | 51 | |
| 32 | 52 | // コマンド要求実行後の描画共通処理 |
| @@ -8,7 +8,9 @@ | ||
| 8 | 8 | debuglog("【ObjIDMgr】 " + str); |
| 9 | 9 | } |
| 10 | 10 | |
| 11 | + // 操作関数 --------------------------- | |
| 11 | 12 | |
| 13 | + // ObjIDMgrへの Element登録処理 | |
| 12 | 14 | // DispObj.createから呼び出される |
| 13 | 15 | registerDispObj(DispObj) { |
| 14 | 16 | if (null == DispObj) { |
| @@ -25,6 +27,8 @@ | ||
| 25 | 27 | return objNumber; |
| 26 | 28 | } |
| 27 | 29 | |
| 30 | + // 管理Elementの描画関数呼び出し | |
| 31 | + // requestAnimationFrame loop内から呼び出される | |
| 28 | 32 | renderAll() { |
| 29 | 33 | for (let i = 0; i < this.ObjIDLen; i++) { |
| 30 | 34 | this.ObjIDarray[i].render(); |
| @@ -41,7 +45,22 @@ | ||
| 41 | 45 | return this.ObjIDarray[numId]; |
| 42 | 46 | } |
| 43 | 47 | |
| 48 | + // DisplayField client座標基準での判定処理 | |
| 49 | + // 管理Element配列が Z軸昇順で並んでいる前提での処理 | |
| 50 | + hitCheck( | |
| 51 | + x, // x座標 | |
| 52 | + y // y座標 | |
| 53 | + ) { | |
| 54 | + let retobj = null; | |
| 55 | + for (let i = this.ObjIDLen - 1; 0 <= i; i--) { | |
| 56 | + if (true == this.ObjIDarray[i].hitCheck(x, y)) { | |
| 57 | + retobj = this.ObjIDarray[i]; | |
| 58 | + break; | |
| 59 | + } | |
| 60 | + } | |
| 44 | 61 | |
| 62 | + return retobj; | |
| 63 | + } | |
| 45 | 64 | |
| 46 | 65 | |
| 47 | 66 | // Command処理 ---------------------- |
| @@ -2,6 +2,7 @@ | ||
| 2 | 2 | constructor() { |
| 3 | 3 | this.DOMobject = []; |
| 4 | 4 | this.draggingDOM = null; |
| 5 | + this.renderFunc = new Queue(); | |
| 5 | 6 | } |
| 6 | 7 | |
| 7 | 8 | debuglog(str) { |
| @@ -18,6 +19,8 @@ | ||
| 18 | 19 | // 背景設定パレット |
| 19 | 20 | this.DOMpalbg = document.getElementsByClassName('palbg'); |
| 20 | 21 | for (let cnt = 0; cnt < this.DOMpalbg.length; cnt++) { |
| 22 | + this.DOMpalbg[cnt].style.left = 5 + (25 + 10) * cnt + 'px'; | |
| 23 | + this.DOMpalbg[cnt].style.top = 10 + 'px'; | |
| 21 | 24 | this.DOMpalbg[cnt].addEventListener('mousedown', this.onMouseDown.bind(this), false); |
| 22 | 25 | this.DOMpalbg[cnt].addEventListener('dragstart', this.onDragStart.bind(this), false); |
| 23 | 26 | this.DOMpalbg[cnt].addEventListener('dragover', this.onDragOver.bind(this), false); |
| @@ -26,6 +29,8 @@ | ||
| 26 | 29 | // テキストカラーパレット |
| 27 | 30 | this.DOMpaltxtcol = document.getElementsByClassName('paltxtcol'); |
| 28 | 31 | for (let cnt = 0; cnt < this.DOMpaltxtcol.length; cnt++) { |
| 32 | + this.DOMpaltxtcol[cnt].style.left = 5 + (25 + 10) * cnt + 'px'; | |
| 33 | + this.DOMpaltxtcol[cnt].style.top = 10 + 'px'; | |
| 29 | 34 | this.DOMpaltxtcol[cnt].addEventListener('mousedown', this.onMouseDown.bind(this), false); |
| 30 | 35 | this.DOMpaltxtcol[cnt].addEventListener('dragstart', this.onDragStart.bind(this), false); |
| 31 | 36 | this.DOMpaltxtcol[cnt].addEventListener('dragover', this.onDragOver.bind(this), false); |
| @@ -34,7 +39,10 @@ | ||
| 34 | 39 | // アクションパレット |
| 35 | 40 | this.DOMpalact = document.getElementsByClassName('palact'); |
| 36 | 41 | for (let cnt = 0; cnt < this.DOMpalact.length; cnt++) { |
| 42 | + this.DOMpalact[cnt].style.left = 5 + (25 + 10) * cnt + 'px'; | |
| 43 | + this.DOMpalact[cnt].style.top = 10 + 'px'; | |
| 37 | 44 | this.DOMpalact[cnt].addEventListener('mousedown', this.onMouseDown.bind(this), false); |
| 45 | + this.DOMpalact[cnt].addEventListener('mouseup', this.mouseUp.bind(this), false); | |
| 38 | 46 | this.DOMpalact[cnt].addEventListener('dragstart', this.onDragStart.bind(this), false); |
| 39 | 47 | this.DOMpalact[cnt].addEventListener('dragover', this.onDragOver.bind(this), false); |
| 40 | 48 | this.DOMpalact[cnt].addEventListener('drop', this.onDrop.bind(this), false); |
| @@ -107,7 +115,15 @@ | ||
| 107 | 115 | |
| 108 | 116 | |
| 109 | 117 | |
| 118 | + // 描画関数 --------------------- | |
| 110 | 119 | |
| 120 | + render() { | |
| 121 | + while (0 < this.renderFunc.size()) { | |
| 122 | + let renderFunction = this.renderFunc.dequeue(); | |
| 123 | + renderFunction(); | |
| 124 | + } | |
| 125 | + } | |
| 126 | + | |
| 111 | 127 | // Event handler ----------------------- |
| 112 | 128 | |
| 113 | 129 | // Drag&Drop event : Application外からのfileのやり取り |
| @@ -151,29 +167,62 @@ | ||
| 151 | 167 | // Mouse event |
| 152 | 168 | // 自elementをDragし、Drop時にTarget elementに自分のCSS classを適用する |
| 153 | 169 | onMouseDown(evt) { |
| 154 | - this.draggingDOM = evt.target; | |
| 155 | - | |
| 156 | 170 | // Mouse eventをDisplayFieldからCSSPalに渡してもらうように設定 |
| 157 | 171 | window.displayField.setMouseEventObj(this.mouseMove.bind(this), this.mouseUp.bind(this)); |
| 172 | + | |
| 173 | + // Drag対象を保持 | |
| 174 | + this.draggingDOM = evt.target; | |
| 175 | + // ElementのDrag開始位置を保持 | |
| 176 | + this.startElementX = parseInt(this.draggingDOM.style.left); | |
| 177 | + this.startElementY = parseInt(this.draggingDOM.style.top); | |
| 178 | + // MouseのDrag開始位置を保持 | |
| 179 | + this.startDragX = evt.pageX; | |
| 180 | + this.startDragY = evt.pageY; | |
| 158 | 181 | } |
| 159 | 182 | mouseMove(evt) { |
| 160 | 183 | if (null == this.draggingDOM) return; |
| 161 | 184 | |
| 185 | + // 画像の仮移動 | |
| 186 | + this.endDragX = evt.pageX; | |
| 187 | + this.endDragY = evt.pageY; | |
| 188 | + // 移動量取得 | |
| 189 | + let moveX = this.endDragX - this.startDragX; | |
| 190 | + let moveY = this.endDragY - this.startDragY; | |
| 191 | + // dispObjがあった位置からマウス移動分移動させた後の位置取得 | |
| 192 | + moveX = this.startElementX + moveX; | |
| 193 | + moveY = this.startElementY + moveY; | |
| 162 | 194 | |
| 195 | + this.renderFunc.enqueue(this.renderMoveDragging.bind(this, moveX, moveY)); | |
| 196 | + //this.renderMoveDragging(moveX, moveY); | |
| 163 | 197 | } |
| 198 | + renderMoveDragging(x, y) { | |
| 199 | + this.draggingDOM.style.left = x + "px"; | |
| 200 | + this.draggingDOM.style.top = y + "px"; | |
| 201 | + this.draggingDOM.style.opacity = 0.4; | |
| 202 | + } | |
| 164 | 203 | mouseUp(evt) { |
| 165 | 204 | let palobjid = this.draggingDOM.dataset.objid; |
| 166 | 205 | let palid = this.draggingDOM.dataset.palid; |
| 167 | 206 | |
| 207 | + // 初期表示状態に戻す | |
| 208 | + this.draggingDOM.style.left = this.startElementX + "px"; | |
| 209 | + this.draggingDOM.style.top = this.startElementY + "px"; | |
| 210 | + this.draggingDOM.style.opacity = 1.0; | |
| 211 | + | |
| 168 | 212 | // Drag中 element情報をクリア |
| 169 | 213 | this.draggingDOM = null; |
| 170 | 214 | // Mouse event callback設定をクリア |
| 171 | 215 | window.displayField.setMouseEventObj(null, null); |
| 172 | 216 | |
| 217 | + // マウス座標直下にある要素を検索 | |
| 218 | + // (evt.targetは自分を指してしまうため) | |
| 219 | + let target = window.ObjIDMgr.hitCheck(evt.pageX, evt.pageY); | |
| 220 | + | |
| 173 | 221 | // Drag中 palette elementから target element へ CSS classを追加する |
| 174 | 222 | // 同じ種類のCSS class(Text color, BG imgなど)が既にある場合は上書き |
| 175 | 223 | |
| 176 | - this.replaceCSSclassToElement(palobjid, evt.target); | |
| 224 | + if( null != target) | |
| 225 | + this.replaceCSSclassToElement(palobjid, target.DOMobject); | |
| 177 | 226 | } |
| 178 | 227 | |
| 179 | 228 | // Target element へ CSS classを追加する |
| @@ -14,6 +14,18 @@ | ||
| 14 | 14 | -moz-user-select: none; |
| 15 | 15 | user-select: none; |
| 16 | 16 | } |
| 17 | + | |
| 18 | + .buttonstyle { | |
| 19 | + border: 1px solid black; | |
| 20 | + border-radius: 4px 4px; | |
| 21 | + background-color: lightgray; | |
| 22 | + margin: 0px; | |
| 23 | + padding: 0px 2px; | |
| 24 | + text-decoration: none; | |
| 25 | + font-weight: normal; | |
| 26 | + } | |
| 27 | + | |
| 28 | + | |
| 17 | 29 | /* |
| 18 | 30 | [data-objid] { |
| 19 | 31 | transition: transform 2s linear 0s; |
| @@ -29,11 +41,32 @@ | ||
| 29 | 41 | } |
| 30 | 42 | |
| 31 | 43 | |
| 44 | + /* パレットグループ要素の定義 */ | |
| 45 | + .palgroup { | |
| 46 | + display: inline-block; | |
| 47 | + position: absolute; | |
| 48 | + left:0px; top:310px; | |
| 49 | + margin: 0px; | |
| 50 | + padding: 5px; | |
| 51 | + background-color: #ffffff; | |
| 52 | + box-shadow: 2px 2px 1px 1px rgba(0,0,0,0.4); | |
| 53 | + } | |
| 54 | + .palgrouphorizon { | |
| 55 | + width: 185px; /* (5+25+5) * 5 + (5+5) */ | |
| 56 | + height: 45px; | |
| 57 | + } | |
| 58 | + .pallegend { | |
| 59 | + background-color: transparent; | |
| 60 | + font-weight: bold; | |
| 61 | + font-size: small; | |
| 62 | + } | |
| 63 | + | |
| 32 | 64 | /* パレット要素の定義 */ |
| 33 | 65 | .palbg, |
| 34 | 66 | .paltxtcol, |
| 35 | 67 | .palact { |
| 36 | 68 | display: inline-block; |
| 69 | + position: absolute; | |
| 37 | 70 | width: 25px; height: 25px; |
| 38 | 71 | border: 2px solid blue; |
| 39 | 72 | margin: 2px; |
| @@ -63,45 +63,47 @@ | ||
| 63 | 63 | |
| 64 | 64 | .palact4 { animation: animeact4 2s ease-in 0.3s 1 normal; } |
| 65 | 65 | @keyframes animeact4 { to {color:black;} } |
| 66 | - | |
| 67 | - | |
| 68 | - | |
| 69 | - | |
| 70 | - | |
| 71 | - | |
| 72 | - | |
| 73 | 66 | </style> |
| 74 | - <div class="palbg palbg0" data-objid="palbg0" data-palid="0"></div> | |
| 75 | - <div class="palbg palbg1" data-objid="palbg1" data-palid="1"></div> | |
| 76 | - <div class="palbg palbg2" data-objid="palbg2" data-palid="2"></div> | |
| 77 | - <div class="palbg palbg3" data-objid="palbg3" data-palid="3"></div> | |
| 78 | - <div class="palbg palbg4" data-objid="palbg4" data-palid="4"></div> | |
| 79 | 67 | |
| 68 | + <fieldset class="palgroup palgrouphorizon" data-objid="palgroup0"> | |
| 69 | + <legend class="pallegend"> Background <button>横</button> </legend> | |
| 70 | + <div class="palbg palbg0" data-objid="palbg0" data-palid="0"></div> | |
| 71 | + <div class="palbg palbg1" data-objid="palbg1" data-palid="1"></div> | |
| 72 | + <div class="palbg palbg2" data-objid="palbg2" data-palid="2"></div> | |
| 73 | + <div class="palbg palbg3" data-objid="palbg3" data-palid="3"></div> | |
| 74 | + <div class="palbg palbg4" data-objid="palbg4" data-palid="4"></div> | |
| 75 | + </fieldset> | |
| 80 | 76 | <br /> |
| 81 | 77 | |
| 82 | - <div class="paltxtcol paltxtcol0" data-objid="paltxtcol0" data-palid="0">あ</div> | |
| 83 | - <div class="paltxtcol paltxtcol1" data-objid="paltxtcol1" data-palid="1">あ</div> | |
| 84 | - <div class="paltxtcol paltxtcol2" data-objid="paltxtcol2" data-palid="2">あ</div> | |
| 85 | - <div class="paltxtcol paltxtcol3" data-objid="paltxtcol3" data-palid="3">あ</div> | |
| 86 | - <div class="paltxtcol paltxtcol4" data-objid="paltxtcol4" data-palid="4">あ</div> | |
| 78 | + <fieldset class="palgroup palgrouphorizon" data-objid="palgroup1"> | |
| 79 | + <legend class="pallegend"> Text Color <button>横</button> </legend> | |
| 80 | + <div class="paltxtcol paltxtcol0" data-objid="paltxtcol0" data-palid="0">あ</div> | |
| 81 | + <div class="paltxtcol paltxtcol1" data-objid="paltxtcol1" data-palid="1">あ</div> | |
| 82 | + <div class="paltxtcol paltxtcol2" data-objid="paltxtcol2" data-palid="2">あ</div> | |
| 83 | + <div class="paltxtcol paltxtcol3" data-objid="paltxtcol3" data-palid="3">あ</div> | |
| 84 | + <div class="paltxtcol paltxtcol4" data-objid="paltxtcol4" data-palid="4">あ</div> | |
| 85 | + </fieldset> | |
| 87 | 86 | |
| 88 | - <br /> | |
| 87 | + <br /> | |
| 89 | 88 | |
| 90 | - <div class="palact palact0" data-objid="palact0" data-palid="0"></div> | |
| 91 | - <div class="palact palact1" data-objid="palact1" data-palid="1"></div> | |
| 92 | - <div class="palact palact2" data-objid="palact2" data-palid="2"></div> | |
| 93 | - <div class="palact palact3" data-objid="palact3" data-palid="3"></div> | |
| 94 | - <div class="palact palact4" data-objid="palact4" data-palid="4"></div> | |
| 89 | + <fieldset class="palgroup palgrouphorizon" data-objid="palgroup2"> | |
| 90 | + <legend class="pallegend"> Action <span class="buttonstyle">horizon</span> </legend> | |
| 91 | + <div class="palact palact0" data-objid="palact0" data-palid="0"></div> | |
| 92 | + <div class="palact palact1" data-objid="palact1" data-palid="1"></div> | |
| 93 | + <div class="palact palact2" data-objid="palact2" data-palid="2"></div> | |
| 94 | + <div class="palact palact3" data-objid="palact3" data-palid="3"></div> | |
| 95 | + <div class="palact palact4" data-objid="palact4" data-palid="4"></div> | |
| 96 | + </fieldset> | |
| 95 | 97 | |
| 96 | - <script type="text/javascript" src="js/Common.js"></script> | |
| 97 | - <script type="text/javascript" src="js/Queue.js"></script> | |
| 98 | - <script type="text/javascript" src="js/CommandObj.js"></script> | |
| 99 | - <script type="text/javascript" src="js/UI_parts.js"></script> | |
| 98 | + <script type="text/javascript" src="js/Common.js"></script> | |
| 99 | + <script type="text/javascript" src="js/Queue.js"></script> | |
| 100 | + <script type="text/javascript" src="js/CommandObj.js"></script> | |
| 101 | + <script type="text/javascript" src="js/UI_parts.js"></script> | |
| 100 | 102 | <script type="text/javascript" src="js/palette.js"></script> |
| 101 | - <script type="text/javascript" src="js/DispObj.js"></script> | |
| 102 | - <script type="text/javascript" src="js/ObjIDMgr.js"></script> | |
| 103 | - <script type="text/javascript" src="js/ThreadMessage.js"></script> | |
| 104 | - <script type="text/javascript" src="js/DisplayField.js"></script> | |
| 105 | - <script type="text/javascript" src="js/main.js"></script> | |
| 103 | + <script type="text/javascript" src="js/DispObj.js"></script> | |
| 104 | + <script type="text/javascript" src="js/ObjIDMgr.js"></script> | |
| 105 | + <script type="text/javascript" src="js/ThreadMessage.js"></script> | |
| 106 | + <script type="text/javascript" src="js/DisplayField.js"></script> | |
| 107 | + <script type="text/javascript" src="js/main.js"></script> | |
| 106 | 108 | </body> |
| 107 | 109 | </html> |
| @@ -26,7 +26,27 @@ | ||
| 26 | 26 | } |
| 27 | 27 | |
| 28 | 28 | |
| 29 | + // 操作関数 ------------------------------------ | |
| 29 | 30 | |
| 31 | + // 指定座標がこの要素の中にあるかを判定 | |
| 32 | + // DispalyField client座標基準 | |
| 33 | + hitCheck(x, y) { | |
| 34 | + let ret = false; | |
| 35 | + let chkx = parseFloat(x); | |
| 36 | + let chky = parseFloat(y); | |
| 37 | + | |
| 38 | + if (this.x <= chkx && chkx <= this.x + this.width) { | |
| 39 | + if (this.y <= chky && chky <= this.y + this.height) { | |
| 40 | + ret = true; | |
| 41 | + } | |
| 42 | + } | |
| 43 | + | |
| 44 | + return ret; | |
| 45 | + } | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 30 | 50 | // ブラウザ上への描画 ------------------------- |
| 31 | 51 | |
| 32 | 52 | // コマンド要求実行後の描画共通処理 |
| @@ -8,7 +8,9 @@ | ||
| 8 | 8 | debuglog("【ObjIDMgr】 " + str); |
| 9 | 9 | } |
| 10 | 10 | |
| 11 | + // 操作関数 --------------------------- | |
| 11 | 12 | |
| 13 | + // ObjIDMgrへの Element登録処理 | |
| 12 | 14 | // DispObj.createから呼び出される |
| 13 | 15 | registerDispObj(DispObj) { |
| 14 | 16 | if (null == DispObj) { |
| @@ -25,6 +27,8 @@ | ||
| 25 | 27 | return objNumber; |
| 26 | 28 | } |
| 27 | 29 | |
| 30 | + // 管理Elementの描画関数呼び出し | |
| 31 | + // requestAnimationFrame loop内から呼び出される | |
| 28 | 32 | renderAll() { |
| 29 | 33 | for (let i = 0; i < this.ObjIDLen; i++) { |
| 30 | 34 | this.ObjIDarray[i].render(); |
| @@ -41,7 +45,22 @@ | ||
| 41 | 45 | return this.ObjIDarray[numId]; |
| 42 | 46 | } |
| 43 | 47 | |
| 48 | + // DisplayField client座標基準での判定処理 | |
| 49 | + // 管理Element配列が Z軸昇順で並んでいる前提での処理 | |
| 50 | + hitCheck( | |
| 51 | + x, // x座標 | |
| 52 | + y // y座標 | |
| 53 | + ) { | |
| 54 | + let retobj = null; | |
| 55 | + for (let i = this.ObjIDLen - 1; 0 <= i; i--) { | |
| 56 | + if (true == this.ObjIDarray[i].hitCheck(x, y)) { | |
| 57 | + retobj = this.ObjIDarray[i]; | |
| 58 | + break; | |
| 59 | + } | |
| 60 | + } | |
| 44 | 61 | |
| 62 | + return retobj; | |
| 63 | + } | |
| 45 | 64 | |
| 46 | 65 | |
| 47 | 66 | // Command処理 ---------------------- |
| @@ -38,6 +38,7 @@ | ||
| 38 | 38 | let savelink = document.getElementById('save'); |
| 39 | 39 | savelink.addEventListener('click', onClickSaveLink, false); |
| 40 | 40 | |
| 41 | + // パレット作成 | |
| 41 | 42 | window.CSSPalette = new CSSPalette(); |
| 42 | 43 | window.CSSPalette.initialize(); |
| 43 | 44 |
| @@ -82,6 +83,8 @@ | ||
| 82 | 83 | |
| 83 | 84 | // Focus枠, scale, rotate obj描画 |
| 84 | 85 | window.partsFocus.render(); |
| 86 | + // palette描画 | |
| 87 | + window.CSSPalette.render(); | |
| 85 | 88 | |
| 86 | 89 | requestAnimationFrame( renderLoop ); |
| 87 | 90 | })(); |
| @@ -2,6 +2,7 @@ | ||
| 2 | 2 | constructor() { |
| 3 | 3 | this.DOMobject = []; |
| 4 | 4 | this.draggingDOM = null; |
| 5 | + this.renderFunc = new Queue(); | |
| 5 | 6 | } |
| 6 | 7 | |
| 7 | 8 | debuglog(str) { |
| @@ -18,6 +19,8 @@ | ||
| 18 | 19 | // 背景設定パレット |
| 19 | 20 | this.DOMpalbg = document.getElementsByClassName('palbg'); |
| 20 | 21 | for (let cnt = 0; cnt < this.DOMpalbg.length; cnt++) { |
| 22 | + this.DOMpalbg[cnt].style.left = 5 + (25 + 10) * cnt + 'px'; | |
| 23 | + this.DOMpalbg[cnt].style.top = 10 + 'px'; | |
| 21 | 24 | this.DOMpalbg[cnt].addEventListener('mousedown', this.onMouseDown.bind(this), false); |
| 22 | 25 | this.DOMpalbg[cnt].addEventListener('dragstart', this.onDragStart.bind(this), false); |
| 23 | 26 | this.DOMpalbg[cnt].addEventListener('dragover', this.onDragOver.bind(this), false); |
| @@ -26,6 +29,8 @@ | ||
| 26 | 29 | // テキストカラーパレット |
| 27 | 30 | this.DOMpaltxtcol = document.getElementsByClassName('paltxtcol'); |
| 28 | 31 | for (let cnt = 0; cnt < this.DOMpaltxtcol.length; cnt++) { |
| 32 | + this.DOMpaltxtcol[cnt].style.left = 5 + (25 + 10) * cnt + 'px'; | |
| 33 | + this.DOMpaltxtcol[cnt].style.top = 10 + 'px'; | |
| 29 | 34 | this.DOMpaltxtcol[cnt].addEventListener('mousedown', this.onMouseDown.bind(this), false); |
| 30 | 35 | this.DOMpaltxtcol[cnt].addEventListener('dragstart', this.onDragStart.bind(this), false); |
| 31 | 36 | this.DOMpaltxtcol[cnt].addEventListener('dragover', this.onDragOver.bind(this), false); |
| @@ -34,7 +39,10 @@ | ||
| 34 | 39 | // アクションパレット |
| 35 | 40 | this.DOMpalact = document.getElementsByClassName('palact'); |
| 36 | 41 | for (let cnt = 0; cnt < this.DOMpalact.length; cnt++) { |
| 42 | + this.DOMpalact[cnt].style.left = 5 + (25 + 10) * cnt + 'px'; | |
| 43 | + this.DOMpalact[cnt].style.top = 10 + 'px'; | |
| 37 | 44 | this.DOMpalact[cnt].addEventListener('mousedown', this.onMouseDown.bind(this), false); |
| 45 | + this.DOMpalact[cnt].addEventListener('mouseup', this.mouseUp.bind(this), false); | |
| 38 | 46 | this.DOMpalact[cnt].addEventListener('dragstart', this.onDragStart.bind(this), false); |
| 39 | 47 | this.DOMpalact[cnt].addEventListener('dragover', this.onDragOver.bind(this), false); |
| 40 | 48 | this.DOMpalact[cnt].addEventListener('drop', this.onDrop.bind(this), false); |
| @@ -107,7 +115,15 @@ | ||
| 107 | 115 | |
| 108 | 116 | |
| 109 | 117 | |
| 118 | + // 描画関数 --------------------- | |
| 110 | 119 | |
| 120 | + render() { | |
| 121 | + while (0 < this.renderFunc.size()) { | |
| 122 | + let renderFunction = this.renderFunc.dequeue(); | |
| 123 | + renderFunction(); | |
| 124 | + } | |
| 125 | + } | |
| 126 | + | |
| 111 | 127 | // Event handler ----------------------- |
| 112 | 128 | |
| 113 | 129 | // Drag&Drop event : Application外からのfileのやり取り |
| @@ -151,29 +167,62 @@ | ||
| 151 | 167 | // Mouse event |
| 152 | 168 | // 自elementをDragし、Drop時にTarget elementに自分のCSS classを適用する |
| 153 | 169 | onMouseDown(evt) { |
| 154 | - this.draggingDOM = evt.target; | |
| 155 | - | |
| 156 | 170 | // Mouse eventをDisplayFieldからCSSPalに渡してもらうように設定 |
| 157 | 171 | window.displayField.setMouseEventObj(this.mouseMove.bind(this), this.mouseUp.bind(this)); |
| 172 | + | |
| 173 | + // Drag対象を保持 | |
| 174 | + this.draggingDOM = evt.target; | |
| 175 | + // ElementのDrag開始位置を保持 | |
| 176 | + this.startElementX = parseInt(this.draggingDOM.style.left); | |
| 177 | + this.startElementY = parseInt(this.draggingDOM.style.top); | |
| 178 | + // MouseのDrag開始位置を保持 | |
| 179 | + this.startDragX = evt.pageX; | |
| 180 | + this.startDragY = evt.pageY; | |
| 158 | 181 | } |
| 159 | 182 | mouseMove(evt) { |
| 160 | 183 | if (null == this.draggingDOM) return; |
| 161 | 184 | |
| 185 | + // 画像の仮移動 | |
| 186 | + this.endDragX = evt.pageX; | |
| 187 | + this.endDragY = evt.pageY; | |
| 188 | + // 移動量取得 | |
| 189 | + let moveX = this.endDragX - this.startDragX; | |
| 190 | + let moveY = this.endDragY - this.startDragY; | |
| 191 | + // dispObjがあった位置からマウス移動分移動させた後の位置取得 | |
| 192 | + moveX = this.startElementX + moveX; | |
| 193 | + moveY = this.startElementY + moveY; | |
| 162 | 194 | |
| 195 | + this.renderFunc.enqueue(this.renderMoveDragging.bind(this, moveX, moveY)); | |
| 196 | + //this.renderMoveDragging(moveX, moveY); | |
| 163 | 197 | } |
| 198 | + renderMoveDragging(x, y) { | |
| 199 | + this.draggingDOM.style.left = x + "px"; | |
| 200 | + this.draggingDOM.style.top = y + "px"; | |
| 201 | + this.draggingDOM.style.opacity = 0.4; | |
| 202 | + } | |
| 164 | 203 | mouseUp(evt) { |
| 165 | 204 | let palobjid = this.draggingDOM.dataset.objid; |
| 166 | 205 | let palid = this.draggingDOM.dataset.palid; |
| 167 | 206 | |
| 207 | + // 初期表示状態に戻す | |
| 208 | + this.draggingDOM.style.left = this.startElementX + "px"; | |
| 209 | + this.draggingDOM.style.top = this.startElementY + "px"; | |
| 210 | + this.draggingDOM.style.opacity = 1.0; | |
| 211 | + | |
| 168 | 212 | // Drag中 element情報をクリア |
| 169 | 213 | this.draggingDOM = null; |
| 170 | 214 | // Mouse event callback設定をクリア |
| 171 | 215 | window.displayField.setMouseEventObj(null, null); |
| 172 | 216 | |
| 217 | + // マウス座標直下にある要素を検索 | |
| 218 | + // (evt.targetは自分を指してしまうため) | |
| 219 | + let target = window.ObjIDMgr.hitCheck(evt.pageX, evt.pageY); | |
| 220 | + | |
| 173 | 221 | // Drag中 palette elementから target element へ CSS classを追加する |
| 174 | 222 | // 同じ種類のCSS class(Text color, BG imgなど)が既にある場合は上書き |
| 175 | 223 | |
| 176 | - this.replaceCSSclassToElement(palobjid, evt.target); | |
| 224 | + if( null != target) | |
| 225 | + this.replaceCSSclassToElement(palobjid, target.DOMobject); | |
| 177 | 226 | } |
| 178 | 227 | |
| 179 | 228 | // Target element へ CSS classを追加する |