kaxe 1.8.1.dev4__tar.gz → 1.8.1.dev5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. {kaxe-1.8.1.dev4/src/kaxe.egg-info → kaxe-1.8.1.dev5}/PKG-INFO +1 -1
  2. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/pyproject.toml +1 -1
  3. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/viewer/window.py +21 -6
  4. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5/src/kaxe.egg-info}/PKG-INFO +1 -1
  5. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/tests/test_viewer.py +7 -5
  6. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/LICENSE +0 -0
  7. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/MANIFEST.in +0 -0
  8. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/README.md +0 -0
  9. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/setup.cfg +0 -0
  10. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/__init__.py +0 -0
  11. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/__main__.py +0 -0
  12. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/_require_3d.py +0 -0
  13. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/_require_viewer.py +0 -0
  14. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/chart/__init__.py +0 -0
  15. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/chart/bar.py +0 -0
  16. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/chart/box.py +0 -0
  17. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/chart/pie.py +0 -0
  18. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/chart/qqplot.py +0 -0
  19. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/cli.py +0 -0
  20. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/__init__.py +0 -0
  21. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/axis.py +0 -0
  22. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/bounds.py +0 -0
  23. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/color.py +0 -0
  24. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/backend.py +0 -0
  25. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/camera.py +0 -0
  26. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/helper.py +0 -0
  27. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/hud.py +0 -0
  28. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/objects/__init__.py +0 -0
  29. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/objects/color.py +0 -0
  30. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/objects/line.py +0 -0
  31. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/objects/point.py +0 -0
  32. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/objects/pointer.py +0 -0
  33. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/objects/triangle.py +0 -0
  34. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/openglrender.py +0 -0
  35. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/d3/translator.py +0 -0
  36. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/draw.py +0 -0
  37. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/fileloader.py +0 -0
  38. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/helper.py +0 -0
  39. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/ipython_display.py +0 -0
  40. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/legend.py +0 -0
  41. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/line.py +0 -0
  42. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/marker.py +0 -0
  43. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/palette.py +0 -0
  44. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/profiler.py +0 -0
  45. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/progress.py +0 -0
  46. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/round.py +0 -0
  47. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/shapes.py +0 -0
  48. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/styles.py +0 -0
  49. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/svg.py +0 -0
  50. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/svg_pdf.py +0 -0
  51. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/symbol.py +0 -0
  52. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/text.py +0 -0
  53. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/thin.py +0 -0
  54. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/core/window.py +0 -0
  55. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/data/__init__.py +0 -0
  56. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/data/excel.py +0 -0
  57. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/__init__.py +0 -0
  58. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/_lazy.py +0 -0
  59. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/__init__.py +0 -0
  60. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/arrow.py +0 -0
  61. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/bubble.py +0 -0
  62. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/contour.py +0 -0
  63. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/equation.py +0 -0
  64. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/fill.py +0 -0
  65. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/function.py +0 -0
  66. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/guide_grid.py +0 -0
  67. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/inequality.py +0 -0
  68. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/map.py +0 -0
  69. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/parameter.py +0 -0
  70. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/pillar.py +0 -0
  71. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d2/point.py +0 -0
  72. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d3/__init__.py +0 -0
  73. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d3/base.py +0 -0
  74. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d3/function.py +0 -0
  75. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d3/mesh.py +0 -0
  76. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d3/point.py +0 -0
  77. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/d3/potato.py +0 -0
  78. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/function.py +0 -0
  79. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/legend.py +0 -0
  80. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/mapdata.py +0 -0
  81. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/point.py +0 -0
  82. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/objects/text.py +0 -0
  83. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/__init__.py +0 -0
  84. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/_lazy.py +0 -0
  85. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/box.py +0 -0
  86. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/constants.py +0 -0
  87. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/d3/__init__.py +0 -0
  88. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/d3/axes.py +0 -0
  89. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/d3/geometry.py +0 -0
  90. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/d3/plot3d.py +0 -0
  91. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/d3/variants.py +0 -0
  92. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/double.py +0 -0
  93. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/empty.py +0 -0
  94. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/grid.py +0 -0
  95. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/log.py +0 -0
  96. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/polar.py +0 -0
  97. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/standard.py +0 -0
  98. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/themes.py +0 -0
  99. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/zoom.py +0 -0
  100. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/plot/zoom_connector.py +0 -0
  101. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/project/__init__.py +0 -0
  102. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/project/codec.py +0 -0
  103. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/project/context.py +0 -0
  104. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/project/document.py +0 -0
  105. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/project/registry.py +0 -0
  106. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/project/sample.py +0 -0
  107. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/project/sampled_curve.py +0 -0
  108. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/project/serializers.py +0 -0
  109. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/project/window.py +0 -0
  110. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/__init__.py +0 -0
  111. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/__init__.py +0 -0
  112. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.bright-oblique.ttf +0 -0
  113. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.bright-roman.ttf +0 -0
  114. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.bright-semibold.ttf +0 -0
  115. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.bright-semiboldoblique.ttf +0 -0
  116. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.classical-serif-italic.ttf +0 -0
  117. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.concrete-bold.ttf +0 -0
  118. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.concrete-bolditalic.ttf +0 -0
  119. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.concrete-italic.ttf +0 -0
  120. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.concrete-roman.ttf +0 -0
  121. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-bold.ttf +0 -0
  122. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-boldoblique.ttf +0 -0
  123. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-demi-condensed-demicondensed.ttf +0 -0
  124. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-medium.ttf +0 -0
  125. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.sans-serif-oblique.ttf +0 -0
  126. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.serif-bold.ttf +0 -0
  127. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.serif-bolditalic.ttf +0 -0
  128. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.serif-extra-boldslanted.ttf +0 -0
  129. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.serif-extra-romanslanted.ttf +0 -0
  130. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.serif-italic.ttf +0 -0
  131. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.serif-roman.ttf +0 -0
  132. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.serif-upright-italic-uprightitalic.ttf +0 -0
  133. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-bold.ttf +0 -0
  134. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-bolditalic.ttf +0 -0
  135. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-italic.ttf +0 -0
  136. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-light.ttf +0 -0
  137. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-lightoblique.ttf +0 -0
  138. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-regular.ttf +0 -0
  139. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-variable-width-italic.ttf +0 -0
  140. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/cmu.typewriter-text-variable-width-medium.ttf +0 -0
  141. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/computer-modern-family/readme.txt +0 -0
  142. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/resources/logo-small.png +0 -0
  143. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/viewer/__init__.py +0 -0
  144. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/viewer/cli.py +0 -0
  145. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/viewer/client.py +0 -0
  146. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe/viewer/server.py +0 -0
  147. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe.egg-info/SOURCES.txt +0 -0
  148. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe.egg-info/dependency_links.txt +0 -0
  149. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe.egg-info/entry_points.txt +0 -0
  150. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe.egg-info/requires.txt +0 -0
  151. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/src/kaxe.egg-info/top_level.txt +0 -0
  152. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/tests/test.py +0 -0
  153. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/tests/test2.py +0 -0
  154. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/tests/test3.py +0 -0
  155. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/tests/test_4.py +0 -0
  156. {kaxe-1.8.1.dev4 → kaxe-1.8.1.dev5}/tests/test_5.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kaxe
3
- Version: 1.8.1.dev4
3
+ Version: 1.8.1.dev5
4
4
  Summary: A small graphing tool for functions, points, equations and more
5
5
  Author-email: Valter Yde Daugberg <valteryde@hotmail.com>
6
6
  Project-URL: Homepage, https://github.com/valteryde/kaxe
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "kaxe"
3
- version = "1.8.1.dev4"
3
+ version = "1.8.1.dev5"
4
4
  authors = [
5
5
  { name="Valter Yde Daugberg", email="valteryde@hotmail.com" },
6
6
  ]
@@ -268,7 +268,14 @@ class KaxeViewerWindow(pyglet.window.Window):
268
268
 
269
269
  # Mouse interaction state
270
270
  self.dragging_card: Optional[PlotCard] = None
271
+ self.drag_offset_x: float = 0.0
272
+ self.drag_offset_y: float = 0.0
273
+
271
274
  self.is_panning_camera: bool = False
275
+ self.pan_start_x: float = 0.0
276
+ self.pan_start_y: float = 0.0
277
+ self.pan_camera_start_x: float = 0.0
278
+ self.pan_camera_start_y: float = 0.0
272
279
 
273
280
  self.show_hud: bool = True
274
281
  self.notification_text: str = ""
@@ -455,20 +462,28 @@ class KaxeViewerWindow(pyglet.window.Window):
455
462
  self.cards.append(hit_card)
456
463
  self.select_card(hit_card)
457
464
  self.dragging_card = hit_card
465
+ # Anchor grab offset so dragging sticks directly to the cursor
466
+ self.drag_offset_x = wx - hit_card.world_x
467
+ self.drag_offset_y = wy - hit_card.world_y
458
468
  else:
459
469
  # Clicked empty canvas -> pan
460
470
  self.select_card(None)
461
471
  self.is_panning_camera = True
472
+ self.pan_start_x = x
473
+ self.pan_start_y = y
474
+ self.pan_camera_start_x = self.camera_x
475
+ self.pan_camera_start_y = self.camera_y
462
476
 
463
477
  def on_mouse_drag(self, x: int, y: int, dx: int, dy: int, buttons: int, modifiers: int):
464
478
  if self.dragging_card:
465
- # Move card in world space
466
- self.dragging_card.world_x += dx / self.zoom
467
- self.dragging_card.world_y += dy / self.zoom
479
+ # Absolute position tracking: card sticks precisely to the cursor
480
+ wx, wy = self.screen_to_world(x, y)
481
+ self.dragging_card.world_x = wx - self.drag_offset_x
482
+ self.dragging_card.world_y = wy - self.drag_offset_y
468
483
  elif self.is_panning_camera:
469
- # Move camera in world space
470
- self.camera_x -= dx / self.zoom
471
- self.camera_y -= dy / self.zoom
484
+ # Absolute canvas panning: workspace follows the mouse 1:1
485
+ self.camera_x = self.pan_camera_start_x - (x - self.pan_start_x) / self.zoom
486
+ self.camera_y = self.pan_camera_start_y - (y - self.pan_start_y) / self.zoom
472
487
 
473
488
  def on_mouse_release(self, x: int, y: int, button: int, modifiers: int):
474
489
  self.dragging_card = None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kaxe
3
- Version: 1.8.1.dev4
3
+ Version: 1.8.1.dev5
4
4
  Summary: A small graphing tool for functions, points, equations and more
5
5
  Author-email: Valter Yde Daugberg <valteryde@hotmail.com>
6
6
  Project-URL: Homepage, https://github.com/valteryde/kaxe
@@ -282,11 +282,13 @@ def test_canvas_multi_card_and_versioning():
282
282
  assert window.cards[0].card_id == "graph_1"
283
283
  assert window.cards[1].card_id == "graph_2"
284
284
 
285
- # 4. Moving card changes its coordinates
286
- orig_x = window.cards[1].world_x
287
- window.dragging_card = window.cards[1]
288
- window.on_mouse_drag(x=100, y=100, dx=30, dy=15, buttons=1, modifiers=0)
289
- assert window.cards[1].world_x > orig_x
285
+ # 4. Moving card changes its coordinates via press and drag
286
+ card = window.cards[1]
287
+ sx, sy = window.world_to_screen(card.world_x + 20, card.world_y + 20)
288
+ window.on_mouse_press(int(sx), int(sy), button=1, modifiers=0)
289
+ orig_x = card.world_x
290
+ window.on_mouse_drag(int(sx + 50), int(sy + 20), dx=50, dy=20, buttons=1, modifiers=0)
291
+ assert card.world_x > orig_x
290
292
 
291
293
  window.close()
292
294
 
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes