added a configuration panel instead of manually editing the main of the web_replay
This commit is contained in:
parent
eff680be38
commit
207434484e
10 changed files with 149 additions and 27 deletions
0
tools/statistics/__init__.py
Normal file
0
tools/statistics/__init__.py
Normal file
0
tools/statistics/analyse/__init__.py
Normal file
0
tools/statistics/analyse/__init__.py
Normal file
38
tools/statistics/main.py
Normal file
38
tools/statistics/main.py
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
from source.utils import compress
|
||||||
|
|
||||||
|
directory = Path(r"C:\Users\RC606\Downloads\résultats étude")
|
||||||
|
|
||||||
|
# read every people survey data
|
||||||
|
for file in directory.rglob("*.rsl"):
|
||||||
|
# decompress the data
|
||||||
|
data = compress.uncompress_data(file.read_bytes())
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ages = sorted(list(map(
|
||||||
|
lambda data: data["surveys"]["question-age"]["value"],
|
||||||
|
datas
|
||||||
|
)))
|
||||||
|
|
||||||
|
print(ages)
|
||||||
|
print(sum(ages) / len(ages))
|
||||||
|
print(ages[len(ages) // 2])
|
||||||
|
print(min(ages))
|
||||||
|
print(max(ages))
|
||||||
|
|
||||||
|
print(datas[1]["surveys"]["question-usage-steam"])
|
||||||
|
|
||||||
|
usages = sorted(list(map(
|
||||||
|
lambda data: data["surveys"]["question-usage-steam"]["choices"],
|
||||||
|
datas
|
||||||
|
)))
|
||||||
|
|
||||||
|
print(usages)
|
||||||
|
print(sum(usages) / len(usages))
|
||||||
|
print(usages[len(usages) // 2])
|
||||||
|
print(min(usages))
|
||||||
|
print(max(usages))
|
6
tools/statistics/survey/IntegerQuestion.py
Normal file
6
tools/statistics/survey/IntegerQuestion.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
class IntegerQuestion:
|
||||||
|
def get_average(self, datas: list[int]):
|
||||||
|
return sum(datas) / len(datas)
|
||||||
|
|
||||||
|
def get_median(self, datas: list[int]):
|
||||||
|
return datas[len(datas) // 2]
|
0
tools/statistics/survey/__init__.py
Normal file
0
tools/statistics/survey/__init__.py
Normal file
|
@ -1,7 +1,8 @@
|
||||||
|
import json
|
||||||
import sys
|
import sys
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from PyQt6.QtWidgets import QApplication
|
from PyQt6.QtWidgets import QApplication, QFileDialog
|
||||||
|
|
||||||
from tools.web_replay.ui import ReplayWindow
|
from tools.web_replay.ui import ReplayWindow
|
||||||
|
|
||||||
|
@ -10,16 +11,8 @@ if __name__ == "__main__":
|
||||||
# create the application
|
# create the application
|
||||||
application = QApplication(sys.argv)
|
application = QApplication(sys.argv)
|
||||||
|
|
||||||
# TODO: cmd arguments ?
|
|
||||||
from source.utils import compress
|
|
||||||
with open(r"C:\Users\RC606\PycharmProjects\M1-Recherche\results\c3376670-548d-4494-b963-dc2facf7a3d1.rsl", "rb") as file:
|
|
||||||
data = compress.uncompress_data(file.read())
|
|
||||||
|
|
||||||
# create the window
|
# create the window
|
||||||
window = ReplayWindow(
|
window = ReplayWindow("surveys.json")
|
||||||
datetime.fromtimestamp(data["time"]),
|
|
||||||
data["surveys"]["mission-language"]["event"]
|
|
||||||
)
|
|
||||||
window.show()
|
window.show()
|
||||||
|
|
||||||
# start the application
|
# start the application
|
||||||
|
|
63
tools/web_replay/ui/ReplayConfiguration.py
Normal file
63
tools/web_replay/ui/ReplayConfiguration.py
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
from PyQt6.QtCore import pyqtSignal
|
||||||
|
from PyQt6.QtWidgets import QWidget, QLineEdit, QPushButton, QVBoxLayout, QFrame, QHBoxLayout, QComboBox, QFileDialog
|
||||||
|
|
||||||
|
|
||||||
|
class ReplayConfiguration(QWidget):
|
||||||
|
signal_start_replay = pyqtSignal([str, str])
|
||||||
|
|
||||||
|
def __init__(self, missions: list[str]):
|
||||||
|
super().__init__()
|
||||||
|
|
||||||
|
# layout
|
||||||
|
layout = QVBoxLayout()
|
||||||
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
# replay path
|
||||||
|
self.frame_path = QFrame()
|
||||||
|
layout.addWidget(self.frame_path)
|
||||||
|
|
||||||
|
layout_path = QHBoxLayout()
|
||||||
|
self.frame_path.setLayout(layout_path)
|
||||||
|
|
||||||
|
self.entry_path = QLineEdit()
|
||||||
|
layout_path.addWidget(self.entry_path)
|
||||||
|
|
||||||
|
self.button_path = QPushButton()
|
||||||
|
layout_path.addWidget(self.button_path)
|
||||||
|
self.button_path.setText("...")
|
||||||
|
self.button_path.clicked.connect(self.select_replay) # NOQA: connect exist
|
||||||
|
|
||||||
|
# mission
|
||||||
|
self.frame_mission = QFrame()
|
||||||
|
layout.addWidget(self.frame_mission)
|
||||||
|
|
||||||
|
layout_mission = QHBoxLayout()
|
||||||
|
self.frame_mission.setLayout(layout_mission)
|
||||||
|
|
||||||
|
self.listbox_mission = QComboBox()
|
||||||
|
layout_mission.addWidget(self.listbox_mission)
|
||||||
|
|
||||||
|
for mission in missions:
|
||||||
|
self.listbox_mission.addItem(mission)
|
||||||
|
|
||||||
|
# button
|
||||||
|
self.button_confirm = QPushButton()
|
||||||
|
layout.addWidget(self.button_confirm)
|
||||||
|
self.button_confirm.setText("Replay")
|
||||||
|
self.button_confirm.clicked.connect(self._start_replay) # NOQA: connect exist
|
||||||
|
|
||||||
|
def select_replay(self):
|
||||||
|
# prompt the user for a file
|
||||||
|
file, raw_filetype = QFileDialog.getOpenFileName(
|
||||||
|
caption="Select the file to replay.",
|
||||||
|
filter="Replay (*.rsl)"
|
||||||
|
)
|
||||||
|
|
||||||
|
# if no file were selected, ignore
|
||||||
|
if not file:
|
||||||
|
return
|
||||||
|
|
||||||
|
self.entry_path.setText(file)
|
||||||
|
|
||||||
|
def _start_replay(self):
|
||||||
|
self.signal_start_replay.emit(self.entry_path.text(), self.listbox_mission.currentText()) # NOQA: emit
|
|
@ -1,10 +1,12 @@
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime
|
||||||
|
from pathlib import Path
|
||||||
from typing import Callable
|
from typing import Callable
|
||||||
|
|
||||||
from PyQt6.QtCore import Qt, QUrl, QPointF, QTimer
|
from PyQt6.QtCore import Qt, QUrl, QPointF, QTimer
|
||||||
from PyQt6.QtGui import QKeyEvent, QMouseEvent
|
from PyQt6.QtGui import QKeyEvent, QMouseEvent
|
||||||
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QApplication, QLabel
|
from PyQt6.QtWidgets import QWidget, QVBoxLayout, QApplication, QLabel
|
||||||
|
|
||||||
|
from source.utils import compress
|
||||||
from tools.web_replay.ui import ReplayWebEngineView, ReplayNavigation
|
from tools.web_replay.ui import ReplayWebEngineView, ReplayNavigation
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,11 +15,15 @@ class ReplayEngine(QWidget):
|
||||||
This widget allow to replay some event that occurred on a web page
|
This widget allow to replay some event that occurred on a web page
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, start_time: datetime, replay_data: list):
|
def __init__(self, replay_path: Path | str, mission: str):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
self.start_time = start_time - timedelta(days=1) # remove a day to prevent archive rounding
|
# load the replay
|
||||||
self.replay_data = replay_data
|
with open(replay_path, "rb") as file:
|
||||||
|
replay_data = compress.uncompress_data(file.read())
|
||||||
|
|
||||||
|
self.start_time = datetime.fromtimestamp(replay_data["time"])
|
||||||
|
self.replay_events = replay_data["surveys"][mission]["event"]
|
||||||
self.replay_index: int = 0
|
self.replay_index: int = 0
|
||||||
self.replay_time: float = 0
|
self.replay_time: float = 0
|
||||||
|
|
||||||
|
@ -152,7 +158,7 @@ class ReplayEngine(QWidget):
|
||||||
|
|
||||||
def next(self):
|
def next(self):
|
||||||
# get event information
|
# get event information
|
||||||
event = self.replay_data[self.replay_index]
|
event = self.replay_events[self.replay_index]
|
||||||
self.replay_time = event["time"]
|
self.replay_time = event["time"]
|
||||||
self.replay_index = self.replay_index + 1
|
self.replay_index = self.replay_index + 1
|
||||||
|
|
||||||
|
@ -173,9 +179,9 @@ class ReplayEngine(QWidget):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# if there are still events after this one
|
# if there are still events after this one
|
||||||
if self.replay_index < len(self.replay_data):
|
if self.replay_index < len(self.replay_events):
|
||||||
# next event
|
# next event
|
||||||
next_event: dict = self.replay_data[self.replay_index]
|
next_event: dict = self.replay_events[self.replay_index]
|
||||||
next_time: float = next_event["time"]
|
next_time: float = next_event["time"]
|
||||||
|
|
||||||
# prepare the timer to play the event at the corresponding time
|
# prepare the timer to play the event at the corresponding time
|
||||||
|
|
|
@ -1,23 +1,38 @@
|
||||||
from datetime import datetime
|
import json
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
from PyQt6.QtWidgets import QMainWindow
|
from PyQt6.QtWidgets import QMainWindow
|
||||||
|
|
||||||
from tools.web_replay.ui import ReplayEngine
|
from tools.web_replay.ui import ReplayConfiguration, ReplayEngine
|
||||||
|
|
||||||
|
|
||||||
class ReplayWindow(QMainWindow):
|
class ReplayWindow(QMainWindow):
|
||||||
def __init__(self, start_time: datetime, replay_data: list):
|
def __init__(self, survey_path: Path | str):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
# get the survey configuration
|
||||||
|
with open(survey_path, encoding="utf-8") as file:
|
||||||
|
survey_configuration: dict = json.load(file)
|
||||||
|
|
||||||
|
# get all the missions available in the survey that can be replayed
|
||||||
|
missions: list[str] = [
|
||||||
|
mission_id
|
||||||
|
for mission_id, mission in survey_configuration["surveys"].items()
|
||||||
|
if mission["type"] == "mission-web"
|
||||||
|
]
|
||||||
|
|
||||||
# decoration
|
# decoration
|
||||||
self.setWindowTitle("Survey Engine - Web Replay")
|
self.setWindowTitle("Survey Engine - Web Replay")
|
||||||
|
|
||||||
# setup the engine
|
# show the configuration
|
||||||
self.replay_engine = ReplayEngine(start_time, replay_data)
|
self.replay_engine = None
|
||||||
|
self.replay_configuration = ReplayConfiguration(missions=missions)
|
||||||
|
self.setCentralWidget(self.replay_configuration)
|
||||||
|
self.replay_configuration.signal_start_replay.connect(self.start_replay)
|
||||||
|
|
||||||
|
def start_replay(self, replay_path: str, mission: str):
|
||||||
|
# start the replay
|
||||||
|
self.replay_engine = ReplayEngine(replay_path, mission)
|
||||||
self.setCentralWidget(self.replay_engine)
|
self.setCentralWidget(self.replay_engine)
|
||||||
|
|
||||||
# show the window as fullscreen
|
|
||||||
self.showFullScreen()
|
self.showFullScreen()
|
||||||
|
self.replay_engine.next()
|
||||||
# TODO: remove ?
|
|
||||||
self.replay_engine.next() # play the replay
|
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
from .ReplayWebEngineView import ReplayWebEngineView
|
from .ReplayWebEngineView import ReplayWebEngineView
|
||||||
from .ReplayNavigation import ReplayNavigation
|
from .ReplayNavigation import ReplayNavigation
|
||||||
from .ReplayEngine import ReplayEngine
|
from .ReplayEngine import ReplayEngine
|
||||||
|
from .ReplayConfiguration import ReplayConfiguration
|
||||||
from .ReplayWindow import ReplayWindow
|
from .ReplayWindow import ReplayWindow
|
||||||
|
|
Loading…
Reference in a new issue