quick_actions.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. """
  2. Quick Actions Panel
  3. Main action buttons for ripeness, quality, calibration, and batch processing.
  4. """
  5. from PyQt5.QtWidgets import QGroupBox, QGridLayout, QPushButton
  6. from PyQt5.QtCore import pyqtSignal, Qt
  7. from resources.styles import (
  8. GROUP_BOX_STYLE,
  9. RIPENESS_BUTTON_STYLE,
  10. QUALITY_BUTTON_STYLE,
  11. CALIBRATION_BUTTON_STYLE,
  12. BATCH_BUTTON_STYLE
  13. )
  14. class QuickActionsPanel(QGroupBox):
  15. """
  16. Panel with quick action buttons.
  17. Provides buttons for:
  18. - Analyze Durian (with manual/auto mode)
  19. - Ripeness Classification
  20. - Quality Assessment
  21. - System Calibration
  22. - Batch Processing
  23. Signals:
  24. analyze_durian_clicked: Emitted when analyze durian button clicked (bool: manual_mode)
  25. ripeness_clicked: Emitted when ripeness button clicked
  26. quality_clicked: Emitted when quality button clicked
  27. calibration_clicked: Emitted when calibration button clicked
  28. batch_clicked: Emitted when batch button clicked
  29. """
  30. # Define signals
  31. analyze_durian_clicked = pyqtSignal(bool) # bool indicates manual mode
  32. ripeness_clicked = pyqtSignal()
  33. quality_clicked = pyqtSignal()
  34. calibration_clicked = pyqtSignal()
  35. batch_clicked = pyqtSignal()
  36. def __init__(self):
  37. """Initialize the quick actions panel."""
  38. super().__init__("Quick Actions")
  39. self.setStyleSheet(GROUP_BOX_STYLE)
  40. self.init_ui()
  41. def init_ui(self):
  42. """Initialize the UI components."""
  43. layout = QGridLayout()
  44. layout.setSpacing(10)
  45. # ========== ANALYZE DURIAN SECTION (Row 0) ==========
  46. # Auto Analyze Button (left)
  47. self.auto_analyze_btn = QPushButton("Auto Analyze\nDurian")
  48. self.auto_analyze_btn.setMinimumHeight(80)
  49. self.auto_analyze_btn.setStyleSheet("""
  50. QPushButton {
  51. background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
  52. stop:0 #2ecc71, stop:1 #27ae60);
  53. color: white;
  54. font-size: 18px;
  55. font-weight: bold;
  56. border-radius: 8px;
  57. border: 2px solid #229954;
  58. }
  59. QPushButton:hover {
  60. background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
  61. stop:0 #27ae60, stop:1 #229954);
  62. }
  63. QPushButton:pressed {
  64. background: #1e8449;
  65. }
  66. """)
  67. self.auto_analyze_btn.clicked.connect(self._on_auto_analyze_clicked)
  68. layout.addWidget(self.auto_analyze_btn, 0, 0)
  69. # Manual Entry Button (right)
  70. self.manual_entry_btn = QPushButton("Manual\nEntry")
  71. self.manual_entry_btn.setMinimumHeight(80)
  72. self.manual_entry_btn.setStyleSheet("""
  73. QPushButton {
  74. background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
  75. stop:0 #3498db, stop:1 #2980b9);
  76. color: white;
  77. font-size: 18px;
  78. font-weight: bold;
  79. border-radius: 8px;
  80. border: 2px solid #2471a3;
  81. }
  82. QPushButton:hover {
  83. background: qlineargradient(x1:0, y1:0, x2:0, y2:1,
  84. stop:0 #2980b9, stop:1 #2471a3);
  85. }
  86. QPushButton:pressed {
  87. background: #1f618d;
  88. }
  89. """)
  90. self.manual_entry_btn.clicked.connect(self._on_manual_entry_clicked)
  91. layout.addWidget(self.manual_entry_btn, 0, 1)
  92. # ========== OTHER ACTION BUTTONS ==========
  93. # Ripeness Classifier Button (row 1, left) - HIDDEN FOR NOW
  94. ripeness_btn = QPushButton("Ripeness\nClassifier")
  95. ripeness_btn.setMinimumHeight(70)
  96. ripeness_btn.setStyleSheet(RIPENESS_BUTTON_STYLE)
  97. ripeness_btn.clicked.connect(self.ripeness_clicked.emit)
  98. ripeness_btn.hide()
  99. layout.addWidget(ripeness_btn, 1, 0)
  100. # Quality Classifier Button (row 1, right) - HIDDEN FOR NOW
  101. quality_btn = QPushButton("Quality\nClassifier")
  102. quality_btn.setMinimumHeight(70)
  103. quality_btn.setStyleSheet(QUALITY_BUTTON_STYLE)
  104. quality_btn.clicked.connect(self.quality_clicked.emit)
  105. quality_btn.hide()
  106. layout.addWidget(quality_btn, 1, 1)
  107. # System Calibration Button (row 2, left) - HIDDEN FOR NOW
  108. calibration_btn = QPushButton("System\nCalibration")
  109. calibration_btn.setMinimumHeight(70)
  110. calibration_btn.setStyleSheet(CALIBRATION_BUTTON_STYLE)
  111. calibration_btn.clicked.connect(self.calibration_clicked.emit)
  112. calibration_btn.hide()
  113. layout.addWidget(calibration_btn, 2, 0)
  114. # Batch Mode Button (row 2, right) - HIDDEN FOR NOW
  115. batch_btn = QPushButton("Batch Mode\nAuto Processing")
  116. batch_btn.setMinimumHeight(70)
  117. batch_btn.setStyleSheet(BATCH_BUTTON_STYLE)
  118. batch_btn.clicked.connect(self.batch_clicked.emit)
  119. batch_btn.hide()
  120. layout.addWidget(batch_btn, 2, 1)
  121. self.setLayout(layout)
  122. def _on_auto_analyze_clicked(self):
  123. """Handle auto analyze durian button click."""
  124. self.analyze_durian_clicked.emit(False) # Auto mode
  125. def _on_manual_entry_clicked(self):
  126. """Handle manual entry button click."""
  127. self.analyze_durian_clicked.emit(True) # Manual mode