Settings moved to new file
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,6 +1,7 @@
|
|||||||
photobooth.cfg
|
photobooth.cfg
|
||||||
photobooth/__pycache__
|
photobooth/__pycache__
|
||||||
photobooth/*/__pycache__
|
photobooth/*/__pycache__
|
||||||
|
photobooth/*/*/__pycache__
|
||||||
.eggs
|
.eggs
|
||||||
.venv
|
.venv
|
||||||
photobooth.egg-info
|
photobooth.egg-info
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[Gui]
|
[Gui]
|
||||||
# Gui module to use (qt5)
|
# Gui module to use (PyQt5)
|
||||||
module = qt5
|
module = PyQt5
|
||||||
# Start Photobooth in fullscreen mode (True/False)
|
# Start Photobooth in fullscreen mode (True/False)
|
||||||
fullscreen = False
|
fullscreen = False
|
||||||
# Width of Photobooth (if not fullscreen)
|
# Width of Photobooth (if not fullscreen)
|
||||||
@@ -27,8 +27,8 @@ lamp_pin = 4
|
|||||||
[Printer]
|
[Printer]
|
||||||
# Enable printing (True/False)
|
# Enable printing (True/False)
|
||||||
enable = True
|
enable = True
|
||||||
# Printer module to use (qt5)
|
# Printer module to use (PyQt5)
|
||||||
module = qt5
|
module = PyQt5
|
||||||
# Paper width in mm
|
# Paper width in mm
|
||||||
width = 148
|
width = 148
|
||||||
# Paper height in mm
|
# Paper height in mm
|
||||||
@@ -46,9 +46,9 @@ display_time = 5
|
|||||||
|
|
||||||
[Picture]
|
[Picture]
|
||||||
# Basedir of output pictures
|
# Basedir of output pictures
|
||||||
basedir =
|
basedir = %Y-%m-%d
|
||||||
# Basename of output pictures
|
# Basename of output pictures
|
||||||
basename = %Y-%m-%d/photobooth
|
basename = photobooth
|
||||||
# Number of pictures in horizontal direction
|
# Number of pictures in horizontal direction
|
||||||
num_x = 2
|
num_x = 2
|
||||||
# Number of pictures in vertical direction
|
# Number of pictures in vertical direction
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
import multiprocessing as mp
|
import multiprocessing as mp
|
||||||
import queue
|
import queue
|
||||||
import logging
|
import logging
|
||||||
from os.path import expanduser
|
|
||||||
|
|
||||||
from PIL import ImageQt
|
from PIL import ImageQt
|
||||||
|
|
||||||
@@ -12,10 +11,11 @@ from PyQt5 import QtGui, QtCore, QtWidgets
|
|||||||
|
|
||||||
import math
|
import math
|
||||||
|
|
||||||
|
from .Qt5Gui import Frames
|
||||||
|
|
||||||
from .PyQt5GuiHelpers import QRoundProgressBar
|
from .PyQt5GuiHelpers import QRoundProgressBar
|
||||||
|
|
||||||
from . import *
|
from . import *
|
||||||
from .. import camera, printer
|
|
||||||
|
|
||||||
|
|
||||||
class PyQt5Gui(Gui):
|
class PyQt5Gui(Gui):
|
||||||
@@ -188,9 +188,11 @@ class PyQt5Gui(Gui):
|
|||||||
|
|
||||||
def showSettings(self):
|
def showSettings(self):
|
||||||
|
|
||||||
|
global cfg
|
||||||
self._p.handleKeypressEvent = lambda event : None
|
self._p.handleKeypressEvent = lambda event : None
|
||||||
self._lastState = self.showSettings
|
self._lastState = self.showSettings
|
||||||
self._p.setCentralWidget(PyQt5Settings(self))
|
# self._p.setCentralWidget(PyQt5Settings(self))
|
||||||
|
self._p.setCentralWidget(Frames.Settings(cfg, self.showSettings, self.showStart, self.restart))
|
||||||
|
|
||||||
|
|
||||||
def showStartPhotobooth(self):
|
def showStartPhotobooth(self):
|
||||||
@@ -341,307 +343,6 @@ class PyQt5Start(QtWidgets.QFrame):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PyQt5Settings(QtWidgets.QFrame):
|
|
||||||
|
|
||||||
def __init__(self, gui):
|
|
||||||
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
self._gui = gui
|
|
||||||
|
|
||||||
self.initFrame()
|
|
||||||
|
|
||||||
|
|
||||||
def initFrame(self):
|
|
||||||
|
|
||||||
self._value_widgets = {}
|
|
||||||
|
|
||||||
layout = QtWidgets.QVBoxLayout()
|
|
||||||
layout.addWidget(self.createTabs())
|
|
||||||
layout.addStretch(1)
|
|
||||||
layout.addWidget(self.createButtons())
|
|
||||||
self.setLayout(layout)
|
|
||||||
|
|
||||||
|
|
||||||
def createTabs(self):
|
|
||||||
|
|
||||||
tabs = QtWidgets.QTabWidget()
|
|
||||||
tabs.addTab(self.createGuiSettings(), 'Interface')
|
|
||||||
tabs.addTab(self.createPhotoboothSettings(), 'Photobooth')
|
|
||||||
tabs.addTab(self.createCameraSettings(), 'Camera')
|
|
||||||
tabs.addTab(self.createPictureSettings(), 'Picture')
|
|
||||||
tabs.addTab(self.createGpioSettings(), 'GPIO')
|
|
||||||
tabs.addTab(self.createPrinterSettings(), 'Printer')
|
|
||||||
|
|
||||||
return tabs
|
|
||||||
|
|
||||||
|
|
||||||
def createButtons(self):
|
|
||||||
|
|
||||||
layout = QtWidgets.QHBoxLayout()
|
|
||||||
layout.addStretch(1)
|
|
||||||
|
|
||||||
btnSave = QtWidgets.QPushButton('Save and restart')
|
|
||||||
btnSave.resize(btnSave.sizeHint())
|
|
||||||
btnSave.clicked.connect(self.storeConfigAndRestart)
|
|
||||||
layout.addWidget(btnSave)
|
|
||||||
|
|
||||||
btnCancel = QtWidgets.QPushButton('Cancel')
|
|
||||||
btnCancel.resize(btnCancel.sizeHint())
|
|
||||||
btnCancel.clicked.connect(self._gui.showStart)
|
|
||||||
layout.addWidget(btnCancel)
|
|
||||||
|
|
||||||
btnRestore = QtWidgets.QPushButton('Restore defaults')
|
|
||||||
btnRestore.resize(btnRestore.sizeHint())
|
|
||||||
btnRestore.clicked.connect(self.restoreDefaults)
|
|
||||||
layout.addWidget(btnRestore)
|
|
||||||
|
|
||||||
widget = QtWidgets.QGroupBox()
|
|
||||||
widget.setLayout(layout)
|
|
||||||
return widget
|
|
||||||
|
|
||||||
|
|
||||||
def createModuleComboBox(self, module_list, current_module):
|
|
||||||
|
|
||||||
cb = QtWidgets.QComboBox()
|
|
||||||
for m in module_list:
|
|
||||||
cb.addItem(m[0])
|
|
||||||
|
|
||||||
idx = [x for x, m in enumerate(module_list) if m[0] == current_module]
|
|
||||||
cb.setCurrentIndex(idx[0] if len(idx) > 0 else -1)
|
|
||||||
|
|
||||||
return cb
|
|
||||||
|
|
||||||
|
|
||||||
def createGuiSettings(self):
|
|
||||||
|
|
||||||
global cfg
|
|
||||||
|
|
||||||
self._value_widgets['Gui'] = {}
|
|
||||||
self._value_widgets['Gui']['fullscreen'] = QtWidgets.QCheckBox('Enable fullscreen')
|
|
||||||
if cfg.getBool('Gui', 'fullscreen'):
|
|
||||||
self._value_widgets['Gui']['fullscreen'].toggle()
|
|
||||||
self._value_widgets['Gui']['module'] = self.createModuleComboBox(modules, cfg.get('Gui', 'module'))
|
|
||||||
self._value_widgets['Gui']['width'] = QtWidgets.QLineEdit(cfg.get('Gui', 'width'))
|
|
||||||
self._value_widgets['Gui']['height'] = QtWidgets.QLineEdit(cfg.get('Gui', 'height'))
|
|
||||||
self._value_widgets['Gui']['hide_cursor'] = QtWidgets.QCheckBox('Hide cursor')
|
|
||||||
if cfg.getBool('Gui', 'hide_cursor'):
|
|
||||||
self._value_widgets['Gui']['hide_cursor'].toggle()
|
|
||||||
|
|
||||||
layout = QtWidgets.QFormLayout()
|
|
||||||
layout.addRow(self._value_widgets['Gui']['fullscreen'])
|
|
||||||
layout.addRow(QtWidgets.QLabel('Gui module:'), self._value_widgets['Gui']['module'])
|
|
||||||
|
|
||||||
sublayout_size = QtWidgets.QHBoxLayout()
|
|
||||||
sublayout_size.addWidget(QtWidgets.QLabel('Window size [px]:'))
|
|
||||||
sublayout_size.addWidget(self._value_widgets['Gui']['width'])
|
|
||||||
sublayout_size.addWidget(QtWidgets.QLabel('x'))
|
|
||||||
sublayout_size.addWidget(self._value_widgets['Gui']['height'])
|
|
||||||
layout.addRow(sublayout_size)
|
|
||||||
|
|
||||||
layout.addRow(self._value_widgets['Gui']['hide_cursor'])
|
|
||||||
|
|
||||||
widget = QtWidgets.QWidget()
|
|
||||||
widget.setLayout(layout)
|
|
||||||
return widget
|
|
||||||
|
|
||||||
|
|
||||||
def createGpioSettings(self):
|
|
||||||
|
|
||||||
global cfg
|
|
||||||
|
|
||||||
self._value_widgets['Gpio'] = {}
|
|
||||||
self._value_widgets['Gpio']['enable'] = QtWidgets.QCheckBox('Enable GPIO')
|
|
||||||
if cfg.getBool('Gpio', 'enable'):
|
|
||||||
self._value_widgets['Gpio']['enable'].toggle()
|
|
||||||
self._value_widgets['Gpio']['exit_pin'] = QtWidgets.QLineEdit(cfg.get('Gpio', 'exit_pin'))
|
|
||||||
self._value_widgets['Gpio']['trigger_pin'] = QtWidgets.QLineEdit(cfg.get('Gpio', 'trigger_pin'))
|
|
||||||
self._value_widgets['Gpio']['lamp_pin'] = QtWidgets.QLineEdit(cfg.get('Gpio', 'lamp_pin'))
|
|
||||||
|
|
||||||
layout = QtWidgets.QFormLayout()
|
|
||||||
layout.addRow(self._value_widgets['Gpio']['enable'])
|
|
||||||
layout.addRow(QtWidgets.QLabel('Exit pin (BCM numbering):'), self._value_widgets['Gpio']['exit_pin'])
|
|
||||||
layout.addRow(QtWidgets.QLabel('Trigger pin (BCM numbering):'), self._value_widgets['Gpio']['trigger_pin'])
|
|
||||||
layout.addRow(QtWidgets.QLabel('Lamp pin (BCM numbering):'), self._value_widgets['Gpio']['lamp_pin'])
|
|
||||||
|
|
||||||
widget = QtWidgets.QWidget()
|
|
||||||
widget.setLayout(layout)
|
|
||||||
return widget
|
|
||||||
|
|
||||||
|
|
||||||
def createPrinterSettings(self):
|
|
||||||
|
|
||||||
global cfg
|
|
||||||
|
|
||||||
self._value_widgets['Printer'] = {}
|
|
||||||
self._value_widgets['Printer']['enable'] = QtWidgets.QCheckBox('Enable Printing')
|
|
||||||
if cfg.getBool('Printer', 'enable'):
|
|
||||||
self._value_widgets['Printer']['enable'].toggle()
|
|
||||||
self._value_widgets['Printer']['module'] = self.createModuleComboBox(printer.modules, cfg.get('Printer', 'module'))
|
|
||||||
self._value_widgets['Printer']['width'] = QtWidgets.QLineEdit(cfg.get('Printer', 'width'))
|
|
||||||
self._value_widgets['Printer']['height'] = QtWidgets.QLineEdit(cfg.get('Printer', 'height'))
|
|
||||||
|
|
||||||
layout = QtWidgets.QFormLayout()
|
|
||||||
layout.addRow(self._value_widgets['Printer']['enable'])
|
|
||||||
layout.addRow(QtWidgets.QLabel('Printer module:'), self._value_widgets['Printer']['module'])
|
|
||||||
|
|
||||||
sublayout_size = QtWidgets.QHBoxLayout()
|
|
||||||
sublayout_size.addWidget(QtWidgets.QLabel('Paper size [mm]:'))
|
|
||||||
sublayout_size.addWidget(self._value_widgets['Printer']['width'])
|
|
||||||
sublayout_size.addWidget(QtWidgets.QLabel('x'))
|
|
||||||
sublayout_size.addWidget(self._value_widgets['Printer']['height'])
|
|
||||||
layout.addRow(sublayout_size)
|
|
||||||
|
|
||||||
widget = QtWidgets.QWidget()
|
|
||||||
widget.setLayout(layout)
|
|
||||||
return widget
|
|
||||||
|
|
||||||
|
|
||||||
def createCameraSettings(self):
|
|
||||||
|
|
||||||
global cfg
|
|
||||||
|
|
||||||
self._value_widgets['Camera'] = {}
|
|
||||||
self._value_widgets['Camera']['module'] = self.createModuleComboBox(camera.modules, cfg.get('Camera', 'module'))
|
|
||||||
|
|
||||||
layout = QtWidgets.QFormLayout()
|
|
||||||
layout.addRow(QtWidgets.QLabel('Camera module:'), self._value_widgets['Camera']['module'])
|
|
||||||
|
|
||||||
widget = QtWidgets.QWidget()
|
|
||||||
widget.setLayout(layout)
|
|
||||||
return widget
|
|
||||||
|
|
||||||
|
|
||||||
def createPhotoboothSettings(self):
|
|
||||||
|
|
||||||
global cfg
|
|
||||||
|
|
||||||
self._value_widgets['Photobooth'] = {}
|
|
||||||
self._value_widgets['Photobooth']['show_preview'] = QtWidgets.QCheckBox('Show preview while countdown')
|
|
||||||
if cfg.getBool('Photobooth', 'show_preview'):
|
|
||||||
self._value_widgets['Photobooth']['show_preview'].toggle()
|
|
||||||
self._value_widgets['Photobooth']['greeter_time'] = QtWidgets.QLineEdit(cfg.get('Photobooth', 'greeter_time'))
|
|
||||||
self._value_widgets['Photobooth']['countdown_time'] = QtWidgets.QLineEdit(cfg.get('Photobooth', 'countdown_time'))
|
|
||||||
self._value_widgets['Photobooth']['display_time'] = QtWidgets.QLineEdit(cfg.get('Photobooth', 'display_time'))
|
|
||||||
|
|
||||||
layout = QtWidgets.QFormLayout()
|
|
||||||
layout.addRow(self._value_widgets['Photobooth']['show_preview'])
|
|
||||||
layout.addRow(QtWidgets.QLabel('Greeter time [s]:'), self._value_widgets['Photobooth']['greeter_time'])
|
|
||||||
layout.addRow(QtWidgets.QLabel('Countdown time [s]:'), self._value_widgets['Photobooth']['countdown_time'])
|
|
||||||
layout.addRow(QtWidgets.QLabel('Display time [s]:'), self._value_widgets['Photobooth']['display_time'])
|
|
||||||
|
|
||||||
widget = QtWidgets.QWidget()
|
|
||||||
widget.setLayout(layout)
|
|
||||||
return widget
|
|
||||||
|
|
||||||
|
|
||||||
def createPictureSettings(self):
|
|
||||||
|
|
||||||
global cfg
|
|
||||||
|
|
||||||
self._value_widgets['Picture'] = {}
|
|
||||||
self._value_widgets['Picture']['num_x'] = QtWidgets.QLineEdit(cfg.get('Picture', 'num_x'))
|
|
||||||
self._value_widgets['Picture']['num_y'] = QtWidgets.QLineEdit(cfg.get('Picture', 'num_y'))
|
|
||||||
self._value_widgets['Picture']['size_x'] = QtWidgets.QLineEdit(cfg.get('Picture', 'size_x'))
|
|
||||||
self._value_widgets['Picture']['size_y'] = QtWidgets.QLineEdit(cfg.get('Picture', 'size_y'))
|
|
||||||
self._value_widgets['Picture']['min_dist_x'] = QtWidgets.QLineEdit(cfg.get('Picture', 'min_dist_x'))
|
|
||||||
self._value_widgets['Picture']['min_dist_y'] = QtWidgets.QLineEdit(cfg.get('Picture', 'min_dist_y'))
|
|
||||||
self._value_widgets['Picture']['basedir'] = QtWidgets.QLineEdit(cfg.get('Picture', 'basedir'))
|
|
||||||
self._value_widgets['Picture']['basename'] = QtWidgets.QLineEdit(cfg.get('Picture', 'basename'))
|
|
||||||
|
|
||||||
layout = QtWidgets.QFormLayout()
|
|
||||||
|
|
||||||
sublayout_num = QtWidgets.QHBoxLayout()
|
|
||||||
sublayout_num.addWidget(QtWidgets.QLabel('Number of shots per picture:'))
|
|
||||||
sublayout_num.addWidget(self._value_widgets['Picture']['num_x'])
|
|
||||||
sublayout_num.addWidget(QtWidgets.QLabel('x'))
|
|
||||||
sublayout_num.addWidget(self._value_widgets['Picture']['num_y'])
|
|
||||||
layout.addRow(sublayout_num)
|
|
||||||
|
|
||||||
sublayout_size = QtWidgets.QHBoxLayout()
|
|
||||||
sublayout_size.addWidget(QtWidgets.QLabel('Size of assembled picture:'))
|
|
||||||
sublayout_size.addWidget(self._value_widgets['Picture']['size_x'])
|
|
||||||
sublayout_size.addWidget(QtWidgets.QLabel('x'))
|
|
||||||
sublayout_size.addWidget(self._value_widgets['Picture']['size_y'])
|
|
||||||
layout.addRow(sublayout_size)
|
|
||||||
|
|
||||||
sublayout_dist = QtWidgets.QHBoxLayout()
|
|
||||||
sublayout_dist.addWidget(QtWidgets.QLabel('Min. distance between shots in picture:'))
|
|
||||||
sublayout_dist.addWidget(self._value_widgets['Picture']['min_dist_x'])
|
|
||||||
sublayout_dist.addWidget(QtWidgets.QLabel('x'))
|
|
||||||
sublayout_dist.addWidget(self._value_widgets['Picture']['min_dist_y'])
|
|
||||||
layout.addRow(sublayout_dist)
|
|
||||||
|
|
||||||
file_dialog = lambda : self._value_widgets['Picture']['basedir'].setText(
|
|
||||||
QtWidgets.QFileDialog.getExistingDirectory(self, 'Select directory',
|
|
||||||
expanduser('~'), QtWidgets.QFileDialog.ShowDirsOnly))
|
|
||||||
file_button = QtWidgets.QPushButton('Select directory')
|
|
||||||
file_button.resize(file_button.sizeHint())
|
|
||||||
file_button.clicked.connect(file_dialog)
|
|
||||||
|
|
||||||
sublayout_path = QtWidgets.QHBoxLayout()
|
|
||||||
sublayout_path.addWidget(QtWidgets.QLabel('Basename of output files:'))
|
|
||||||
sublayout_path.addWidget(self._value_widgets['Picture']['basedir'])
|
|
||||||
sublayout_path.addWidget(QtWidgets.QLabel('/'))
|
|
||||||
sublayout_path.addWidget(self._value_widgets['Picture']['basename'])
|
|
||||||
sublayout_path.addWidget(file_button)
|
|
||||||
layout.addRow(sublayout_path)
|
|
||||||
|
|
||||||
widget = QtWidgets.QWidget()
|
|
||||||
widget.setLayout(layout)
|
|
||||||
return widget
|
|
||||||
|
|
||||||
|
|
||||||
def storeConfigAndRestart(self):
|
|
||||||
|
|
||||||
global cfg
|
|
||||||
|
|
||||||
cfg.set('Gui', 'fullscreen', str(self._value_widgets['Gui']['fullscreen'].isChecked()))
|
|
||||||
cfg.set('Gui', 'module', modules[self._value_widgets['Gui']['module'].currentIndex()][0])
|
|
||||||
cfg.set('Gui', 'width', self._value_widgets['Gui']['width'].text())
|
|
||||||
cfg.set('Gui', 'height', self._value_widgets['Gui']['height'].text())
|
|
||||||
cfg.set('Gui', 'hide_cursor', str(self._value_widgets['Gui']['hide_cursor'].isChecked()))
|
|
||||||
|
|
||||||
cfg.set('Gpio', 'enable', str(self._value_widgets['Gpio']['enable'].isChecked()))
|
|
||||||
cfg.set('Gpio', 'exit_pin', self._value_widgets['Gpio']['exit_pin'].text())
|
|
||||||
cfg.set('Gpio', 'trigger_pin', self._value_widgets['Gpio']['trigger_pin'].text())
|
|
||||||
cfg.set('Gpio', 'lamp_pin', self._value_widgets['Gpio']['lamp_pin'].text())
|
|
||||||
|
|
||||||
cfg.set('Printer', 'enable', str(self._value_widgets['Printer']['enable'].isChecked()))
|
|
||||||
cfg.set('Printer', 'module', modules[self._value_widgets['Printer']['module'].currentIndex()][0])
|
|
||||||
cfg.set('Printer', 'width', self._value_widgets['Printer']['width'].text())
|
|
||||||
cfg.set('Printer', 'height', self._value_widgets['Printer']['height'].text())
|
|
||||||
|
|
||||||
cfg.set('Photobooth', 'show_preview', str(self._value_widgets['Photobooth']['show_preview'].isChecked()))
|
|
||||||
cfg.set('Photobooth', 'greeter_time', str(self._value_widgets['Photobooth']['greeter_time'].text()))
|
|
||||||
cfg.set('Photobooth', 'countdown_time', str(self._value_widgets['Photobooth']['countdown_time'].text()))
|
|
||||||
cfg.set('Photobooth', 'display_time', str(self._value_widgets['Photobooth']['display_time'].text()))
|
|
||||||
|
|
||||||
cfg.set('Picture', 'num_x', self._value_widgets['Picture']['num_x'].text())
|
|
||||||
cfg.set('Picture', 'num_y', self._value_widgets['Picture']['num_y'].text())
|
|
||||||
cfg.set('Picture', 'size_x', self._value_widgets['Picture']['size_x'].text())
|
|
||||||
cfg.set('Picture', 'size_y', self._value_widgets['Picture']['size_y'].text())
|
|
||||||
cfg.set('Picture', 'min_dist_x', self._value_widgets['Picture']['min_dist_x'].text())
|
|
||||||
cfg.set('Picture', 'min_dist_y', self._value_widgets['Picture']['min_dist_y'].text())
|
|
||||||
cfg.set('Picture', 'basedir', self._value_widgets['Picture']['basedir'].text())
|
|
||||||
cfg.set('Picture', 'basename', self._value_widgets['Picture']['basename'].text())
|
|
||||||
|
|
||||||
cfg.set('Camera', 'module', camera.modules[self._value_widgets['Camera']['module'].currentIndex()][0])
|
|
||||||
|
|
||||||
cfg.write()
|
|
||||||
self._gui.restart()
|
|
||||||
|
|
||||||
|
|
||||||
def restoreDefaults(self):
|
|
||||||
|
|
||||||
global cfg
|
|
||||||
|
|
||||||
cfg.defaults()
|
|
||||||
self._gui.showSettings()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PyQt5WaitMessage(QtWidgets.QFrame):
|
class PyQt5WaitMessage(QtWidgets.QFrame):
|
||||||
# With spinning wait clock, inspired by
|
# With spinning wait clock, inspired by
|
||||||
# https://wiki.python.org/moin/PyQt/A%20full%20widget%20waiting%20indicator
|
# https://wiki.python.org/moin/PyQt/A%20full%20widget%20waiting%20indicator
|
||||||
|
|||||||
354
photobooth/gui/Qt5Gui/Frames.py
Normal file
354
photobooth/gui/Qt5Gui/Frames.py
Normal file
@@ -0,0 +1,354 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from os.path import expanduser
|
||||||
|
|
||||||
|
from PyQt5 import QtWidgets
|
||||||
|
|
||||||
|
from .. import modules
|
||||||
|
from ... import camera
|
||||||
|
from ... import printer
|
||||||
|
|
||||||
|
|
||||||
|
class Settings(QtWidgets.QFrame):
|
||||||
|
|
||||||
|
def __init__(self, config, reload_action, cancel_action, restart_action):
|
||||||
|
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
self._cfg = config
|
||||||
|
self._reloadAction = reload_action
|
||||||
|
self._cancelAction = cancel_action
|
||||||
|
self._restartAction = restart_action
|
||||||
|
|
||||||
|
self.initFrame()
|
||||||
|
|
||||||
|
def init(self, category):
|
||||||
|
|
||||||
|
self._widgets[category] = {}
|
||||||
|
|
||||||
|
def add(self, category, key, value):
|
||||||
|
|
||||||
|
self._widgets[category][key] = value
|
||||||
|
|
||||||
|
def get(self, category, key):
|
||||||
|
|
||||||
|
return self._widgets[category][key]
|
||||||
|
|
||||||
|
def initFrame(self):
|
||||||
|
|
||||||
|
self._widgets = {}
|
||||||
|
|
||||||
|
layout = QtWidgets.QVBoxLayout()
|
||||||
|
layout.addWidget(self.createTabs())
|
||||||
|
layout.addStretch(1)
|
||||||
|
layout.addWidget(self.createButtons())
|
||||||
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
def createTabs(self):
|
||||||
|
|
||||||
|
tabs = QtWidgets.QTabWidget()
|
||||||
|
tabs.addTab(self.createGuiSettings(), 'Interface')
|
||||||
|
tabs.addTab(self.createPhotoboothSettings(), 'Photobooth')
|
||||||
|
tabs.addTab(self.createCameraSettings(), 'Camera')
|
||||||
|
tabs.addTab(self.createPictureSettings(), 'Picture')
|
||||||
|
tabs.addTab(self.createGpioSettings(), 'GPIO')
|
||||||
|
tabs.addTab(self.createPrinterSettings(), 'Printer')
|
||||||
|
return tabs
|
||||||
|
|
||||||
|
def createButtons(self):
|
||||||
|
|
||||||
|
layout = QtWidgets.QHBoxLayout()
|
||||||
|
layout.addStretch(1)
|
||||||
|
|
||||||
|
btnSave = QtWidgets.QPushButton('Save and restart')
|
||||||
|
btnSave.clicked.connect(self.storeConfigAndRestart)
|
||||||
|
layout.addWidget(btnSave)
|
||||||
|
|
||||||
|
btnCancel = QtWidgets.QPushButton('Cancel')
|
||||||
|
btnCancel.clicked.connect(self._cancelAction)
|
||||||
|
layout.addWidget(btnCancel)
|
||||||
|
|
||||||
|
btnRestore = QtWidgets.QPushButton('Restore defaults')
|
||||||
|
btnRestore.clicked.connect(self.restoreDefaults)
|
||||||
|
layout.addWidget(btnRestore)
|
||||||
|
|
||||||
|
widget = QtWidgets.QGroupBox()
|
||||||
|
widget.setLayout(layout)
|
||||||
|
return widget
|
||||||
|
|
||||||
|
def createModuleComboBox(self, module_list, current_module):
|
||||||
|
|
||||||
|
cb = QtWidgets.QComboBox()
|
||||||
|
for m in module_list:
|
||||||
|
cb.addItem(m[0])
|
||||||
|
|
||||||
|
idx = [x for x, m in enumerate(module_list) if m[0] == current_module]
|
||||||
|
cb.setCurrentIndex(idx[0] if len(idx) > 0 else -1)
|
||||||
|
|
||||||
|
return cb
|
||||||
|
|
||||||
|
def createGuiSettings(self):
|
||||||
|
|
||||||
|
self.init('Gui')
|
||||||
|
|
||||||
|
fullscreen = QtWidgets.QCheckBox()
|
||||||
|
fullscreen.setChecked(self._cfg.getBool('Gui', 'fullscreen'))
|
||||||
|
self.add('Gui', 'fullscreen', fullscreen)
|
||||||
|
|
||||||
|
module = self.createModuleComboBox(modules,
|
||||||
|
self._cfg.get('Gui', 'module'))
|
||||||
|
self.add('Gui', 'module', module)
|
||||||
|
|
||||||
|
width = QtWidgets.QLineEdit(self._cfg.get('Gui', 'width'))
|
||||||
|
height = QtWidgets.QLineEdit(self._cfg.get('Gui', 'height'))
|
||||||
|
self.add('Gui', 'width', width)
|
||||||
|
self.add('Gui', 'height', height)
|
||||||
|
|
||||||
|
cursor = QtWidgets.QCheckBox()
|
||||||
|
cursor.setChecked(self._cfg.getBool('Gui', 'hide_cursor'))
|
||||||
|
self.add('Gui', 'hide_cursor', cursor)
|
||||||
|
|
||||||
|
lay_size = QtWidgets.QHBoxLayout()
|
||||||
|
lay_size.addWidget(width)
|
||||||
|
lay_size.addWidget(QtWidgets.QLabel('x'))
|
||||||
|
lay_size.addWidget(height)
|
||||||
|
|
||||||
|
layout = QtWidgets.QFormLayout()
|
||||||
|
layout.addRow('Enable fullscreen:', fullscreen)
|
||||||
|
layout.addRow('Gui module:', module)
|
||||||
|
layout.addRow('Window size [px]:', lay_size)
|
||||||
|
layout.addRow('Hide cursor:', cursor)
|
||||||
|
|
||||||
|
widget = QtWidgets.QWidget()
|
||||||
|
widget.setLayout(layout)
|
||||||
|
return widget
|
||||||
|
|
||||||
|
def createPhotoboothSettings(self):
|
||||||
|
|
||||||
|
self.init('Photobooth')
|
||||||
|
|
||||||
|
preview = QtWidgets.QCheckBox()
|
||||||
|
preview.setChecked(self._cfg.getBool('Photobooth', 'show_preview'))
|
||||||
|
self.add('Photobooth', 'show_preview', preview)
|
||||||
|
|
||||||
|
greet_time = QtWidgets.QLineEdit(self._cfg.get('Photobooth',
|
||||||
|
'greeter_time'))
|
||||||
|
count_time = QtWidgets.QLineEdit(self._cfg.get('Photobooth',
|
||||||
|
'countdown_time'))
|
||||||
|
displ_time = QtWidgets.QLineEdit(self._cfg.get('Photobooth',
|
||||||
|
'display_time'))
|
||||||
|
self.add('Photobooth', 'greeter_time', greet_time)
|
||||||
|
self.add('Photobooth', 'countdown_time', count_time)
|
||||||
|
self.add('Photobooth', 'display_time', displ_time)
|
||||||
|
|
||||||
|
layout = QtWidgets.QFormLayout()
|
||||||
|
layout.addRow('Show preview during countdown:', preview)
|
||||||
|
layout.addRow('Greeter time before countdown [s]:', greet_time)
|
||||||
|
layout.addRow('Countdown time [s]:', count_time)
|
||||||
|
layout.addRow('Picture display time [s]:', displ_time)
|
||||||
|
|
||||||
|
widget = QtWidgets.QWidget()
|
||||||
|
widget.setLayout(layout)
|
||||||
|
return widget
|
||||||
|
|
||||||
|
def createCameraSettings(self):
|
||||||
|
|
||||||
|
self.init('Camera')
|
||||||
|
|
||||||
|
module = self.createModuleComboBox(camera.modules,
|
||||||
|
self._cfg.get('Camera', 'module'))
|
||||||
|
self.add('Camera', 'module', module)
|
||||||
|
|
||||||
|
layout = QtWidgets.QFormLayout()
|
||||||
|
layout.addRow('Camera module:', module)
|
||||||
|
|
||||||
|
widget = QtWidgets.QWidget()
|
||||||
|
widget.setLayout(layout)
|
||||||
|
return widget
|
||||||
|
|
||||||
|
def createPictureSettings(self):
|
||||||
|
|
||||||
|
self.init('Picture')
|
||||||
|
|
||||||
|
num_x = QtWidgets.QLineEdit(self._cfg.get('Picture', 'num_x'))
|
||||||
|
num_y = QtWidgets.QLineEdit(self._cfg.get('Picture', 'num_y'))
|
||||||
|
self.add('Picture', 'num_x', num_x)
|
||||||
|
self.add('Picture', 'num_y', num_y)
|
||||||
|
|
||||||
|
size_x = QtWidgets.QLineEdit(self._cfg.get('Picture', 'size_x'))
|
||||||
|
size_y = QtWidgets.QLineEdit(self._cfg.get('Picture', 'size_y'))
|
||||||
|
self.add('Picture', 'size_x', size_x)
|
||||||
|
self.add('Picture', 'size_y', size_y)
|
||||||
|
|
||||||
|
min_dist_x = QtWidgets.QLineEdit(self._cfg.get('Picture',
|
||||||
|
'min_dist_x'))
|
||||||
|
min_dist_y = QtWidgets.QLineEdit(self._cfg.get('Picture',
|
||||||
|
'min_dist_y'))
|
||||||
|
self.add('Picture', 'min_dist_x', min_dist_x)
|
||||||
|
self.add('Picture', 'min_dist_y', min_dist_y)
|
||||||
|
|
||||||
|
basedir = QtWidgets.QLineEdit(self._cfg.get('Picture', 'basedir'))
|
||||||
|
basename = QtWidgets.QLineEdit(self._cfg.get('Picture', 'basename'))
|
||||||
|
self.add('Picture', 'basedir', basedir)
|
||||||
|
self.add('Picture', 'basename', basename)
|
||||||
|
|
||||||
|
lay_num = QtWidgets.QHBoxLayout()
|
||||||
|
lay_num.addWidget(num_x)
|
||||||
|
lay_num.addWidget(QtWidgets.QLabel('x'))
|
||||||
|
lay_num.addWidget(num_y)
|
||||||
|
|
||||||
|
lay_size = QtWidgets.QHBoxLayout()
|
||||||
|
lay_size.addWidget(size_x)
|
||||||
|
lay_size.addWidget(QtWidgets.QLabel('x'))
|
||||||
|
lay_size.addWidget(size_y)
|
||||||
|
|
||||||
|
lay_dist = QtWidgets.QHBoxLayout()
|
||||||
|
lay_dist.addWidget(min_dist_x)
|
||||||
|
lay_dist.addWidget(QtWidgets.QLabel('x'))
|
||||||
|
lay_dist.addWidget(min_dist_y)
|
||||||
|
|
||||||
|
def file_dialog():
|
||||||
|
basedir.setText(QtWidgets.QFileDialog.getExistingDirectory(self,
|
||||||
|
'Select directory', expanduser('~'),
|
||||||
|
QtWidgets.QFileDialog.ShowDirsOnly))
|
||||||
|
|
||||||
|
file_button = QtWidgets.QPushButton('Select directory')
|
||||||
|
file_button.clicked.connect(file_dialog)
|
||||||
|
|
||||||
|
lay_file = QtWidgets.QHBoxLayout()
|
||||||
|
lay_file.addWidget(basedir)
|
||||||
|
lay_file.addWidget(file_button)
|
||||||
|
|
||||||
|
layout = QtWidgets.QFormLayout()
|
||||||
|
layout.addRow('Number of shots per picture:', lay_num)
|
||||||
|
layout.addRow('Size of assembled picture [px]:', lay_size)
|
||||||
|
layout.addRow('Minimum distance between shots in picture [px]:',
|
||||||
|
lay_dist)
|
||||||
|
layout.addRow('Output directory (strftime directives possible):',
|
||||||
|
lay_file)
|
||||||
|
layout.addRow('Basename of files (strftime directives possible):',
|
||||||
|
basename)
|
||||||
|
|
||||||
|
widget = QtWidgets.QWidget()
|
||||||
|
widget.setLayout(layout)
|
||||||
|
return widget
|
||||||
|
|
||||||
|
def createGpioSettings(self):
|
||||||
|
|
||||||
|
self.init('Gpio')
|
||||||
|
|
||||||
|
enable = QtWidgets.QCheckBox()
|
||||||
|
enable.setChecked(self._cfg.getBool('Gpio', 'enable'))
|
||||||
|
self.add('Gpio', 'enable', enable)
|
||||||
|
|
||||||
|
exit_pin = QtWidgets.QLineEdit(self._cfg.get('Gpio', 'exit_pin'))
|
||||||
|
trig_pin = QtWidgets.QLineEdit(self._cfg.get('Gpio', 'trigger_pin'))
|
||||||
|
lamp_pin = QtWidgets.QLineEdit(self._cfg.get('Gpio', 'lamp_pin'))
|
||||||
|
self.add('Gpio', 'exit_pin', exit_pin)
|
||||||
|
self.add('Gpio', 'trigger_pin', trig_pin)
|
||||||
|
self.add('Gpio', 'lamp_pin', lamp_pin)
|
||||||
|
|
||||||
|
layout = QtWidgets.QFormLayout()
|
||||||
|
layout.addRow('Enable GPIO:', enable)
|
||||||
|
layout.addRow('Exit button pin (BCM numbering):', exit_pin)
|
||||||
|
layout.addRow('Trigger button pin (BCM numbering):', trig_pin)
|
||||||
|
layout.addRow('Idle lamp pin (BCM numbering):', lamp_pin)
|
||||||
|
|
||||||
|
widget = QtWidgets.QWidget()
|
||||||
|
widget.setLayout(layout)
|
||||||
|
return widget
|
||||||
|
|
||||||
|
def createPrinterSettings(self):
|
||||||
|
|
||||||
|
self.init('Printer')
|
||||||
|
|
||||||
|
enable = QtWidgets.QCheckBox()
|
||||||
|
enable.setChecked(self._cfg.getBool('Printer', 'enable'))
|
||||||
|
self.add('Printer', 'enable', enable)
|
||||||
|
|
||||||
|
module = self.createModuleComboBox(printer.modules,
|
||||||
|
self._cfg.get('Printer', 'module'))
|
||||||
|
self.add('Printer', 'module', module)
|
||||||
|
|
||||||
|
width = QtWidgets.QLineEdit(self._cfg.get('Printer', 'width'))
|
||||||
|
height = QtWidgets.QLineEdit(self._cfg.get('Printer', 'height'))
|
||||||
|
self.add('Printer', 'width', width)
|
||||||
|
self.add('Printer', 'height', height)
|
||||||
|
|
||||||
|
lay_size = QtWidgets.QHBoxLayout()
|
||||||
|
lay_size.addWidget(width)
|
||||||
|
lay_size.addWidget(QtWidgets.QLabel('x'))
|
||||||
|
lay_size.addWidget(height)
|
||||||
|
|
||||||
|
layout = QtWidgets.QFormLayout()
|
||||||
|
layout.addRow('Enable printing:', enable)
|
||||||
|
layout.addRow('Module:', module)
|
||||||
|
layout.addRow('Paper size [mm]:', lay_size)
|
||||||
|
|
||||||
|
widget = QtWidgets.QWidget()
|
||||||
|
widget.setLayout(layout)
|
||||||
|
return widget
|
||||||
|
|
||||||
|
def storeConfigAndRestart(self):
|
||||||
|
|
||||||
|
self._cfg.set('Gui', 'fullscreen',
|
||||||
|
str(self.get('Gui', 'fullscreen').isChecked()))
|
||||||
|
self._cfg.set('Gui', 'module',
|
||||||
|
modules[self.get('Gui', 'module').currentIndex()][0])
|
||||||
|
self._cfg.set('Gui', 'width', self.get('Gui', 'width').text())
|
||||||
|
self._cfg.set('Gui', 'height', self.get('Gui', 'height').text())
|
||||||
|
self._cfg.set('Gui', 'hide_cursor',
|
||||||
|
str(self.get('Gui', 'hide_cursor').isChecked()))
|
||||||
|
|
||||||
|
self._cfg.set('Photobooth', 'show_preview',
|
||||||
|
str(self.get('Photobooth', 'show_preview').isChecked()))
|
||||||
|
self._cfg.set('Photobooth', 'greeter_time',
|
||||||
|
str(self.get('Photobooth', 'greeter_time').text()))
|
||||||
|
self._cfg.set('Photobooth', 'countdown_time',
|
||||||
|
str(self.get('Photobooth', 'countdown_time').text()))
|
||||||
|
self._cfg.set('Photobooth', 'display_time',
|
||||||
|
str(self.get('Photobooth', 'display_time').text()))
|
||||||
|
|
||||||
|
self._cfg.set('Camera', 'module',
|
||||||
|
camera.modules[self.get('Camera',
|
||||||
|
'module').currentIndex()][0])
|
||||||
|
|
||||||
|
self._cfg.set('Picture', 'num_x', self.get('Picture', 'num_x').text())
|
||||||
|
self._cfg.set('Picture', 'num_y', self.get('Picture', 'num_y').text())
|
||||||
|
self._cfg.set('Picture', 'size_x',
|
||||||
|
self.get('Picture', 'size_x').text())
|
||||||
|
self._cfg.set('Picture', 'size_y',
|
||||||
|
self.get('Picture', 'size_y').text())
|
||||||
|
self._cfg.set('Picture', 'min_dist_x',
|
||||||
|
self.get('Picture', 'min_dist_x').text())
|
||||||
|
self._cfg.set('Picture', 'min_dist_y',
|
||||||
|
self.get('Picture', 'min_dist_y').text())
|
||||||
|
self._cfg.set('Picture', 'basedir',
|
||||||
|
self.get('Picture', 'basedir').text())
|
||||||
|
self._cfg.set('Picture', 'basename',
|
||||||
|
self.get('Picture', 'basename').text())
|
||||||
|
|
||||||
|
self._cfg.set('Gpio', 'enable',
|
||||||
|
str(self.get('Gpio', 'enable').isChecked()))
|
||||||
|
self._cfg.set('Gpio', 'exit_pin', self.get('Gpio', 'exit_pin').text())
|
||||||
|
self._cfg.set('Gpio', 'trigger_pin',
|
||||||
|
self.get('Gpio', 'trigger_pin').text())
|
||||||
|
self._cfg.set('Gpio', 'lamp_pin', self.get('Gpio', 'lamp_pin').text())
|
||||||
|
|
||||||
|
self._cfg.set('Printer', 'enable',
|
||||||
|
str(self.get('Printer', 'enable').isChecked()))
|
||||||
|
self._cfg.set('Printer', 'module',
|
||||||
|
printer.modules[self.get('Printer',
|
||||||
|
'module').currentIndex()][0])
|
||||||
|
self._cfg.set('Printer', 'width', self.get('Printer', 'width').text())
|
||||||
|
self._cfg.set('Printer', 'height',
|
||||||
|
self.get('Printer', 'height').text())
|
||||||
|
|
||||||
|
self._cfg.write()
|
||||||
|
self._restartAction()
|
||||||
|
|
||||||
|
def restoreDefaults(self):
|
||||||
|
|
||||||
|
self._cfg.defaults()
|
||||||
|
self._reloadAction()
|
||||||
@@ -5,7 +5,7 @@ from .GuiState import * # noqa
|
|||||||
from .GuiPostprocess import * # noqa
|
from .GuiPostprocess import * # noqa
|
||||||
|
|
||||||
# Available gui modules as tuples of (config name, module name, class name)
|
# Available gui modules as tuples of (config name, module name, class name)
|
||||||
modules = (('qt5', 'PyQt5Gui', 'PyQt5Gui'), )
|
modules = (('PyQt5', 'PyQt5Gui', 'PyQt5Gui'), )
|
||||||
|
|
||||||
|
|
||||||
class Gui:
|
class Gui:
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
# Available printer modules as tuples of (config name, module name, class name)
|
# Available printer modules as tuples of (config name, module name, class name)
|
||||||
modules = (
|
modules = (
|
||||||
('qt5', 'PrinterPyQt5', 'PrinterPyQt5'), )
|
('PyQt5', 'PrinterPyQt5', 'PrinterPyQt5'), )
|
||||||
|
|
||||||
|
|
||||||
class Printer:
|
class Printer:
|
||||||
|
|||||||
Reference in New Issue
Block a user