add split view widget and integrate photo button functionality in main controller
This commit is contained in:
164
ui/widgets/split_view_widget.py
Normal file
164
ui/widgets/split_view_widget.py
Normal file
@@ -0,0 +1,164 @@
|
||||
from PySide6.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QApplication, QMainWindow, QWidget, QVBoxLayout, QSplitter, QStackedWidget, QPushButton, QLabel
|
||||
from PySide6.QtGui import QPixmap, QWheelEvent, QPainter, QBrush, QColor
|
||||
from PySide6.QtCore import Qt
|
||||
import sys
|
||||
from ui.widgets.placeholder_widget import PlaceholderWidget
|
||||
|
||||
class ZoomableImageView(QGraphicsView):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
|
||||
# Scena i element obrazu
|
||||
self._scene = QGraphicsScene(self)
|
||||
self.setScene(self._scene)
|
||||
self._scene.setBackgroundBrush(QBrush(QColor(20, 20, 20))) # ciemne tło
|
||||
|
||||
self._pixmap_item = QGraphicsPixmapItem()
|
||||
self._scene.addItem(self._pixmap_item)
|
||||
|
||||
# Ustawienia widoku
|
||||
self.setDragMode(QGraphicsView.DragMode.ScrollHandDrag) # przesuwanie myszą
|
||||
self.setRenderHint(QPainter.RenderHint.Antialiasing)
|
||||
self.setRenderHint(QPainter.RenderHint.SmoothPixmapTransform)
|
||||
|
||||
# Wyłączenie suwaków
|
||||
self.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
||||
self.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAlwaysOff)
|
||||
# Parametry zoomu
|
||||
self._zoom_factor = 1.25
|
||||
self._current_scale = 1.0
|
||||
|
||||
def set_image(self, pixmap: QPixmap):
|
||||
# pixmap = QPixmap(image_path)
|
||||
self._pixmap_item.setPixmap(pixmap)
|
||||
self._scene.setSceneRect(pixmap.rect())
|
||||
# self.reset_transform()
|
||||
|
||||
def reset_transform(self):
|
||||
"""Resetuje skalowanie i ustawia 1:1"""
|
||||
self._current_scale = 1.0
|
||||
self.setTransform(self.transform().fromScale(1, 1))
|
||||
|
||||
def wheelEvent(self, event: QWheelEvent):
|
||||
"""Zoom kółkiem myszy"""
|
||||
if event.modifiers() & Qt.KeyboardModifier.ControlModifier: # zoom tylko z CTRL
|
||||
if event.angleDelta().y() > 0:
|
||||
zoom = self._zoom_factor
|
||||
else:
|
||||
zoom = 1 / self._zoom_factor
|
||||
|
||||
self._current_scale *= zoom
|
||||
self.scale(zoom, zoom)
|
||||
else:
|
||||
return
|
||||
super().wheelEvent(event) # normalne przewijanie
|
||||
|
||||
class CameraPlaceholder(QWidget):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
|
||||
self.setAutoFillBackground(True)
|
||||
self.setStyleSheet("background-color: #141414;")
|
||||
|
||||
layout = QVBoxLayout(self)
|
||||
layout.setSpacing(20)
|
||||
|
||||
self.camera_start_btn = QPushButton("Start Camera")
|
||||
self.camera_start_btn.setFixedSize(200, 50)
|
||||
style_sheet = """
|
||||
QPushButton {
|
||||
/* --- Styl podstawowy --- */
|
||||
background-color: transparent;
|
||||
border: 2px solid #CECECE; /* Grubość, styl i kolor obramowania */
|
||||
border-radius: 25px; /* Kluczowa właściwość do zaokrąglenia rogów! */
|
||||
color: #CECECE;
|
||||
padding: 10px 20px; /* Wewnętrzny margines */
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
QPushButton:hover {
|
||||
/* --- Styl po najechaniu myszką --- */
|
||||
color: #F0F0F0;
|
||||
border: 2px solid #F0F0F0;
|
||||
}
|
||||
|
||||
QPushButton:pressed {
|
||||
/* --- Styl po naciśnięciu --- */
|
||||
background-color: #e0e0e0; /* Ciemniejsze tło w momencie kliknięcia */
|
||||
border: 2px solid #e0e0e0; /* Zmiana koloru ramki dla sygnalizacji akcji */
|
||||
}
|
||||
"""
|
||||
self.camera_start_btn.setStyleSheet(style_sheet)
|
||||
|
||||
self.info_label = QLabel("Kliknij, aby uruchomić kamerę")
|
||||
self.info_label.setStyleSheet("background-color: transparent; color: #CECECE; font-size: 18px;")
|
||||
self.info_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
|
||||
layout.addStretch()
|
||||
layout.addWidget(self.camera_start_btn, alignment=Qt.AlignmentFlag.AlignCenter)
|
||||
layout.addWidget(self.info_label)
|
||||
layout.addStretch()
|
||||
self.setLayout(layout)
|
||||
|
||||
def set_info_text(self, text: str):
|
||||
self.info_label.setText(text)
|
||||
|
||||
class SplitView(QSplitter):
|
||||
def __init__(self, parent=None):
|
||||
super().__init__(parent)
|
||||
print("Inicjalizacja SplitView2")
|
||||
self.setOrientation(Qt.Orientation.Vertical)
|
||||
|
||||
self.widget_start = CameraPlaceholder()
|
||||
self.widget_live = ZoomableImageView()
|
||||
# self.widget_live = PlaceholderWidget("Camera View", "#750466")
|
||||
self.widget_ref = ZoomableImageView()
|
||||
# self.widget_ref = PlaceholderWidget("Image View", "#007981")
|
||||
|
||||
self.stack = QStackedWidget()
|
||||
self.stack.addWidget(self.widget_start)
|
||||
self.stack.addWidget(self.widget_live)
|
||||
self.stack.setCurrentWidget(self.widget_start)
|
||||
|
||||
self.addWidget(self.stack)
|
||||
self.addWidget(self.widget_ref)
|
||||
|
||||
self.setSizes([self.height(), 0])
|
||||
|
||||
pixmap = QPixmap("media/empty_guitar_h.jpg")
|
||||
# pixmap.fill(Qt.GlobalColor.lightGray)
|
||||
self.widget_live.set_image(pixmap)
|
||||
|
||||
def toggle_orientation(self):
|
||||
if self.orientation() == Qt.Orientation.Vertical:
|
||||
self.setOrientation(Qt.Orientation.Horizontal)
|
||||
self.setSizes([self.width()//2, self.width()//2])
|
||||
else:
|
||||
self.setOrientation(Qt.Orientation.Vertical)
|
||||
self.setSizes([self.height()//2, self.height()//2])
|
||||
|
||||
# def set_live_image(self, path_image: str):
|
||||
# """Ustawienie obrazu na żywo"""
|
||||
# pixmap = QPixmap(path_image)
|
||||
# self.widget_live.set_image(pixmap)
|
||||
|
||||
def set_live_image(self, pixmap: QPixmap):
|
||||
"""Ustawienie obrazu na żywo"""
|
||||
self.widget_live.set_image(pixmap)
|
||||
if self.stack.currentWidget() != self.widget_live:
|
||||
self.stack.setCurrentWidget(self.widget_live)
|
||||
|
||||
def set_reference_image(self, path_image: str):
|
||||
"""Ustawienie obrazu referencyjnego"""
|
||||
pixmap = QPixmap(path_image)
|
||||
self.widget_ref.set_image(pixmap)
|
||||
|
||||
def toglle_live_view(self):
|
||||
"""Przełączanie widoku na żywo"""
|
||||
if self.stack.currentWidget() == self.widget_start:
|
||||
self.stack.setCurrentWidget(self.widget_live)
|
||||
else:
|
||||
self.stack.setCurrentWidget(self.widget_start)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user