pyqttoolkit 0.8.3__tar.gz → 0.8.4__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 (138) hide show
  1. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/PKG-INFO +2 -2
  2. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/_version.py +3 -3
  3. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/matplotlib/base.py +70 -13
  4. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit.egg-info/PKG-INFO +2 -2
  5. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/MANIFEST.in +0 -0
  6. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/README.md +0 -0
  7. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/__init__.py +0 -0
  8. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/application/__init__.py +0 -0
  9. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/application/application.py +0 -0
  10. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/application/garbage_collector.py +0 -0
  11. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/colors/__init__.py +0 -0
  12. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/config/__init__.py +0 -0
  13. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/config/base.py +0 -0
  14. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/config/composite.py +0 -0
  15. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/config/default.py +0 -0
  16. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/config/environment.py +0 -0
  17. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/config/multi_json_file.py +0 -0
  18. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/config/with_signal.py +0 -0
  19. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/config/with_value_changed.py +0 -0
  20. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/data/__init__.py +0 -0
  21. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/data/bits.py +0 -0
  22. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/data/cache.py +0 -0
  23. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/data/interval.py +0 -0
  24. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/data/message.py +0 -0
  25. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/data/names.py +0 -0
  26. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/datetime/__init__.py +0 -0
  27. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/datetime/datetime.py +0 -0
  28. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/datetime/qdatetime.py +0 -0
  29. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/dependencies/__init__.py +0 -0
  30. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/errors/__init__.py +0 -0
  31. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/exceptions/__init__.py +0 -0
  32. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/filesystem/__init__.py +0 -0
  33. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/logs/__init__.py +0 -0
  34. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/metadata/__init__.py +0 -0
  35. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/metadata/dataframe_metadata_manager.py +0 -0
  36. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/metadata/dict_metadata_manager.py +0 -0
  37. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/metadata/id_generator.py +0 -0
  38. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/metadata/metadata_manager_base.py +0 -0
  39. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/__init__.py +0 -0
  40. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/code_text.py +0 -0
  41. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/dataframetable.py +0 -0
  42. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/dictpropertytree.py +0 -0
  43. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/dicttable.py +0 -0
  44. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/json_text.py +0 -0
  45. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/list_model.py +0 -0
  46. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/module.py +0 -0
  47. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/roles.py +0 -0
  48. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/series_data.py +0 -0
  49. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/span.py +0 -0
  50. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/models/validation.py +0 -0
  51. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/modules/__init__.py +0 -0
  52. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/modules/events/__init__.py +0 -0
  53. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/modules/events/add_signal.py +0 -0
  54. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/modules/events/module_opening.py +0 -0
  55. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/modules/events/rejectable.py +0 -0
  56. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/modules/launcher_config.py +0 -0
  57. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/modules/module.py +0 -0
  58. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/properties/__init__.py +0 -0
  59. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/properties/auto.py +0 -0
  60. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/properties/throttled.py +0 -0
  61. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/scripting/__init__.py +0 -0
  62. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/scripting/script_context.py +0 -0
  63. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/scripting/script_runner.py +0 -0
  64. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/scripting/script_template.py +0 -0
  65. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/__init__.py +0 -0
  66. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/autosave.py +0 -0
  67. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/email.py +0 -0
  68. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/event_registry.py +0 -0
  69. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/file_dialog.py +0 -0
  70. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/hotkey_manager.py +0 -0
  71. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/link_manager.py +0 -0
  72. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/message_board.py +0 -0
  73. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/module_service.py +0 -0
  74. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/object_converter.py +0 -0
  75. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/project_updater.py +0 -0
  76. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/task_runner.py +0 -0
  77. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/theme_manager.py +0 -0
  78. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/services/tool_window_service.py +0 -0
  79. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/viewmanagers/__init__.py +0 -0
  80. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/viewmanagers/tool.py +0 -0
  81. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/__init__.py +0 -0
  82. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/bulk_value_selector.py +0 -0
  83. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/check_box.py +0 -0
  84. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/code/__init__.py +0 -0
  85. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/code/code_edit.py +0 -0
  86. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/code/python_syntax.py +0 -0
  87. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/combo_box.py +0 -0
  88. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/count_selector.py +0 -0
  89. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/datetime.py +0 -0
  90. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/datetime_range_selector.py +0 -0
  91. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/default_text_line_edit.py +0 -0
  92. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/delegates.py +0 -0
  93. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/dtype_edit.py +0 -0
  94. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/editable_combo_box.py +0 -0
  95. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/file_selector.py +0 -0
  96. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/icon.py +0 -0
  97. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/icon_button.py +0 -0
  98. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/json_edit.py +0 -0
  99. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/labelled.py +0 -0
  100. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/layout/__init__.py +0 -0
  101. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/layout/collabsible.py +0 -0
  102. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/layout/group_box.py +0 -0
  103. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/layout/group_panel.py +0 -0
  104. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/layout/lines.py +0 -0
  105. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/layout/link.py +0 -0
  106. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/line_edit.py +0 -0
  107. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/linkable.py +0 -0
  108. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/list_view.py +0 -0
  109. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/main_window.py +0 -0
  110. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/metadata_selector.py +0 -0
  111. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/modulewindow.py +0 -0
  112. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/__init__.py +0 -0
  113. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/legend_control.py +0 -0
  114. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/matplotlib/__init__.py +0 -0
  115. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/matplotlib/colorbar.py +0 -0
  116. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/matplotlib/colormap.py +0 -0
  117. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/matplotlib/font.py +0 -0
  118. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/plot_options.py +0 -0
  119. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/plot_toolbar_options.py +0 -0
  120. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/size.py +0 -0
  121. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/tool_type.py +0 -0
  122. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/plot/toolbar.py +0 -0
  123. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/popout.py +0 -0
  124. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/popup.py +0 -0
  125. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/property_tree.py +0 -0
  126. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/shrunk_push_button.py +0 -0
  127. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/steppable_combo_box.py +0 -0
  128. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/styleable.py +0 -0
  129. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/table.py +0 -0
  130. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/text_edit.py +0 -0
  131. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit/views/tool_window.py +0 -0
  132. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit.egg-info/SOURCES.txt +0 -0
  133. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit.egg-info/dependency_links.txt +0 -0
  134. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit.egg-info/requires.txt +0 -0
  135. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/pyqttoolkit.egg-info/top_level.txt +0 -0
  136. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/setup.cfg +0 -0
  137. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/setup.py +0 -0
  138. {pyqttoolkit-0.8.3 → pyqttoolkit-0.8.4}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyqttoolkit
3
- Version: 0.8.3
3
+ Version: 0.8.4
4
4
  Summary: A toolkit for PyQt 5
5
5
  Home-page: https://github.com/BitBloomTech/pyqttoolkit
6
6
  Author: Bitbloom Ltd
@@ -12,6 +12,6 @@ Description: # PyQtToolkit
12
12
  Platform: any
13
13
  Requires-Python: >=3.6
14
14
  Description-Content-Type: text/markdown
15
- Provides-Extra: publish
16
15
  Provides-Extra: ui
17
16
  Provides-Extra: test
17
+ Provides-Extra: publish
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2026-05-04T06:27:07-0600",
11
+ "date": "2026-05-26T12:07:12+0100",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "a0aea194ad7d14e531d359a4506037536745f7e1",
15
- "version": "0.8.3"
14
+ "full-revisionid": "77a7c47c6c4c8168010c762ac8e6bda38891aa10",
15
+ "version": "0.8.4"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -15,6 +15,7 @@
15
15
  # along with this program; if not, write to the Free Software Foundation,
16
16
  # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
  from io import BytesIO
18
+ import math
18
19
  import numpy as np
19
20
  from datetime import datetime
20
21
 
@@ -23,6 +24,7 @@ from PyQt5.QtWidgets import QVBoxLayout, QWidget, QMenu, QAction, QApplication
23
24
  from PyQt5.QtGui import QKeySequence, QImage
24
25
 
25
26
  import matplotlib
27
+ import matplotlib.dates as mdates
26
28
  from matplotlib.legend import DraggableLegend
27
29
  from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
28
30
  from matplotlib.figure import Figure
@@ -202,6 +204,7 @@ class MatPlotLibBase(QWidget):
202
204
  self._setting_axis_limits = False
203
205
 
204
206
  self.hasHiddenSeries = False
207
+ self._axes.grid(False)
205
208
 
206
209
  enabledToolsChanged = pyqtSignal()
207
210
  spanChanged = pyqtSignal(SpanModel)
@@ -868,23 +871,31 @@ class MatPlotLibBase(QWidget):
868
871
  if not self.data:
869
872
  return
870
873
  if hasattr(self.data, 'x_labels'):
871
- step = self.data.x_tick_interval if hasattr(self.data, 'x_tick_interval') else None
872
- x_ticks, x_labels, x_ticks_rotation = self._get_labels(self.data.x_labels, step, horizontal=True)
873
- self._axes.set_xticks(x_ticks)
874
+ if len(self.data.x_labels) > 0 and all(isinstance(x, (np.datetime64, pd.Timestamp)) for x in self.data.x_labels):
875
+ x_labels = self.data.x_labels
876
+ self._update_date_xticks(x_labels)
877
+ x_ticks_rotation = 0.0
878
+ else:
879
+ step = self.data.x_tick_interval if hasattr(self.data, 'x_tick_interval') else None
880
+ x_ticks, x_labels, x_ticks_rotation = self._get_labels(self.data.x_labels, step, horizontal=True)
881
+ self._axes.set_xticks(x_ticks, x_labels)
874
882
  if hasattr(self.data, 'x_ticks_rotation'):
875
883
  rotation = x_ticks_rotation if np.isnan(self.data.x_ticks_rotation) else self.data.x_ticks_rotation
876
- self._axes.set_xticklabels(
877
- x_labels, rotation=rotation, ha='right' if rotation else 'center')
878
- self._adjust_to_xticklabels_height(x_labels, rotation)
879
- else:
880
- self._axes.set_xticklabels(x_labels)
884
+ self._axes.xaxis.set_tick_params(labelrotation=rotation)
885
+ matplotlib.artist.setp(self._axes.get_xticklabels(),
886
+ horizontalalignment='right' if rotation else 'center')
887
+ self._adjust_to_xticklabels_height(self._axes.get_xticklabels(), rotation)
881
888
 
882
889
  if hasattr(self.data, 'y_labels'):
883
- step = self.data.y_tick_interval if hasattr(self.data, 'y_tick_interval') else None
884
- y_ticks, y_labels, _ = self._get_labels(self.data.y_labels, step, horizontal=False)
885
- self._axes.set_yticks(y_ticks)
886
- self._axes.set_yticklabels(y_labels)
887
- self._adjust_to_yticklabels_width(y_labels)
890
+ if len(self.data.y_labels) > 0 and all(isinstance(y, (np.datetime64, pd.Timestamp)) for y in self.data.y_labels):
891
+ y_labels = self.data.y_labels
892
+ self._update_date_yticks(y_labels)
893
+ else:
894
+ step = self.data.y_tick_interval if hasattr(self.data, 'y_tick_interval') else None
895
+ y_ticks, y_labels, _ = self._get_labels(self.data.y_labels, step, horizontal=False)
896
+ self._axes.set_yticks(y_ticks)
897
+ self._axes.set_yticklabels(y_labels)
898
+ self._adjust_to_yticklabels_width(y_labels)
888
899
 
889
900
  def _adjust_to_yticklabels_width(self, labels):
890
901
  sizes = self._divider.get_horizontal()
@@ -919,6 +930,52 @@ class MatPlotLibBase(QWidget):
919
930
  sizes[0] = Size.Fixed(height / self._figure.dpi)
920
931
  self._divider.set_vertical(sizes)
921
932
 
933
+ def _update_date_yticks(self, y_labels):
934
+ x_extent, y_extent = self._get_xy_extents()
935
+ ipositions, tick_formats, axis_label = self._determine_date_ticks(y_labels, self.axes.yaxis, self.data.yAxisTitle, y_extent)
936
+ self._axes.set_yticks(ipositions, tick_formats)
937
+ self._axes.set_ylabel(axis_label)
938
+ self._adjust_to_yticklabels_width(tick_formats)
939
+
940
+ def _update_date_xticks(self, x_labels):
941
+ x_extent, y_extent = self._get_xy_extents()
942
+ ipositions, tick_formats, axis_label = self._determine_date_ticks(x_labels, self.axes.xaxis, self.data.xAxisTitle, x_extent)
943
+ self._axes.set_xticks(ipositions, tick_formats)
944
+ self._axes.set_xlabel(axis_label)
945
+
946
+ def _determine_date_ticks(self, labels, axis_obj, axis_title, extent):
947
+ e0, e1 = extent
948
+ imin, imax = max(0, math.floor(e0)), min(math.ceil(e1), len(labels) - 1)
949
+ # Convert all labels to date numbers for robust min/max handling
950
+ label_dates = [mdates.date2num(lbl) for lbl in labels]
951
+ date_num_min = min(label_dates)
952
+ date_num_max = max(label_dates)
953
+
954
+ locator = mdates.AutoDateLocator(maxticks=max(1, min(imax - imin, 25)))
955
+ offset_formats = ['', '%Y', '%Y-%b', '%Y-%b', '%Y-%m-%d', '%Y-%m-%d']
956
+ formatter = mdates.ConciseDateFormatter(locator,
957
+ offset_formats=offset_formats)
958
+
959
+ if date_num_max == date_num_min:
960
+ tick_vals = np.array([date_num_min])
961
+ ipositions = np.array([(imin + imax) / 2.0])
962
+ tick_formats = formatter.format_ticks(tick_vals)
963
+ axis_label = f'{axis_title} ({formatter.get_offset()})' if formatter.get_offset() else axis_title
964
+ return ipositions, tick_formats, axis_label
965
+
966
+ # Ensure correct order for tick_values
967
+ if label_dates[imin] <= label_dates[imax]:
968
+ tick_vals = locator.tick_values(labels[imin], labels[imax])
969
+ ipositions = (len(labels) - 1) * (tick_vals - date_num_min) / (date_num_max - date_num_min) - 0.5
970
+ else:
971
+ tick_vals = locator.tick_values(labels[imax], labels[imin])
972
+ ipositions = (len(labels) - 1) * (tick_vals[::-1] - date_num_min) / (date_num_max - date_num_min) - 0.5
973
+
974
+ tick_formats = formatter.format_ticks(tick_vals)
975
+ axis_label = f'{axis_title} ({formatter.get_offset()})' if formatter.get_offset() else axis_title
976
+ return ipositions, tick_formats, axis_label
977
+
978
+
922
979
  def _get_labels(self, labels, step, horizontal=True):
923
980
  (x0, x1), (y0, y1) = self._get_xy_extents()
924
981
  start, end = (int(x0), int(x1)) if horizontal else (int(y0), int(y1))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: pyqttoolkit
3
- Version: 0.8.3
3
+ Version: 0.8.4
4
4
  Summary: A toolkit for PyQt 5
5
5
  Home-page: https://github.com/BitBloomTech/pyqttoolkit
6
6
  Author: Bitbloom Ltd
@@ -12,6 +12,6 @@ Description: # PyQtToolkit
12
12
  Platform: any
13
13
  Requires-Python: >=3.6
14
14
  Description-Content-Type: text/markdown
15
- Provides-Extra: publish
16
15
  Provides-Extra: ui
17
16
  Provides-Extra: test
17
+ Provides-Extra: publish
File without changes
File without changes
File without changes
File without changes
File without changes