synodic-client 0.0.1.dev79__tar.gz → 0.0.1.dev80__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 (105) hide show
  1. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/PKG-INFO +1 -1
  2. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/pyproject.toml +4 -4
  3. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/plugin_row.py +23 -3
  4. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/screen.py +5 -0
  5. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/tool_update_controller.py +1 -0
  6. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/theme.py +30 -13
  7. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/LICENSE.md +0 -0
  8. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/README.md +0 -0
  9. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/__init__.py +0 -0
  10. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/__main__.py +0 -0
  11. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/__init__.py +0 -0
  12. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/bootstrap.py +0 -0
  13. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/config_store.py +0 -0
  14. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/data.py +0 -0
  15. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/debug.py +0 -0
  16. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/icon.py +0 -0
  17. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/init.py +0 -0
  18. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/instance.py +0 -0
  19. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/package_state.py +0 -0
  20. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/qt.py +0 -0
  21. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/schema.py +0 -0
  22. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/__init__.py +0 -0
  23. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/action_card.py +0 -0
  24. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/card.py +0 -0
  25. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/install.py +0 -0
  26. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/install_workers.py +0 -0
  27. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/log_panel.py +0 -0
  28. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/projects.py +0 -0
  29. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/schema.py +0 -0
  30. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/settings.py +0 -0
  31. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/sidebar.py +0 -0
  32. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/spinner.py +0 -0
  33. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/tray.py +0 -0
  34. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/screen/update_banner.py +0 -0
  35. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/update_controller.py +0 -0
  36. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/update_model.py +0 -0
  37. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/application/uri.py +0 -0
  38. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/cli/__init__.py +0 -0
  39. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/cli/config.py +0 -0
  40. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/cli/context.py +0 -0
  41. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/cli/debug.py +0 -0
  42. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/cli/install.py +0 -0
  43. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/cli/output.py +0 -0
  44. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/cli/project.py +0 -0
  45. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/cli/tool.py +0 -0
  46. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/cli/update.py +0 -0
  47. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/client.py +0 -0
  48. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/config.py +0 -0
  49. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/logging.py +0 -0
  50. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/operations/__init__.py +0 -0
  51. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/operations/bootstrap.py +0 -0
  52. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/operations/config.py +0 -0
  53. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/operations/install.py +0 -0
  54. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/operations/project.py +0 -0
  55. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/operations/schema.py +0 -0
  56. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/operations/tool.py +0 -0
  57. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/operations/update.py +0 -0
  58. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/protocol.py +0 -0
  59. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/py.typed +0 -0
  60. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/resolution.py +0 -0
  61. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/schema.py +0 -0
  62. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/startup.py +0 -0
  63. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/subprocess_patch.py +0 -0
  64. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/synodic_client/updater.py +0 -0
  65. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/__init__.py +0 -0
  66. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/conftest.py +0 -0
  67. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/__init__.py +0 -0
  68. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/operations/__init__.py +0 -0
  69. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/operations/test_config.py +0 -0
  70. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/operations/test_install.py +0 -0
  71. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/operations/test_install_plan.py +0 -0
  72. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/operations/test_project.py +0 -0
  73. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/operations/test_tool.py +0 -0
  74. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/operations/test_update.py +0 -0
  75. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/__init__.py +0 -0
  76. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/conftest.py +0 -0
  77. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_action_card.py +0 -0
  78. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_gather_packages.py +0 -0
  79. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_install_preview.py +0 -0
  80. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_log_panel.py +0 -0
  81. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_logging.py +0 -0
  82. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_package_state.py +0 -0
  83. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_preview_model.py +0 -0
  84. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_settings.py +0 -0
  85. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_sidebar.py +0 -0
  86. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_tray_window_show.py +0 -0
  87. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_update_banner.py +0 -0
  88. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_update_controller.py +0 -0
  89. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/qt/test_update_feedback.py +0 -0
  90. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_bootstrap.py +0 -0
  91. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_cli.py +0 -0
  92. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_client_updater.py +0 -0
  93. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_client_version.py +0 -0
  94. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_config.py +0 -0
  95. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_examples.py +0 -0
  96. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_init.py +0 -0
  97. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_install.py +0 -0
  98. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_resolution.py +0 -0
  99. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_updater.py +0 -0
  100. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_uri.py +0 -0
  101. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/test_workers.py +0 -0
  102. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/windows/__init__.py +0 -0
  103. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/windows/conftest.py +0 -0
  104. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/windows/test_protocol.py +0 -0
  105. {synodic_client-0.0.1.dev79 → synodic_client-0.0.1.dev80}/tests/unit/windows/test_startup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: synodic_client
3
- Version: 0.0.1.dev79
3
+ Version: 0.0.1.dev80
4
4
  Author-Email: Synodic Software <contact@synodic.software>
5
5
  License: LGPL-3.0-or-later
6
6
  Project-URL: homepage, https://github.com/synodic/synodic-client
@@ -15,7 +15,7 @@ dependencies = [
15
15
  "velopack>=0.0.1521.dev61717",
16
16
  "typer>=0.24.1",
17
17
  ]
18
- version = "0.0.1.dev79"
18
+ version = "0.0.1.dev80"
19
19
 
20
20
  [project.license]
21
21
  text = "LGPL-3.0-or-later"
@@ -35,12 +35,12 @@ build = [
35
35
  "pyinstaller>=6.19.0",
36
36
  ]
37
37
  lint = [
38
- "ruff>=0.15.6",
39
- "pyrefly>=0.57.0",
38
+ "ruff>=0.15.7",
39
+ "pyrefly>=0.57.1",
40
40
  ]
41
41
  test = [
42
42
  "pytest>=9.0.2",
43
- "pytest-cov>=7.0.0",
43
+ "pytest-cov>=7.1.0",
44
44
  "pytest-mock>=3.15.1",
45
45
  ]
46
46
 
@@ -25,6 +25,7 @@ from synodic_client.application.screen.schema import PluginRowData, ProjectInsta
25
25
  from synodic_client.application.screen.spinner import SpinnerCanvas
26
26
  from synodic_client.application.theme import (
27
27
  FILTER_CHIP_STYLE,
28
+ PLUGIN_CHECK_STYLE,
28
29
  PLUGIN_KIND_HEADER_STYLE,
29
30
  PLUGIN_PROVIDER_NAME_STYLE,
30
31
  PLUGIN_PROVIDER_RUNTIME_TAG_DEFAULT_STYLE,
@@ -138,6 +139,9 @@ class PluginProviderHeader(QFrame):
138
139
  auto_update_toggled = Signal(str, bool)
139
140
  """Emitted with ``(plugin_name, enabled)`` when the auto-update toggle changes."""
140
141
 
142
+ check_requested = Signal(str)
143
+ """Emitted with the plugin name when the manual check-for-updates button is clicked."""
144
+
141
145
  update_requested = Signal(str)
142
146
  """Emitted with the plugin name when the per-plugin *Update* button is clicked."""
143
147
 
@@ -159,6 +163,7 @@ class PluginProviderHeader(QFrame):
159
163
  self._runtime_tag = ''
160
164
  self._signal_key = plugin.name
161
165
  self._update_btn: QPushButton | None = None
166
+ self._check_btn: QPushButton | None = None
162
167
  self._checking_spinner: _RowSpinner | None = None
163
168
 
164
169
  self._layout = QHBoxLayout(self)
@@ -230,8 +235,8 @@ class PluginProviderHeader(QFrame):
230
235
  auto_update: bool,
231
236
  has_updates: bool,
232
237
  ) -> None:
233
- """Build Auto/Update control buttons."""
234
- toggle_btn = QPushButton('Auto')
238
+ """Build auto-update toggle, check, and Update control buttons."""
239
+ toggle_btn = QPushButton('\u21ba')
235
240
  toggle_btn.setCheckable(True)
236
241
  toggle_btn.setChecked(auto_update)
237
242
  toggle_btn.setStyleSheet(PLUGIN_TOGGLE_STYLE)
@@ -241,6 +246,15 @@ class PluginProviderHeader(QFrame):
241
246
  )
242
247
  layout.addWidget(toggle_btn)
243
248
 
249
+ check_btn = QPushButton('\u27f3')
250
+ check_btn.setStyleSheet(PLUGIN_CHECK_STYLE)
251
+ check_btn.setToolTip('Check for updates now')
252
+ check_btn.clicked.connect(
253
+ lambda: self.check_requested.emit(self._signal_key),
254
+ )
255
+ self._check_btn = check_btn
256
+ layout.addWidget(check_btn)
257
+
244
258
  self._checking_spinner = _RowSpinner(self)
245
259
  layout.addWidget(self._checking_spinner)
246
260
 
@@ -258,6 +272,8 @@ class PluginProviderHeader(QFrame):
258
272
  toggle_btn.setEnabled(False)
259
273
  toggle_btn.setChecked(False)
260
274
  toggle_btn.setToolTip('Not installed \u2014 cannot auto-update')
275
+ check_btn.setEnabled(False)
276
+ check_btn.setToolTip('Not installed \u2014 cannot check for updates')
261
277
  update_btn.setEnabled(False)
262
278
  update_btn.setToolTip('Not installed \u2014 cannot update')
263
279
 
@@ -281,10 +297,14 @@ class PluginProviderHeader(QFrame):
281
297
  return
282
298
  if checking:
283
299
  self._checking_spinner.start()
300
+ if self._check_btn is not None:
301
+ self._check_btn.hide()
284
302
  if self._update_btn is not None:
285
303
  self._update_btn.hide()
286
304
  else:
287
305
  self._checking_spinner.stop()
306
+ if self._check_btn is not None:
307
+ self._check_btn.show()
288
308
 
289
309
  def set_error(self, message: str) -> None:
290
310
  """Show a transient inline error that auto-hides after ~5 seconds."""
@@ -443,7 +463,7 @@ class PluginRow(QFrame):
443
463
 
444
464
  def _build_toggle(self, layout: QHBoxLayout, data: PluginRowData) -> None:
445
465
  """Add the auto-update toggle button."""
446
- toggle_btn = QPushButton('Auto')
466
+ toggle_btn = QPushButton('\u21ba')
447
467
  toggle_btn.setCheckable(True)
448
468
  toggle_btn.setChecked(data.auto_update)
449
469
  toggle_btn.setStyleSheet(PLUGIN_ROW_TOGGLE_STYLE)
@@ -95,6 +95,9 @@ class ToolsView(QWidget):
95
95
  update_all_requested = Signal()
96
96
  """Emitted when the global *Update All* button is clicked."""
97
97
 
98
+ plugin_check_requested = Signal(str)
99
+ """Emitted with a plugin name when its manual check-for-updates button is clicked."""
100
+
98
101
  plugin_update_requested = Signal(str)
99
102
  """Emitted with a plugin name when its per-plugin *Update* button is clicked."""
100
103
 
@@ -495,6 +498,7 @@ class ToolsView(QWidget):
495
498
  )
496
499
  provider.set_runtime(rt.tag, label=tag_text)
497
500
  provider.auto_update_toggled.connect(self._on_auto_update_toggled)
501
+ provider.check_requested.connect(self.plugin_check_requested.emit)
498
502
  provider.update_requested.connect(self.plugin_update_requested.emit)
499
503
  self._insert_section_widget(provider)
500
504
 
@@ -558,6 +562,7 @@ class ToolsView(QWidget):
558
562
  parent=self._container,
559
563
  )
560
564
  provider.auto_update_toggled.connect(self._on_auto_update_toggled)
565
+ provider.check_requested.connect(self.plugin_check_requested.emit)
561
566
  provider.update_requested.connect(self.plugin_update_requested.emit)
562
567
  self._insert_section_widget(provider)
563
568
 
@@ -148,6 +148,7 @@ class ToolUpdateOrchestrator:
148
148
  def connect_tools_view(self, tools_view: ToolsView) -> None:
149
149
  """Wire ToolsView signals once the view is lazily created."""
150
150
  tools_view.update_all_requested.connect(self.on_tool_update)
151
+ tools_view.plugin_check_requested.connect(self.on_single_plugin_update)
151
152
  tools_view.plugin_update_requested.connect(self.on_single_plugin_update)
152
153
  tools_view.package_update_requested.connect(self.on_single_package_update)
153
154
  tools_view.package_remove_requested.connect(self.on_single_package_remove)
@@ -187,13 +187,16 @@ PLUGIN_ROW_HOST_STYLE = 'font-size: 11px; color: #808080;'
187
187
  """Host-tool annotation label (e.g. "→ pdm") for injected packages."""
188
188
 
189
189
  PLUGIN_ROW_TOGGLE_STYLE = (
190
- 'QPushButton { padding: 1px 4px; border: 1px solid palette(mid); border-radius: 2px;'
191
- ' font-size: 10px; min-width: 36px; max-width: 36px; }'
192
- 'QPushButton:checked { background: #89d185; color: black; }'
193
- 'QPushButton:disabled { color: palette(mid); border-color: palette(mid); background: transparent; }'
194
- 'QPushButton:checked:disabled { background: transparent; color: palette(mid); }'
190
+ 'QPushButton { padding: 0px; border: 1px solid palette(mid); border-radius: 11px;'
191
+ ' font-size: 14px; min-width: 22px; max-width: 22px; min-height: 22px; max-height: 22px;'
192
+ ' color: palette(mid); background: transparent; }'
193
+ 'QPushButton:hover { border-color: palette(light); color: palette(light); }'
194
+ 'QPushButton:checked { background: #89d185; color: black; border-color: #89d185; }'
195
+ 'QPushButton:checked:hover { background: #a0d896; border-color: #a0d896; }'
196
+ 'QPushButton:disabled { color: palette(dark); border-color: palette(dark); background: transparent; }'
197
+ 'QPushButton:checked:disabled { background: transparent; color: palette(dark); border-color: palette(dark); }'
195
198
  )
196
- """Small inline auto-update toggle for individual package rows."""
199
+ """Small circular auto-update toggle (↺ icon) for individual package rows."""
197
200
 
198
201
  PLUGIN_ROW_UPDATE_STYLE = (
199
202
  'QPushButton { padding: 1px 4px; border: 1px solid palette(mid); border-radius: 2px;'
@@ -345,14 +348,28 @@ FILTER_TOGGLE_ACTIVE_STYLE = (
345
348
  )
346
349
  """Filter toggle button style when an active filter is in effect."""
347
350
 
348
- # Retained from previous design auto-update & per-plugin update buttons
351
+ # Auto-update toggle button for plugin provider header rows circular, stateful
349
352
  PLUGIN_TOGGLE_STYLE = (
350
- 'QPushButton { padding: 2px 8px; border: 1px solid palette(mid); border-radius: 3px;'
351
- ' min-width: 60px; max-width: 60px; }'
352
- 'QPushButton:checked { background: #89d185; color: black; }'
353
- 'QPushButton:disabled { color: palette(mid); border-color: palette(mid); background: transparent; }'
354
- 'QPushButton:checked:disabled { background: transparent; color: palette(mid); }'
355
- )
353
+ 'QPushButton { padding: 0px; border: 1px solid palette(mid); border-radius: 12px;'
354
+ ' font-size: 15px; min-width: 24px; max-width: 24px; min-height: 24px; max-height: 24px;'
355
+ ' color: palette(mid); background: transparent; }'
356
+ 'QPushButton:hover { border-color: palette(light); color: palette(light); }'
357
+ 'QPushButton:checked { background: #89d185; color: black; border-color: #89d185; }'
358
+ 'QPushButton:checked:hover { background: #a0d896; border-color: #a0d896; }'
359
+ 'QPushButton:disabled { color: palette(dark); border-color: palette(dark); background: transparent; }'
360
+ 'QPushButton:checked:disabled { background: transparent; color: palette(dark); border-color: palette(dark); }'
361
+ )
362
+
363
+ # Manual check-for-updates button for plugin provider header rows — rect, one-shot action
364
+ PLUGIN_CHECK_STYLE = (
365
+ 'QPushButton { padding: 0px; border: 1px solid palette(mid); border-radius: 3px;'
366
+ ' font-size: 15px; min-width: 24px; max-width: 24px; min-height: 24px; max-height: 24px;'
367
+ ' color: palette(mid); background: transparent; }'
368
+ 'QPushButton:hover { border-color: #569cd6; color: #569cd6; }'
369
+ 'QPushButton:pressed { background: rgba(86, 156, 214, 0.15); }'
370
+ 'QPushButton:disabled { color: palette(dark); border-color: palette(dark); background: transparent; }'
371
+ )
372
+ """One-shot check-for-updates icon button used in the plugin provider header."""
356
373
 
357
374
  PLUGIN_UPDATE_STYLE = (
358
375
  'QPushButton { padding: 2px 8px; border: 1px solid palette(mid); border-radius: 3px;'