Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 107 additions & 0 deletions src/f1p/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
from typing import Self

from direct.showbase.ShowBase import ShowBase
from panda3d.core import PStatClient, WindowProperties

from f1p.services.data_extractor import DataExtractorService
from f1p.ui.components.leaderboard import Leaderboard
from f1p.ui.components.map import Map
from f1p.ui.components.menu import Menu
from f1p.ui.components.origin import Origin
from f1p.ui.components.playback import PlaybackControls


class F1PlayerApp(ShowBase):
def __init__(
self,
width: int = 800,
height: int = 800,
draw_origin: bool = False,
show_frame_rate: bool = False,
pstat_debug: bool = False,
):
super().__init__(self)

self.symbols_font = self.loader.loadFont("./src/f1p/ui/fonts/NotoSansSymbols2-Regular.ttf")
self.text_font = self.loader.loadFont("./src/f1p/ui/fonts/f1_font.ttf")

self.width = width
self.height = height

self._data_extractor: DataExtractorService | None = None
self.cam.setPos(0, -70, 40)
self.cam.lookAt(0, 0, 0)

self.setBackgroundColor(0.3, 0.3, 0.3, 1)

self.taskMgr.setupTaskChain("loadingData", numThreads=1)

self.ui_components: list = []

if draw_origin:
origin = Origin(self.render)
origin.render()

self.setFrameRateMeter(show_frame_rate)

if pstat_debug:
PStatClient.connect()

@property
def data_extractor(self) -> DataExtractorService:
if self._data_extractor is None:
self._data_extractor = DataExtractorService(
self.pixel2d,
self.taskMgr,
self.width,
self.height,
self.text_font,
)

return self._data_extractor

def configure_window(self) -> Self:
props = WindowProperties()
props.setSize(self.width, self.height)
props.setFixedSize(True)
self.win.requestProperties(props)

return self

def draw_menu(self) -> Self:
menu = Menu(self.pixel2d, self.taskMgr, self.messenger, self.width, 40, self.text_font, self.data_extractor)
menu.render()

return self

def register_ui_components(self) -> Self:
playback_controls = PlaybackControls(
self.pixel2d,
self.cam,
self.taskMgr,
self.height,
self.width,
30,
self.symbols_font,
self.text_font,
self.data_extractor,
)

circuit_map = Map(self.render, self.taskMgr, self.data_extractor)

leaderboard = Leaderboard(
self.pixel2d,
self.taskMgr,
self.symbols_font,
self.text_font,
circuit_map,
self.data_extractor,
)

self.ui_components = [
playback_controls,
circuit_map,
leaderboard,
]

return self
92 changes: 2 additions & 90 deletions src/f1p/main.py
Original file line number Diff line number Diff line change
@@ -1,93 +1,5 @@
from typing import Self

from direct.showbase.ShowBase import ShowBase
from panda3d.core import WindowProperties

from f1p.services.data_extractor import DataExtractorService
from f1p.ui.components.leaderboard import Leaderboard
from f1p.ui.components.map import Map
from f1p.ui.components.menu import Menu
from f1p.ui.components.origin import Origin
from f1p.ui.components.playback import PlaybackControls


class F1PlayerApp(ShowBase):
def __init__(self, width: int = 800, height: int = 800, draw_origin: bool = False):
super().__init__(self)

self.symbols_font = self.loader.loadFont("./src/f1p/ui/fonts/NotoSansSymbols2-Regular.ttf")
self.text_font = self.loader.loadFont("./src/f1p/ui/fonts/f1_font.ttf")

self.width = width
self.height = height

self._data_extractor: DataExtractorService | None = None
self.cam.setPos(0, -70, 40)
self.cam.lookAt(0, 0, 0)

self.setBackgroundColor(0.3, 0.3, 0.3, 1)

# self.setFrameRateMeter(True)
# PStatClient.connect()

self.ui_components: list = []

if draw_origin:
origin = Origin(self.render)
origin.render()

@property
def data_extractor(self) -> DataExtractorService:
if self._data_extractor is None:
self._data_extractor = DataExtractorService()

return self._data_extractor

def configure_window(self) -> Self:
props = WindowProperties()
props.setSize(self.width, self.height)
self.win.requestProperties(props)

return self

def draw_menu(self) -> Self:
menu = Menu(self.pixel2d, self.width, 40, self.text_font, self.data_extractor)
menu.render()

return self

def register_ui_components(self) -> Self:
playback_controls = PlaybackControls(
self.pixel2d,
self.cam,
self.taskMgr,
self.height,
self.width,
30,
self.symbols_font,
self.text_font,
self.data_extractor,
)

circuit_map = Map(self.render, self.data_extractor)

leaderboard = Leaderboard(
self.pixel2d,
self.symbols_font,
self.text_font,
circuit_map,
self.data_extractor,
)

self.ui_components = [
playback_controls,
circuit_map,
leaderboard,
]

return self

from f1p import F1PlayerApp

app = F1PlayerApp()
app.disableMouse() # disable camera controls
(app.configure_window().draw_menu().register_ui_components().run())
app.configure_window().draw_menu().register_ui_components().run()
Loading