photoframe/photoframe.py

204 lines
7.0 KiB
Python
Executable File

#!/usr/bin/env python3
from PyQt5.QtGui import QIcon, QMouseEvent
from PyQt5.QtWidgets import (QAction, QApplication, QCheckBox, QComboBox,
QDialog, QGridLayout, QGroupBox, QHBoxLayout, QLabel, QLineEdit,
QMessageBox, QMenu, QPushButton, QSpinBox, QStyle, QSystemTrayIcon,
QTextEdit, QVBoxLayout, QSizeGrip, QFileDialog)
from PyQt5.QtCore import (QThread, QTimer, QFile, QSettings,Qt, QPoint )
import resources_rc
from ui_main import Ui_PhotoFrame
from ui_settings import Ui_Settings
from PyQt5 import QtCore, QtGui, QtWidgets
import os
import random
import fnmatch
programSettings = QSettings(os.path.expanduser("~")+"/.config/photoframe/settings.conf", QSettings.NativeFormat)
MainWindowType = QtCore.Qt.Tool
def SettingsExist():
if (programSettings.contains("SizeX") and
programSettings.contains("SizeY") and
programSettings.contains("directory") and
programSettings.contains("PosX") and
programSettings.contains("PosY") and
programSettings.contains("UpdateInterval")):
return True
else:
return False
def SettingsSave():
programSettings.setValue("SizeX",window.geometry().width())
programSettings.setValue("SizeY",window.geometry().height())
programSettings.setValue("directory",settings.ui.txtPath.text())
programSettings.setValue("PosX",window.x())
programSettings.setValue("PosY",window.y())
programSettings.setValue("UpdateInterval",settings.ui.spinUpdateInterval.value())
#Settings load
if (SettingsExist()):
SizeX = int(programSettings.value("SizeX"))
SizeY = int(programSettings.value("SizeY"))
directory = programSettings.value("directory")
PosX = int(programSettings.value("PosX"))
PosY = int(programSettings.value("PosY"))
UpdateInterval = int(programSettings.value("UpdateInterval"))
else:
SizeX = 800
SizeY = 600
directory = ""
PosX = 50
PosY = 50
UpdateInterval = 60
class Window(QDialog):
def __init__(self):
super(Window, self).__init__()
# Init
self.ui = Ui_PhotoFrame()
self.ui.setupUi(self)
self.setWindowFlags(MainWindowType | Qt.WindowStaysOnBottomHint | Qt.FramelessWindowHint)
self.locked = True
self.resize(SizeX, SizeY)
self.move(PosX,PosY)
# Viewer configuration
if (directory != ""):
picture = QtGui.QPixmap(getRandomPicture(directory)).scaled(SizeX,SizeY,QtCore.Qt.KeepAspectRatio)
self.ui.Viewer.setPixmap(picture)
self.ui.Viewer.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.ui.Viewer.customContextMenuRequested.connect(self.showMenu)
# Timer
self.timer = QTimer(self)
self.timer.timeout.connect(self.timerTimeout)
# Functions
def showMenu(self,point):
menu = QMenu(self)
if self.locked:
menu.addAction(QAction(QIcon(':icons/unlock.png'),"&Unlock", self, triggered=self.Unlock))
else:
menu.addAction(QAction(QIcon(':icons/lock.png'),"&Lock", self, triggered=self.Lock))
menu.addAction(QAction(QIcon(':icons/refresh.png'),"&Refresh", self, triggered=self.Refresh))
menu.addAction(QAction(QIcon(':icons/settings.png'),"&Settings", self, triggered=settings.show))
menu.addAction(QAction(QIcon(':icons/menu_quit.png'),"&Quit", self, triggered=QApplication.instance().quit))
menu.popup(self.mapToGlobal(point))
def Unlock(self):
window.setWindowFlags(QtCore.Qt.Window)
self.locked = False
window.show()
def Lock(self):
window.setWindowFlags(MainWindowType | Qt.FramelessWindowHint | Qt.WindowStaysOnBottomHint)
self.locked = True
window.show()
def closeEvent(self, event):
SettingsSave()
QApplication.instance().quit()
def Refresh(self):
if (SettingsExist()):
setPicture(programSettings.value("directory"))
def resizeEvent(self,event):
programSettings.setValue("SizeX",window.geometry().width())
programSettings.setValue("SizeY",window.geometry().height())
def moveEvent(self,event):
programSettings.setValue("PosX",window.x())
programSettings.setValue("PosY",window.y())
def start(self):
self.timer.setInterval(settings.ui.spinUpdateInterval.value()*1000*60)
self.timer.start()
def stop(self):
self.timer.stop()
def timerTimeout(self):
self.ui.Viewer.setPixmap(QtGui.QPixmap(getRandomPicture(settings.ui.txtPath.text())).scaled(SizeX,SizeY,QtCore.Qt.KeepAspectRatio))
class Settings(QDialog):
def __init__(self):
super(Settings, self).__init__()
# Init
self.ui = Ui_Settings()
self.ui.setupUi(self)
self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)
self.ui.txtPath.setText(directory)
if SettingsExist():
self.ui.spinUpdateInterval.setValue(int(programSettings.value("UpdateInterval")))
self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Ok).clicked.connect(self.btnOK_clicked)
self.ui.buttonBox.button(QtWidgets.QDialogButtonBox.Cancel).clicked.connect(self.btnCancel_clicked)
self.ui.btnOpen.clicked.connect(self.btnOpen_clicked)
# Functions
def btnCancel_clicked(self):
self.hide()
def closeEvent(self, event):
self.hide()
event.ignore()
def btnOpen_clicked(self):
directory = QFileDialog.getExistingDirectory(self, 'Open file', os.path.expanduser("~"), QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks | QFileDialog.ReadOnly)
self.ui.txtPath.setText(directory)
def btnOK_clicked(self):
SettingsSave()
directory = self.ui.txtPath.text()
setPicture(directory)
window.stop()
window.start()
self.hide()
def getRandomPicture(path):
files = os.listdir(path)
files_jpg = searchFilesRecursively(path,"*.jpg")
files_png = searchFilesRecursively(path,"*.png")
pictures = files_jpg+files_png
index = random.randrange(0, len(pictures))
return str(pictures[index])
def searchFilesRecursively(path,mask):
matches = []
for root, dirnames, filenames in os.walk(path):
for filename in fnmatch.filter(filenames, mask):
matches.append(os.path.join(root, filename))
return (matches)
def setPicture(directory):
picture = QtGui.QPixmap(getRandomPicture(directory)).scaled(SizeX,SizeY,QtCore.Qt.KeepAspectRatio)
window.ui.Viewer.setPixmap(picture)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
QApplication.setQuitOnLastWindowClosed(True)
window = Window()
window.show()
settings = Settings()
if (SettingsExist()):
settings.hide()
else:
settings.show()
window.start()
sys.exit(app.exec_())