From ee0533d4b1701e9e27dcce90822f241fd7f33f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 4 May 2025 01:00:44 +0200 Subject: [PATCH] Guides cursor --- .../decompiler/flash/gui/ImagePanel.java | 87 +++++++++++++++++- .../flash/gui/graphics/cursors/guide_x.png | Bin 0 -> 4324 bytes .../flash/gui/graphics/cursors/guide_y.png | Bin 0 -> 4331 bytes 3 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/cursors/guide_x.png create mode 100644 src/com/jpexs/decompiler/flash/gui/graphics/cursors/guide_y.png diff --git a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java index fcf0dcdad..06bab3f04 100644 --- a/src/com/jpexs/decompiler/flash/gui/ImagePanel.java +++ b/src/com/jpexs/decompiler/flash/gui/ImagePanel.java @@ -247,6 +247,9 @@ public final class ImagePanel extends JPanel implements MediaDisplay { private static final int MODE_SHEAR_N = -7; private static final int MODE_SHEAR_W = -8; + private static final int MODE_GUIDE_X = -9; + private static final int MODE_GUIDE_Y = -10; + private static Cursor moveCursor; private static Cursor moveRegPointCursor; private static Cursor resizeNWSECursor; @@ -260,6 +263,8 @@ public final class ImagePanel extends JPanel implements MediaDisplay { private static Cursor movePointCursor; private static Cursor defaultCursor; private static Cursor addPointCursor; + private static Cursor guideXCursor; + private static Cursor guideYCursor; private Point2D offsetPoint = new Point2D.Double(0, 0); @@ -365,6 +370,8 @@ public final class ImagePanel extends JPanel implements MediaDisplay { private static final int GUIDE_TEXT_OFFSET = 10; + private static final int GUIDE_MOVE_TOLERANCE = 2; + private SWF guidesSwf = null; private int guidesCharacterId = -1; @@ -650,6 +657,8 @@ public final class ImagePanel extends JPanel implements MediaDisplay { movePointCursor = loadCursor("move_point", 0, 0); defaultCursor = loadCursor("default", 0, 0); addPointCursor = loadCursor("add_point", 0, 0); + guideXCursor = loadCursor("guide_x", 0, 0); + guideYCursor = loadCursor("guide_y", 0, 0); } catch (IOException ex) { Logger.getLogger(MainPanel.class.getName()).log(Level.SEVERE, null, ex); } @@ -1349,13 +1358,13 @@ public final class ImagePanel extends JPanel implements MediaDisplay { } } - int guideTolerance = 2; + mouseMoved(e); //to correctly calculate mode, because mouseMoved event is not called during dragging Point mousePoint = e.getPoint(); for (int d = 0; d < guidesX.size(); d++) { Double guide = guidesX.get(d); int guideInPanel = (int) Math.round(guide * getRealZoom() + offsetPoint.getX()); - if (mousePoint.x >= guideInPanel - guideTolerance && mousePoint.x <= guideInPanel + guideTolerance) { + if (mousePoint.x >= guideInPanel - GUIDE_MOVE_TOLERANCE && mousePoint.x <= guideInPanel + GUIDE_MOVE_TOLERANCE) { guidesX.remove(d); guideDragX = guideInPanel; draggingGuideX = true; @@ -1367,7 +1376,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay { for (int d = 0; d < guidesY.size(); d++) { Double guide = guidesY.get(d); int guideInPanel = (int) Math.round(guide * getRealZoom() + offsetPoint.getY()); - if (mousePoint.y >= guideInPanel - guideTolerance && mousePoint.y <= guideInPanel + guideTolerance) { + if (mousePoint.y >= guideInPanel - GUIDE_MOVE_TOLERANCE && mousePoint.y <= guideInPanel + GUIDE_MOVE_TOLERANCE) { guidesY.remove(d); guideDragY = guideInPanel; draggingGuideY = true; @@ -1376,7 +1385,6 @@ public final class ImagePanel extends JPanel implements MediaDisplay { } } - mouseMoved(e); //to correctly calculate mode, because mouseMoved event is not called during dragging setDragStart(e.getPoint()); if (!shiftDown) { @@ -1556,6 +1564,7 @@ public final class ImagePanel extends JPanel implements MediaDisplay { @Override public void mouseDragged(MouseEvent e) { + mouseMoved(e); List points = hilightedPoints; if (dragStart != null && multiSelect && !inMoving && mode == Cursor.DEFAULT_CURSOR) { @@ -2209,6 +2218,31 @@ public final class ImagePanel extends JPanel implements MediaDisplay { } return; } + + boolean nearGuideX = draggingGuideX; + boolean nearGuideY = draggingGuideY; + + if (!draggingGuideX && !draggingGuideY) { + Point mousePoint = e.getPoint(); + for (int d = 0; d < guidesX.size(); d++) { + Double guide = guidesX.get(d); + int guideInPanel = (int) Math.round(guide * getRealZoom() + offsetPoint.getX()); + if (mousePoint.x >= guideInPanel - GUIDE_MOVE_TOLERANCE && mousePoint.x <= guideInPanel + GUIDE_MOVE_TOLERANCE) { + nearGuideX = true; + break; + } + } + + for (int d = 0; d < guidesY.size(); d++) { + Double guide = guidesY.get(d); + int guideInPanel = (int) Math.round(guide * getRealZoom() + offsetPoint.getY()); + if (mousePoint.y >= guideInPanel - GUIDE_MOVE_TOLERANCE && mousePoint.y <= guideInPanel + GUIDE_MOVE_TOLERANCE) { + nearGuideY = true; + break; + } + } + } + if (doFreeTransform) { if (bounds == null) { return; @@ -2306,6 +2340,12 @@ public final class ImagePanel extends JPanel implements MediaDisplay { newMode = MODE_SHEAR_S; } cursor = shearXCursor; + } else if (nearGuideX) { + newMode = MODE_GUIDE_X; + cursor = guideXCursor; + } else if (nearGuideY) { + newMode = MODE_GUIDE_Y; + cursor = guideYCursor; } else if (inBounds) { newMode = Cursor.MOVE_CURSOR; cursor = moveCursor; @@ -2314,6 +2354,23 @@ public final class ImagePanel extends JPanel implements MediaDisplay { cursor = defaultCursor; } + if (getCursor() != cursor) { + setCursor(cursor); + } + mode = newMode; + } else { + Cursor cursor = null; + Integer newMode = null; + if (nearGuideX) { + newMode = MODE_GUIDE_X; + cursor = guideXCursor; + } else if (nearGuideY) { + newMode = MODE_GUIDE_Y; + cursor = guideYCursor; + } else { + newMode = Cursor.DEFAULT_CURSOR; + cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); + } if (getCursor() != cursor) { setCursor(cursor); } @@ -2683,6 +2740,17 @@ public final class ImagePanel extends JPanel implements MediaDisplay { @Override public void mouseDragged(MouseEvent e) { Component c = SwingUtilities.getDeepestComponentAt(ImagePanel.this, e.getX(), e.getY()); + + if (c == topRuler) { + if (topRuler.getCursor() != guideYCursor) { + topRuler.setCursor(guideYCursor); + } + } else if (c == leftRuler) { + if (leftRuler.getCursor() != guideXCursor) { + leftRuler.setCursor(guideXCursor); + } + } + if (c != iconPanel) { return; } @@ -2730,9 +2798,11 @@ public final class ImagePanel extends JPanel implements MediaDisplay { if (c == topRuler) { draggingGuideY = true; guideDragY = -1; + topRuler.setCursor(guideYCursor); } else if (c == leftRuler) { draggingGuideX = true; guideDragX = -1; + leftRuler.setCursor(guideXCursor); } else if (c == iconPanel) { for (MouseListener l : iconPanel.mouseListeners) { l.mousePressed(convertMouseEvent(e, iconPanel)); @@ -2763,6 +2833,9 @@ public final class ImagePanel extends JPanel implements MediaDisplay { guideDragX = -1; guideDragY = -1; + topRuler.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + leftRuler.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); + if (c != iconPanel) { return; } @@ -4475,7 +4548,11 @@ public final class ImagePanel extends JPanel implements MediaDisplay { } if (!doFreeTransform && hilightedPoints == null) { Cursor newCursor; - if (iconPanel.isAltDown() && !selectionMode) { + if (mode == MODE_GUIDE_X) { + newCursor = guideXCursor; + } else if (mode == MODE_GUIDE_Y) { + newCursor = guideYCursor; + } else if (iconPanel.isAltDown() && !selectionMode) { if (depthStateUnderCursor == null) { newCursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR); } else { diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/cursors/guide_x.png b/src/com/jpexs/decompiler/flash/gui/graphics/cursors/guide_x.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6aa731ac8e83e73ffe784bf41e49943da066cd GIT binary patch literal 4324 zcmeHKeQ*@z89zc3jx#Z75alCNwntJpbZ>X>b8oqe!d*n! zK9UL;kP^^@*jj;U2bjTNDP(jKI)w-^VpN)xGAf8BrWC8v8Ic67T7=Md@AAdyOeZt- zzufHI?mi#C_j!KL^SpC!gL`FRhH9Qlp-^NviyWo!j>unS8vGS&YrllI?pjZUR7yvY zun_X{et<~vFhD?z_bL>z4+8GKjMKRCrf)}MWqPDC=aBP-;JKllPdc3E+kR=SdE?dL zc;_WzRr8a5>YvwPX{#?#z0KKk&Q@G}e^nbdgl750poi_qwv;f+crfMJ{I@px!Si$SIz^v+_Xu?6o!c@h|V%Ysl4T z8|$mPx|+HVZ`s+_dUtC*^3Al%T2gbOsNr_83T3S1=Wlk@HFZQcpF2#P|7_>77-$y<5oavGp$5_K4M`?efF{E9(a#$R5#=u+_gFXu!$Tt z9Os1cuD4#^OnHhL7u?L;7_I(o%c1^*?iA%K7r%Ow%<515z|}XL|EH^8&AhZJt+l_OCvVlYyz}?W$5siy&)>cO2<*EE5BsaawSr!m#la3hRThFwIs231NVb58Bk%Iy%(|&)L+E8eO<6YzI|*QLO;VYFB#L+G^Iq zsUOT&Sz{Cg2mpyjVgY|pq+&L80+)i%vKUh%2@|Q>rmk?g5qn4gh(T-6;%GsPkLc9- zD#R*qUaHjb@CXEav#F~jDNJElG#b@L_1ci&!w8GTg5f$$r$eCyD#n8n9YcfSLKz~7 z;Q%5l@L`D$1rZsOW@0jN(3HuCGDRWl?=r}D3aC@dV(QQ(qe&73}ZxT zJusmpFcK!O#p2a7bOMTFsfR;CfQIGd1GEod;h-;}kO`-jxt%t(PK%FA+miZ*i29uu9>0!`jqrs>fH(Ct@5%!{tO5j>Onb63Ep(g2gfOcks`?ZaUF$E zun%#(H~zn@^exPOc^?5Ldoo@O8cX*83x1=U+f*i;6+7iAcW++HSzB?%5Uf+R^}=wiq#MQH&n z^FbaVSFk}7Tp^1`N~KA#HfA5K0&*Q7Whf4>QOb0<8XHL#lXr~KY^~UL_^>7nCTua# zFDZjt7u*T4v8`}~FSzy(`5CFh54i+_Of51gey8Y~qH9tNOv-qwyQb)x6a$kop6agu z8(pgL!xRX@e?U=qRJwla^*_L4RvJ@W=tvy66#ubzY=TcS!$oUEg(6#$ztaZ13t~_> zLvp$bX8bF4`n~8qsm;x~P}JmfEb~;HzWQvj>QyA&p%-s2EitdHf3bY9t?DQD9B%l8 zII5wa-@j+Bq9d>CrchkJaf7}7<2U%37fdCOyi`u+b^T&!>yJ9;MT!lnxhG53{_(}? z;}69bWrOTz+n3C}@ejqWYezCJ4q2}JswroVfBt=g#HSbQG)IOPSl+Sz`rXA>(#!HT kesg2}9zD2LBXuY5F^V%;78sho_nV5OsVd1d{70ia(Ng8%>k literal 0 HcmV?d00001 diff --git a/src/com/jpexs/decompiler/flash/gui/graphics/cursors/guide_y.png b/src/com/jpexs/decompiler/flash/gui/graphics/cursors/guide_y.png new file mode 100644 index 0000000000000000000000000000000000000000..ad00c034a860ed9ce4e51e81480c44e0963bf849 GIT binary patch literal 4331 zcmeHKeNa@_6<@F-uC7p`i5jf03r!^Y_IIQ@Ow5<2_w540G&3D$ zn*Z2&ANQSm&hMV{yXTzQTkl>`pwrIPYBU<1(_t%uZ$!P5li*XXt-TIkCu%(V^J zp55G(d+?S1Y4^PJa^BLfQXA_}&3sr}swM0R#m%P=H9v1ShwWS3*HYPoocAqk{)o;y zu;|F){a-I$-a(Njs(kv<58wUcg%{Y;uF73!Nb0Yf4m7P>!@7^m(Umr4{NXW+Mw75X zv|8Oxt93XY7{#u&Pg@+vm!zLuU0i6tZ^l*RQfdqPce_2kaMtEWTRLVvRE58BecDbs zGt1DhzWms+#*=$DY(CgNqkTQ{Wx^$cDeFx~{da|0)N3|V`rr9FMElzS2j=D z>znhuu(bECRVOblOdQDALL{eApL?o_DQ{n^N}0d! zE$P~ow%^G8_cpw;sWo-?9V_Q5`IidXdko!`hQ*5pdY^i_r}vJ6r%p;KJ(k}4HvZgf zO@F}i>%k|wdbIyU&pfvO7<=O%*z{SiKD+3g*r2cfS!>hA zVy}iELk@kfh3tVhom=z>@jHV*`Zj&{}H+3c!&S*!V`3UY9?cvyC%23PYVr?P5N_Ed^v*^|J zSs}!W0vj7r!06)`kb{yG=|gFp<53fz<3%YzGqk_}9}SpMP|l#Na6ulZP!QZ8LL7=G zNj%4hqfEA!M`_9nP%p`GD1(y>#qhw#6Q)rRDPG75RAZ^W1_NAALpe|+6R-0Avqdm7HK3IqmlRWIb+e~ zkWYzl63F*M9wApSL1SDY3x>8TYpi~x45<46DMN91jZntuv7ulwwPOrNYsUVI4|7am zREvRjaT#n~uoGe?oBrnlwed6Z(Dg zqfj_Sak}hNE>E6xCwlLj`2!>r?Qq)iJtfDlZY!K|6iJ?3(|V(O@ZZbk@~u0+x6y zQDef^q7VE#o)KO?v;EYz9c#P!^XCp2`#;|9Z|+LpP+E6(7n3)wtNp#3tM=WvG%xM# tD}KpW_xrTjy~{4#%9!Wan(5q{S(D&Ss2vQDrWQ3Qr+tO3ed(j?{{uY79b*6h literal 0 HcmV?d00001