246 lines
8.2 KiB
Python
246 lines
8.2 KiB
Python
#import tkinter as tk
|
|
import sys
|
|
import os
|
|
import shutil
|
|
from datetime import datetime
|
|
import time
|
|
from PyQt5 import QtCore
|
|
from PyQt5.QtWidgets import *
|
|
from PyQt5.QtGui import QIcon, QPixmap
|
|
from PyQt5.QtCore import *
|
|
|
|
scriptPath = os.path.dirname(os.path.realpath(__file__))
|
|
inputFilePath = scriptPath + '\\files\\input'
|
|
outputFilePath = scriptPath + '\\files\\output'
|
|
|
|
LIB_RAW = 0
|
|
LIB_VIS = 1
|
|
|
|
|
|
def files(path):
|
|
for file in os.listdir(path):
|
|
if os.path.isfile(os.path.join(path, file)):
|
|
yield file
|
|
|
|
def save_input(oldpath):
|
|
# make timestampt the filename, so it wouln't overwrite
|
|
timestamp = str(int(time.time()))
|
|
filename = timestamp + '.' + oldpath.split('.')[-1]
|
|
newpath = inputFilePath + '\\' + filename
|
|
shutil.copy(oldpath, newpath)
|
|
return newpath
|
|
|
|
|
|
class deletePopup(QMessageBox):
|
|
def __init__(self, parent=None):
|
|
super(deletePopup, self).__init__(parent)
|
|
self.setText("Are you sure you want to delete the file?")
|
|
self.setIcon(self.Warning)
|
|
self.setWindowTitle("Confirm deletion")
|
|
self.setStandardButtons(self.Yes | self.No)
|
|
|
|
|
|
class LibraryTableButtons(QWidget):
|
|
def __init__(self, file, table, type, parent=None):
|
|
super(LibraryTableButtons,self).__init__(parent)
|
|
|
|
def viewFile():
|
|
os.startfile(file)
|
|
|
|
def deleteFile():
|
|
self.exPopup = deletePopup()
|
|
ret = self.exPopup.exec()
|
|
if ret == self.exPopup.Yes:
|
|
os.remove(file)
|
|
table.fillTable(type)
|
|
|
|
layout = QHBoxLayout()
|
|
layout.setContentsMargins(0,0,0,0)
|
|
layout.setSpacing(0)
|
|
|
|
view_btn = QPushButton('View')
|
|
view_btn.clicked.connect(viewFile)
|
|
layout.addWidget(view_btn)
|
|
|
|
delete_btn = QPushButton('Delete')
|
|
delete_btn.clicked.connect(deleteFile)
|
|
layout.addWidget(delete_btn)
|
|
|
|
self.setLayout(layout)
|
|
|
|
|
|
class LibraryTable(QTableWidget):
|
|
|
|
def __init__(self, type, singleFilePath = None, parent = None):
|
|
QTableWidget.__init__(self)
|
|
self.fillTable(type, singleFilePath)
|
|
|
|
def fillTable(self, type, singleFilePath = None):
|
|
self.setColumnCount(3)
|
|
|
|
if singleFilePath != None:
|
|
self.setRowCount(1)
|
|
|
|
self.setHorizontalHeaderLabels(['Upload date', 'Filename', 'Options'])
|
|
filePath = inputFilePath
|
|
|
|
self.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
|
|
self.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
|
|
self.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
|
|
|
|
self.setItem(0,0,QTableWidgetItem(str(datetime.fromtimestamp(os.path.getmtime(singleFilePath)))))
|
|
self.setItem(0,1,QTableWidgetItem(str(os.path.basename(singleFilePath))))
|
|
self.setCellWidget(0,2,LibraryTableButtons(singleFilePath, self, type))
|
|
|
|
|
|
else:
|
|
if type == LIB_RAW:
|
|
self.setHorizontalHeaderLabels(['Upload date', 'Filename', 'Options'])
|
|
filePath = inputFilePath
|
|
else:
|
|
self.setHorizontalHeaderLabels(['Creation date', 'Filename', 'Options'])
|
|
filePath = outputFilePath
|
|
|
|
self.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
|
|
self.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
|
|
self.horizontalHeader().setSectionResizeMode(2, QHeaderView.ResizeToContents)
|
|
|
|
dates = []
|
|
names = []
|
|
for index, file in enumerate(files(filePath)):
|
|
dates.append(QTableWidgetItem(str(datetime.fromtimestamp(os.path.getmtime(filePath + '/' + file)))))
|
|
names.append(QTableWidgetItem(str(file)))
|
|
|
|
self.setRowCount(len(dates))
|
|
|
|
for index, date in enumerate(dates):
|
|
self.setItem(index,0,date)
|
|
self.setItem(index,1,names[index])
|
|
self.setCellWidget(index,2,LibraryTableButtons(filePath + '\\' + names[index].text(), self, type))
|
|
|
|
|
|
class formatHelp(QLabel):
|
|
|
|
def __init__(self, parent=None):
|
|
QLabel.__init__(self)
|
|
help_text = '''
|
|
VisionScore to program służący do generowania analizy nagrań lub zdjęć z meczów piłkarskich.
|
|
|
|
By wygenerować taką analizę, należy postępować według następujących kroków:
|
|
|
|
1. Wgraj plik z plikiem do przeanalizowania
|
|
File -> Upload new file
|
|
2. Po wgraniu pliku pojawi się on w
|
|
Library -> Input files
|
|
# 3. By wygenerować analizę należy kliknąć przycisk
|
|
Analyze
|
|
znajdujący się obok wgranego pliku. Analizę można wygenerować także do uprzednio wgranych plików.
|
|
4. Po wygenerowaniu, analiza znajdować się będzie w
|
|
Library -> Vizusalizations
|
|
możesz tam także zobaczyć wszystkie poprzednio wygenerowane analizy.
|
|
|
|
Każdy plik źródłowy lub wygenerowaną analizę możesz w każdym momencie podejrzeć klikając
|
|
View
|
|
obok pliku znajdującego się w bibliotekach. Plik możesz też w każdym momencie usunąć klikając
|
|
Delete
|
|
obok odpowiedniego pliku.
|
|
|
|
|
|
Zakończ działanie aplikacji klikąc
|
|
File -> Exit
|
|
używając skrótu klawiszowego Ctrl+Q lub bo prostu zamykając okienko aplikacji.
|
|
|
|
|
|
Kontakt: mikbed@st.amu.edu.pl
|
|
'''
|
|
self.setText(help_text)
|
|
self.adjustSize()
|
|
|
|
|
|
|
|
class MainWindow(QMainWindow):
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.initUI()
|
|
|
|
# todo: split in multiply labels for richer formatting
|
|
# Show Help tab
|
|
def showHelp(self):
|
|
label = formatHelp()
|
|
self.setCentralWidget(label)
|
|
|
|
# Show raw uploaded files
|
|
def showInputLibrary(self):
|
|
libTable = LibraryTable(LIB_RAW)
|
|
self.setCentralWidget(libTable)
|
|
|
|
# Show visualisations
|
|
def showVisualisationsLibrary(self):
|
|
libTable = LibraryTable(LIB_VIS)
|
|
self.setCentralWidget(libTable)
|
|
|
|
def showUploadFile(self):
|
|
dialog = QFileDialog(self)
|
|
dialog.setFileMode(QFileDialog.AnyFile)
|
|
dialog.setFilter(QDir.Files)
|
|
if dialog.exec_():
|
|
file_path = dialog.selectedFiles()[0] # ['C:/Users/agatha/Desktop/SYI/VisionScore/win_venv/requirements.txt']
|
|
newPath = save_input(file_path)
|
|
singleFileTable = LibraryTable(LIB_RAW, newPath)
|
|
self.setCentralWidget(singleFileTable)
|
|
|
|
def initUI(self):
|
|
self.setGeometry(0, 0, 600, 400)
|
|
self.setWindowTitle('VisionScore')
|
|
scriptDir = os.path.dirname(os.path.realpath(__file__))
|
|
self.setWindowIcon(QIcon(scriptDir + os.path.sep + 'static/v_logo.jpg'))
|
|
|
|
# File menu
|
|
menuBar = self.menuBar()
|
|
fileMenu = QMenu("&File", self)
|
|
menuBar.addMenu(fileMenu)
|
|
|
|
# Upload file
|
|
uploadAct = QAction('&Upload new file', self)
|
|
uploadAct.triggered.connect(self.showUploadFile)
|
|
fileMenu.addAction(uploadAct)
|
|
|
|
# Exit app
|
|
exitAct = QAction('&Exit', self)
|
|
exitAct.setShortcut('Ctrl+Q')
|
|
exitAct.setStatusTip('Exit')
|
|
exitAct.triggered.connect(qApp.quit)
|
|
fileMenu.addAction(exitAct)
|
|
|
|
# Library menu
|
|
libraryMenu = QMenu("&Library", self)
|
|
menuBar.addMenu(libraryMenu)
|
|
|
|
# Input files
|
|
inputAct = QAction('&Input files', self)
|
|
inputAct.triggered.connect(self.showInputLibrary)
|
|
libraryMenu.addAction(inputAct)
|
|
|
|
# Visualisations
|
|
visAct = QAction('&Visualisations', self)
|
|
visAct.triggered.connect(self.showVisualisationsLibrary)
|
|
libraryMenu.addAction(visAct)
|
|
|
|
# Help
|
|
helpAct = QAction('&Help', self)
|
|
helpAct.triggered.connect(self.showHelp)
|
|
menuBar.addAction(helpAct)
|
|
|
|
self.show()
|
|
|
|
|
|
def main():
|
|
app = QApplication(sys.argv)
|
|
|
|
w = MainWindow()
|
|
sys.exit(app.exec_())
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main() |