def acMain(ac_version): global updater, appHeight, appWidth, appWindow, numSecondsSpinner appWindow = ac.newApp("Traction Circle") ac.setSize(appWindow, appWidth, appHeight) ac.drawBorder(appWindow, 0) try: model = TractionCircleModel() assetto_corsa = AssettoCorsa() maxTimeSpan = 3 numSecondsSpinner = ac.addSpinner(appWindow, 'Time Span(s)') ac.setPosition(numSecondsSpinner, 0, appHeight - 20) ac.setSize(numSecondsSpinner, 100, 20) ac.setRange(numSecondsSpinner, 1, 10) ac.setValue(numSecondsSpinner, maxTimeSpan) ac.addOnValueChangeListener(numSecondsSpinner, updateMaxTimeRange) gPlotter = GPlotter(appWidth, appHeight, maxG, maxG) view = TractionCircleView(appWindow, model, gPlotter, MovingAveragePlotter(10) ) updater = TractionCircleUpdater(assetto_corsa, view, model, maxTimeRange=maxTimeSpan) ac.addRenderCallback(appWindow, doUpdate) except Exception as e: ac.log(str(traceback.format_exc())) return "Traction Circle"
def acMain(ac_version): global TYREINFO, optimal_spinner_id, optimal_spinner_shown appWindow = ac.newApp("Tyre Temperatures") ac.drawBackground(appWindow, background) ac.drawBorder(appWindow, background) ac.setBackgroundOpacity(appWindow, background) ac.setSize(appWindow, x_app_size, y_app_size) TYREINFO = Tyre_Info(appWindow, x_start, y_start) ac.addRenderCallback(appWindow, onFormRender) TYREINFO.optimal_temp = d_optimal_temp TYREINFO.carinifilepath = inidir + getValidFileName(ac.getCarName(0)) + ".ini" TYREINFO.needwriteini = 1 if os.path.exists(TYREINFO.carinifilepath): f = open(TYREINFO.carinifilepath, "r") TYREINFO.optimal_temp = int(f.readline()[8:]) f.close() TYREINFO.needwriteini = 0 optimal_spinner_id = ac.addSpinner(appWindow, "optimal") ac.setPosition(optimal_spinner_id, 0, y_app_size + 28) ac.setStep(optimal_spinner_id, 1) if inFahrenheit: ac.setRange(optimal_spinner_id, int(CelsiusToFahrenheit(50)), int(CelsiusToFahrenheit(150))) ac.setValue(optimal_spinner_id, int(CelsiusToFahrenheit(TYREINFO.optimal_temp))) else: ac.setRange(optimal_spinner_id, 50, 150) ac.setValue(optimal_spinner_id, TYREINFO.optimal_temp) ac.addOnValueChangeListener(optimal_spinner_id, onValueChanged) optimal_spinner_shown = 1 ac.log("Danny Giusa Tyre Temperatures loaded") return "Danny Giusa Tyre Temperatures"
def spinner_config(spinner, x, y, xl, yl, min, step, max, value, evt): ac.setPosition(spinner, x, y) ac.setSize(spinner, xl, yl) ac.setRange(spinner, min, max) ac.setStep(spinner, step) ac.setValue(spinner, value) ac.addOnValueChangeListener(spinner, evt)
def spinnerConfig(spinner, spin_pos_x, spin_pos_y, spin_size_x, spin_size_y, spin_val_min, spin_val_step, spin_val_max, spin_value, spin_event, vis_value): ac.setPosition(spinner, spin_pos_x, spin_pos_y) ac.setSize(spinner, spin_size_x, spin_size_y) ac.setRange(spinner, spin_val_min, spin_val_max) ac.setStep(spinner, spin_val_step) ac.setValue(spinner, spin_value) ac.addOnValueChangeListener(spinner, spin_event) ac.setVisible(spinner, vis_value)
def SuperHardEvent(name, state): global SuperHard,Tires Tires = "SuperHard" ac.setValue(NoChange,0) ac.setValue(SuperSoft,0) ac.setValue(SoftSlick,0) ac.setValue(MediumSlick,0) ac.setValue(HardSlick,0) WriteData()
def NoChangeEvent(name, state): global NoChange,Tires Tires = "NoChange" ac.setValue(SoftSlick,0) ac.setValue(SuperSoft,0) ac.setValue(MediumSlick,0) ac.setValue(HardSlick,0) ac.setValue(SuperHard,0) WriteData()
def __init__(self): self.window = Window(name="ACTV Delta", icon=False, width=240, height=184, texture="") self.cursor = Value(False) self.session = Value(-1) self.performance = Value(0) self.spline = Value(0) self.laptime = Value(0) self.TimeLeftUpdate = Value(0) self.referenceLap = [] self.referenceLapTime = Value(0) self.lastLapTime = Value(0) self.lapCount = 0 self.lastLapIsValid = True self.currentLap = [] self.deltaLoaded = False self.thread_save = False self.highlight_end = 0 self.rowHeight = Value(-1) self.lbl_delta = ( Label(self.window.app, "+0.000") .setSize(150, 36) .setPos(0, 60) .setFontSize(26) .setAlign("right") .setVisible(1) ) self.lbl_lap = ( Label(self.window.app, "0.000") .setSize(150, 32) .setPos(0, 86) .setFontSize(17) .setAlign("right") .setVisible(1) ) self.btn_reset = ( Button(self.window.app, self.onResetPress) .setPos(90, 68) .setSize(60, 20) .setText("Reset") .setAlign("center") .setBgColor(rgb([255, 12, 12], bg=True)) .setVisible(0) ) self.spin_row_height = ac.addSpinner(self.window.app, "") ac.setRange(self.spin_row_height, 20, 48) ac.setPosition(self.spin_row_height, 20, 28) ac.setValue(self.spin_row_height, self.__class__.ui_row_height) ac.addOnValueChangeListener(self.spin_row_height, self.onSpinRowHeightChanged) ac.setVisible(self.spin_row_height, 0) fontName = "Segoe UI" if ac.initFont(0, fontName, 0, 0) > 0: self.lbl_delta.setFont(fontName, 0, 1) self.cfg = Config("apps/python/prunn/", "config.ini") self.loadCFG()
def hotkey_pressed(self): if self.session.value == 2: if self.__class__.race_mode >= 2: self.__class__.race_mode = 0 else: self.__class__.race_mode += 1 ac.setValue(self.spin_race_mode, self.__class__.race_mode) else: if self.__class__.qual_mode >= 1: self.__class__.qual_mode = 0 else: self.__class__.qual_mode += 1 ac.setValue(self.spin_qual_mode, self.__class__.qual_mode) self.__class__.configChanged = True
def ReadPreset(): global Car, FixBody, FixEngine, FixSuspen, Preset, Tires, Gas PresetConfig = configparser.ConfigParser() PresetConfig.read('apps\python\BoxRadio\BoxRadio.ini') if not 'PRESET' + str(Preset) + '_' + ac.getCarName(0) in PresetConfig: WriteSection() Car = PresetConfig['PRESET' + str(Preset) + '_' + ac.getCarName(0)]['car'] if Car == ac.getCarName(0): ac.setValue(FuelSelection, int(PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['fuel'])) if PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['body'] == 'no': FixBody = 'yes' else: FixBody = 'no' if PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['engine'] == 'no': FixEngine = 'yes' else: FixEngine = 'no' if PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['suspen'] == 'no': FixSuspen = 'yes' else: FixSuspen = 'no' if PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['tyre'] == 'NoChange': NoChangeEvent('name', 0) elif PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['tyre'] == 'Option1': Option1Event('name', 0) elif PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['tyre'] == 'Option2': Option2Event('name', 0) elif PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['tyre'] == 'Option3': Option3Event('name', 0) elif PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['tyre'] == 'Option4': Option4Event('name', 0) elif PresetConfig['PRESET' + str(Preset) + '_' + str(Car)]['tyre'] == 'Option5': Option5Event('name', 0) else: ac.setValue(FuelSelection, 0) NoChangeEvent('name', 0) FixBody = 'yes' FixEngine = 'yes' FixSuspen = 'yes' BodyEvent('name', 0) EngineEvent('name', 0) SuspensionEvent('name', 0) FuelEvent(0)
def __init__(self, window, changeFunc, width=120, height=20, x=0, y=0, title="spn", minVal=0, maxVal=1, startVal=0): self.spinner = ac.addSpinner(window, title) self.setSize(width, height) self.setPos(x, y) self.setRange(minVal, maxVal) ac.addOnValueChangeListener(self.spinner, changeFunc) Log.blank(ac.setValue(self.spinner, startVal)) # logging it fixes really weird bug
def acUpdate(deltaT): try: global Speed, DoPit, FuelMax, InPit, FuelIn, session, delta # Position,InitialPosition vars can be removed from the code global PitX, PitY, PitZ # added global variables initiliased as 0,0,0. X,Y,Z co-ords of pit box global AppInitialised # added global variable initiliased as False global Notify if not AppInitialised: # First call to app, set variables getNotification() if AutoUpdate: CheckNewUpdate() InPit = info.graphics.isInPit FuelMax = int(info.static.maxFuel) ac.setRange(FuelSelection, 0, FuelMax) ReadPreset() ac.setValue(Preset1, 1) AppInitialised = True if abs(PitX) < 1e-5: # set pit position InPit = info.graphics.isInPit if InPit: PitX, PitY, PitZ = ac.getCarState(0, acsys.CS.WorldPosition) ac.log("BoxRadio: Pit position initialized at X:" + str(PitX) + " Y:" + str(PitY) + " Z:" + str(PitZ)) Speed = ac.getCarState(0, acsys.CS.SpeedKMH) if Speed < 0.1 and DoPit == 0: session = info.graphics.session # session number, 2 is race InPit = info.graphics.isInPit if session == 2: PosX, PosY, PosZ = ac.getCarState(0, acsys.CS.WorldPosition) # current co-ord position delta = ((PosX - PitX) ** 2 + (PosY - PitY) ** 2 + (PosZ - PitZ) ** 2) ** 0.5 # straight line dist between pitbox and car FuelIn = int(info.physics.fuel) if delta < 8.0 or InPit == 1: # if InPit or within 8m of pitbox, quite relaxed limit guarantees app trigger on menu appear PitStop() ac.log("BoxRadio: Pit performed at X:" + str(PosX) + " Y:" + str(PosY) + " Z:" + str(PosZ)) ac.log("BoxRadio: Delta:" + str(delta)) DoPit = 1 if Speed >= 0.1: DoPit = 0 except Exception as e: ac.log("BoxRadio: Error in acUpdate: %s" % e)
def Preset1Event(name, state): global Preset WritePreset() Preset = 1 ac.setValue(Preset1, 1) ac.setValue(Preset2, 0) ac.setValue(Preset3, 0) ac.setValue(Preset4, 0) ReadPreset()
def Preset4Event(name, state): global Preset WritePreset() Preset = 4 ac.setValue(Preset4, 1) ac.setValue(Preset1, 0) ac.setValue(Preset2, 0) ac.setValue(Preset3, 0) ReadPreset()
def acMain(ac_version): global TYREINFO, optimal_spinner_id, optimal_spinner_shown appWindow = ac.newApp("Tyre Temperatures") ac.drawBackground(appWindow, background) ac.drawBorder(appWindow, background) ac.setBackgroundOpacity(appWindow, background) ac.setSize(appWindow, x_app_size, y_app_size) TYREINFO = Tyre_Info(appWindow, x_start, y_start) ac.addRenderCallback(appWindow, onFormRender) TYREINFO.optimal_temp = d_optimal_temp TYREINFO.carinifilepath = inidir + getValidFileName( ac.getCarName(0)) + ".ini" TYREINFO.needwriteini = 1 if os.path.exists(TYREINFO.carinifilepath): f = open(TYREINFO.carinifilepath, "r") TYREINFO.optimal_temp = int(f.readline()[8:]) f.close() TYREINFO.needwriteini = 0 optimal_spinner_id = ac.addSpinner(appWindow, "optimal") ac.setPosition(optimal_spinner_id, 0, y_app_size + 28) ac.setStep(optimal_spinner_id, 1) if inFahrenheit: ac.setRange(optimal_spinner_id, int(CelsiusToFahrenheit(50)), int(CelsiusToFahrenheit(150))) ac.setValue(optimal_spinner_id, int(CelsiusToFahrenheit(TYREINFO.optimal_temp))) else: ac.setRange(optimal_spinner_id, 50, 150) ac.setValue(optimal_spinner_id, TYREINFO.optimal_temp) ac.addOnValueChangeListener(optimal_spinner_id, onValueChanged) optimal_spinner_shown = 1 ac.log("Danny Giusa Tyre Temperatures loaded") return "Danny Giusa Tyre Temperatures"
def acMain(ac_version): global appWindow, labelStorage, spinner_y_offset, scale_factor, fov_setting appWindow = ac.newApp("VR-Names") ac.setTitle(appWindow, "VR-names") ac.setSize(appWindow, 200, 200) ac.drawBorder(appWindow, 0) ac.setBackgroundOpacity(appWindow, 0) # ac.setIconPosition(appWindow, -9000, 0) spinner_y_offset = ac.addSpinner(appWindow, "Name Height Offset") ac.setRange(spinner_y_offset, -100, 100) ac.setValue(spinner_y_offset, 0) ac.setStep(spinner_y_offset, 1) ac.setPosition(spinner_y_offset, 10, 90) ac.setSize(spinner_y_offset, 180, 20) scale_factor = ac.addSpinner(appWindow, "scale text factor") ac.setRange(scale_factor, 1, 30) ac.setValue(scale_factor, 10) ac.setStep(scale_factor, 1) ac.setPosition(scale_factor, 10, 135) ac.setSize(scale_factor, 180, 20) fov_setting = ac.addSpinner(appWindow, "scale text factor") ac.setRange(fov_setting, 0, 360) ac.setValue(fov_setting, 110) ac.setStep(fov_setting, 1) ac.setPosition(fov_setting, 10, 180) ac.setSize(fov_setting, 180, 20) button_toggle_name = ac.addButton(appWindow, "Toggle name") ac.addOnClickedListener(button_toggle_name, toggle_name) ac.setSize(button_toggle_name, 180, 20) ac.setPosition(button_toggle_name, 10, 40) for x in range(ac.getCarsCount()): label = ac.addLabel(appWindow, "") ac.setPosition(label, 10, 0 + (20 * x)) labelStorage.append(label) setInitialLabel() return "vrnames"
def acMain(ac_version): global mainLabel, audioSpinner, audioLabel, audioList, audioVolSpinner, enableCheck, replayEnableCheck, app app = ac.newApp("Ultimate Spotter Settings") ac.log("SPOTTER: Initializing UI...") audioSpinner = ac.addSpinner(app, "Audio") audioLabel = ac.addLabel(app, "{}".format(audio)) audioVolSpinner = ac.addSpinner(app, "Volume") enableCheck = ac.addCheckBox(app, "Enable Spotter") replayEnableCheck = ac.addCheckBox(app, "Enabled in Replays") ac.setSize(app, 300, 220) ac.setPosition(enableCheck, 60, 50) ac.setValue(enableCheck, USEnabled) ac.addOnCheckBoxChanged(enableCheck, onEnableCheck) ac.setPosition(replayEnableCheck, 60, 100) ac.setValue(replayEnableCheck, USReplayEnabled) ac.addOnCheckBoxChanged(replayEnableCheck, onReplayEnableCheck) ac.setFontAlignment(audioLabel, "center") ac.setPosition(audioLabel, 90, 150) ac.setSize(audioSpinner, 100, 20) ac.setPosition(audioSpinner, 40, 150) audioList = os.listdir(os.path.join(os.path.dirname(__file__), "audio")) ac.setRange(audioSpinner, 0, len(audioList) - 1) ac.setStep(audioSpinner, 1) #ac.setValue(audioSpinner,audioList.index(audio)) ac.addOnValueChangeListener(audioSpinner, onAudioSpin) ac.setSize(audioVolSpinner, 80, 20) ac.setPosition(audioVolSpinner, 180, 150) ac.setStep(audioVolSpinner, 1) ac.setRange(audioVolSpinner, 1, 10) ac.setValue(audioVolSpinner, audioVol) ac.addOnValueChangeListener(audioVolSpinner, onAudioVolSpin) ac.log("SPOTTER: UI Loaded")
def createUI(): global uiCreated, x_app_size, y_app_size, defaultFontSize global isTimedRace, timedRaceCheckbox, averageFuelPerLapValue, raceTotalLapsText, raceTotalLapsValue, bestLapTimeText, bestLapTimeValue, timedRaceMinutesSpinner, raceLapsSpinner, resetButton, timedRacePlusLapButton, timedRaceMinLapButton global extraLiters, extraLitersMinButton, extraLitersPlusButton, extraLitersValue, averageFuelPerLapText, extraLitersText, timedRaceText, toggleAppSizeButton, fuelLapsCountedText, fuelLapsCountedValue, calcTypeText, calcTypeCurrentButton, calcTypeMultipleButton, calcTypeStoredButton, completedLapsText, completedLapsValue, averageLapTimeText, averageLapTimeValue global tableCurrentFuel, tableCurrentTime, tableCurrentLaps, tableRaceFuel, tableRaceTime, tableRaceLaps, tableRowRace try: row = 0 x_offset = 5 y_offset = 20 createLabel("tableHeaderFuel", "Fuel", ((x_app_size)/5) * 2, row * y_offset, defaultFontSize, "center") createLabel("tableHeaderTime", "Time", ((x_app_size)/5) * 3, row * y_offset, defaultFontSize, "center") createLabel("tableHeaderLaps", "Laps", ((x_app_size)/5) * 4, row * y_offset, defaultFontSize, "center") row += 1 createLabel("tableRowCurrent", "Current", x_offset, row * y_offset, defaultFontSize, "left") tableCurrentFuel = createLabel("tableCurrentFuel", "--", ((x_app_size)/5) * 2, row * y_offset, defaultFontSize+2, "center") tableCurrentTime = createLabel("tableCurrentTime", "--", ((x_app_size)/5) * 3, row * y_offset, defaultFontSize+2, "center") tableCurrentLaps = createLabel("tableCurrentLaps", "--", ((x_app_size)/5) * 4, row * y_offset, defaultFontSize+2, "center") row += 1 tableRowRace = createLabel("tableRowRace", "Total Race", x_offset, row * y_offset, defaultFontSize, "left") tableRaceFuel = createLabel("tableRaceFuel", "--", ((x_app_size)/5) * 2, row * y_offset, defaultFontSize+2, "center") tableRaceTime = createLabel("tableRaceTime", "--", ((x_app_size)/5) * 3, row * y_offset, defaultFontSize+2, "center") tableRaceLaps = createLabel("tableRaceLaps", "--", ((x_app_size)/5) * 4, row * y_offset, defaultFontSize+2, "center") toggleAppSizeButton = ac.addButton(mainApp, "+") ac.setPosition(toggleAppSizeButton, x_app_size - 20 - x_offset, (row * y_offset) + 5) ac.setSize(toggleAppSizeButton, 20, 20) ac.addOnClickedListener(toggleAppSizeButton, onToggleAppSizeButtonClickedListener) row += 2 calcTypeText = createLabel("calcTypeText", "Session : ", x_offset, row * y_offset, defaultFontSize, "left") calcTypeWidth = 60 calcTypeOffset = x_offset + 70 calcTypeCurrentButton = ac.addButton(mainApp, "current") ac.setPosition(calcTypeCurrentButton, calcTypeOffset, row * y_offset) ac.setSize(calcTypeCurrentButton, calcTypeWidth, 20) ac.addOnClickedListener(calcTypeCurrentButton, onCalcTypeCurrentButtonClickedListener) calcTypeMultipleButton = ac.addButton(mainApp, "multiple") ac.setPosition(calcTypeMultipleButton, calcTypeOffset + calcTypeWidth + 10, row * y_offset) ac.setSize(calcTypeMultipleButton, calcTypeWidth, 20) ac.addOnClickedListener(calcTypeMultipleButton, onCalcTypeMultipleButtonClickedListener) calcTypeStoredButton = ac.addButton(mainApp, "stored") ac.setPosition(calcTypeStoredButton, calcTypeOffset + (2*calcTypeWidth) + 20, row * y_offset) ac.setSize(calcTypeStoredButton, calcTypeWidth, 20) ac.addOnClickedListener(calcTypeStoredButton, onCalcTypeStoredButtonClickedListener) row += 2 averageFuelPerLapText = createLabel("averageFuelPerLapText", "Avg fuel per lap : ", x_offset, row * y_offset, defaultFontSize, "left") averageFuelPerLapValue = createLabel("averageFuelPerLapValue", "--", x_app_size - x_offset, row * y_offset, defaultFontSize, "right") row += 1 fuelLapsCountedText = createLabel("fuelLapsCountedText", "Counted laps for fuel average : ", x_offset, row * y_offset, defaultFontSize, "left") fuelLapsCountedValue = createLabel("averageFuelPerLapValue", "--", x_app_size - x_offset, row * y_offset, defaultFontSize, "right") row += 1 completedLapsText = createLabel("completedLapsText", "Completed laps : ", x_offset, row * y_offset, defaultFontSize, "left") completedLapsValue = createLabel("completedLapsValue", "--", x_app_size - x_offset, row * y_offset, defaultFontSize, "right") row += 1 extraLitersText = createLabel("extraLitersText", "Extra liters : ", x_offset, row * y_offset, defaultFontSize, "left") extraLitersValue = createLabel("extraLitersValue", "--", x_app_size - x_offset, row * y_offset, defaultFontSize, "right") extraLitersMinButton = ac.addButton(mainApp, "-") ac.setPosition(extraLitersMinButton, 180, row * y_offset) ac.setSize(extraLitersMinButton, 20, 20) ac.addOnClickedListener(extraLitersMinButton, onExtraLitersMinButtonClickedListener) extraLitersPlusButton = ac.addButton(mainApp, "+") ac.setPosition(extraLitersPlusButton, 205, row * y_offset) ac.setSize(extraLitersPlusButton, 20, 20) ac.addOnClickedListener(extraLitersPlusButton, onExtraLitersPlusButtonClickedListener) row += 1 timedRaceText = createLabel("timedRaceText", "Is timed race : ", x_offset, row * y_offset, defaultFontSize, "left") timedRaceCheckbox = ac.addCheckBox(mainApp, "") ac.setPosition(timedRaceCheckbox, x_app_size - (x_offset + 15), row * y_offset + 4) ac.setSize(timedRaceCheckbox, 15, 15) ac.setValue(timedRaceCheckbox, isTimedRace) ac.addOnCheckBoxChanged(timedRaceCheckbox, onTimedRaceChangedListener) row += 1 raceTypeRow = row raceTotalLapsText = createLabel("raceTotalLapsText", "Expected race laps : ", x_offset, row * y_offset, defaultFontSize, "left") raceTotalLapsValue = createLabel("raceTotalLapsValue", "--", x_app_size - x_offset, row * y_offset, defaultFontSize, "right") timedRaceMinLapButton = ac.addButton(mainApp, "-") ac.setPosition(timedRaceMinLapButton, 180, row * y_offset) ac.setSize(timedRaceMinLapButton, 20, 20) ac.addOnClickedListener(timedRaceMinLapButton, onTimedRaceMinLapButtonClickedListener) timedRacePlusLapButton = ac.addButton(mainApp, "+") ac.setPosition(timedRacePlusLapButton, 205, row * y_offset) ac.setSize(timedRacePlusLapButton, 20, 20) ac.addOnClickedListener(timedRacePlusLapButton, onTimedRacePlusLapButtonClickedListener) row += 1 averageLapTimeText = createLabel("averageLapTimeText", "Average lap time : ", x_offset, row * y_offset, defaultFontSize, "left") averageLapTimeValue = createLabel("averageLapTimeValue", "--", x_app_size - x_offset, row * y_offset, defaultFontSize, "right") row += 1 bestLapTimeText = createLabel("bestLapTimeText", "Best lap time : ", x_offset, row * y_offset, defaultFontSize, "left") bestLapTimeValue = createLabel("bestLapTimeValue", "--", x_app_size - x_offset, row * y_offset, defaultFontSize, "right") row += 3 timedRaceMinutesSpinner = ac.addSpinner(mainApp, "Timed race minutes") ac.setRange(timedRaceMinutesSpinner, 0, 240) ac.setValue(timedRaceMinutesSpinner, timedRaceMinutes) ac.setStep(timedRaceMinutesSpinner, 1) ac.setPosition(timedRaceMinutesSpinner, x_app_size / 6, row * y_offset) ac.addOnValueChangeListener(timedRaceMinutesSpinner, onTimedRaceMinutesChangedListener) row += 2 resetButton = ac.addButton(mainApp, "Reset") ac.setPosition(resetButton, x_offset + 5, (row * y_offset) + (y_offset / 2)) ac.setSize(resetButton, 50, 22) ac.addOnClickedListener(resetButton, onResetClickedListener) row = raceTypeRow row += 5 raceLapsSpinner = ac.addSpinner(mainApp, "Race laps") ac.setRange(raceLapsSpinner, 0, 100) ac.setValue(raceLapsSpinner, raceLaps) ac.setStep(raceLapsSpinner, 1) ac.setPosition(raceLapsSpinner, x_app_size / 6, row * y_offset) ac.addOnValueChangeListener(raceLapsSpinner, onRaceLapsChangedListener) updateUIVisibility() uiCreated = True except exception: debug(repr(traceback.format_exception(exc_type, exc_value, exc_traceback))) showMessage("Error: " + traceback.format_exc())
def ResponseWit(): global SoftSlick,MediumSlick,HardSlick,SuperHard,Body,Engine,Suspension,NoChange,SuperSoft global PitFileText,PitFileLines,Tires,Gas,FixBody,FixEngine,FixSuspension with open('apps/python/PitVoice/Pit.txt') as PitFileText: PitFileLines = [line.rstrip('\n') for line in PitFileText] Tires = PitFileLines[0] Gas = PitFileLines[1] FixBody = PitFileLines[2] FixEngine = PitFileLines[3] FixSuspension = PitFileLines[4] PitFileText.close() if Tires == "NoChange": ac.setValue(NoChange,1) ac.setValue(SoftSlick,0) ac.setValue(SuperSoft,0) ac.setValue(MediumSlick,0) ac.setValue(HardSlick,0) ac.setValue(SuperHard,0) if Tires == "SuperSoft": ac.setValue(SuperSoft,1) ac.setValue(NoChange,0) ac.setValue(SoftSlick,0) ac.setValue(MediumSlick,0) ac.setValue(HardSlick,0) ac.setValue(SuperHard,0) if Tires == "SoftSlick": ac.setValue(SoftSlick,1) ac.setValue(NoChange,0) ac.setValue(SuperSoft,0) ac.setValue(MediumSlick,0) ac.setValue(HardSlick,0) ac.setValue(SuperHard,0) if Tires == "MediumSlick": ac.setValue(MediumSlick,1) ac.setValue(NoChange,0) ac.setValue(SuperSoft,0) ac.setValue(SoftSlick,0) ac.setValue(HardSlick,0) ac.setValue(SuperHard,0) if Tires == "HardSlick": ac.setValue(SuperSoft,1) ac.setValue(NoChange,0) ac.setValue(SuperSoft,0) ac.setValue(SoftSlick,0) ac.setValue(MediumSlick,0) ac.setValue(SuperHard,0) if Tires == "SuperHard": ac.setValue(SuperHard,1) ac.setValue(NoChange,0) ac.setValue(SuperSoft,0) ac.setValue(SoftSlick,0) ac.setValue(MediumSlick,0) ac.setValue(HardSlick,0) if FixBody == "yes": ac.setValue(Body,1) else: ac.setValue(Body,0) if FixEngine == "yes": ac.setValue(Engine,1) else: ac.setValue(Engine,0) if FixSuspension == "yes": ac.setValue(Suspension,1) else: ac.setValue(Suspension,0) if Gas != "0": ac.setText(label3,"{}".format(Gas))
def __init__(self): self.visual_timeout = -1 self.session = Value(-1) self.listen_active = True Colors.load_themes() Font.load_fonts() self.window = Window(name="ACTV Config", icon=False, width=251, height=590, texture="").setBgOpacity(0) self.btn_tab1 = Button(self.window.app, self.on_tab1_press)\ .setPos(0, -22).setSize(126, 22).setText("General")\ .setAlign("center").setBgColor(rgb([255, 12, 12], bg=True)) self.btn_tab2 = Button(self.window.app, self.on_tab2_press)\ .setPos(126, -22).setSize(125, 22).setText("Colors")\ .setAlign("center").setBgColor(rgb([12, 12, 12], bg=True)) y = 50 self.spin_race_mode = ac.addSpinner(self.window.app, "Race tower mode :") ac.setRange(self.spin_race_mode, 0, 8) ac.setPosition(self.spin_race_mode, 20, y) ac.setValue(self.spin_race_mode, self.__class__.race_mode) ac.addOnValueChangeListener(self.spin_race_mode, self.on_spin_race_mode_changed) self.lbl_race_mode = Label(self.window.app, "Auto")\ .setSize(120, 26).setPos(186, y - 28)\ .setFontSize(12).setAlign("left")\ .setVisible(1) y += 70 self.spin_qual_mode = ac.addSpinner(self.window.app, "Qual tower mode :") ac.setRange(self.spin_qual_mode, 0, 4) ac.setPosition(self.spin_qual_mode, 20, y) ac.setValue(self.spin_qual_mode, self.__class__.qual_mode) ac.addOnValueChangeListener(self.spin_qual_mode, self.on_spin_qual_mode_changed) self.lbl_qual_mode = Label(self.window.app, "Gaps")\ .setSize(120, 26).setPos(186, y - 28)\ .setFontSize(12).setAlign("left")\ .setVisible(1) y += 70 self.spin_num_cars = ac.addSpinner(self.window.app, "Number cars tower") ac.setRange(self.spin_num_cars, 6, 80) ac.setPosition(self.spin_num_cars, 20, y) ac.setValue(self.spin_num_cars, self.__class__.max_num_cars) ac.addOnValueChangeListener(self.spin_num_cars, self.on_spin_num_cars_changed) y += 70 self.spin_num_laps = ac.addSpinner(self.window.app, "Number laps stint mode") ac.setRange(self.spin_num_laps, 0, 28) ac.setPosition(self.spin_num_laps, 20, y) ac.setValue(self.spin_num_laps, self.__class__.max_num_laps_stint) ac.addOnValueChangeListener(self.spin_num_laps, self.on_spin_num_laps_changed) y += 70 self.spin_row_height = ac.addSpinner(self.window.app, "Row height") ac.setRange(self.spin_row_height, 20, 80) ac.setPosition(self.spin_row_height, 20, y) ac.setValue(self.spin_row_height, self.__class__.ui_row_height) ac.addOnValueChangeListener(self.spin_row_height, self.on_spin_row_height_changed) # Names mode y += 70 self.spin_names = ac.addSpinner(self.window.app, "Names :") ac.setRange(self.spin_names, 0, 4) ac.setPosition(self.spin_names, 20, y) ac.setValue(self.spin_names, self.__class__.names) ac.addOnValueChangeListener(self.spin_names, self.on_spin_names_changed) self.lbl_names = Label(self.window.app, "TLC") \ .setSize(120, 26).setPos(150, y - 28) \ .setFontSize(12).setAlign("left") \ .setVisible(1) # Refresh rate y += 70 self.spin_refresh_rate = ac.addSpinner(self.window.app, "Refresh rate / sec") ac.setRange(self.spin_refresh_rate, 20, 120) ac.setPosition(self.spin_refresh_rate, 20, y) ac.setValue(self.spin_refresh_rate, self.__class__.refresh_rate) ac.addOnValueChangeListener(self.spin_refresh_rate, self.on_spin_refresh_rate_changed) y += 52 self.chk_invalidated = ac.addCheckBox(self.window.app, "") ac.setPosition(self.chk_invalidated, 20, y) ac.addOnCheckBoxChanged(self.chk_invalidated, self.on_check_invalidated_changed) self.lbl_title_invalidated = Label(self.window.app, "Lap can be invalidated")\ .setSize(200, 26).setPos(65, y + 1)\ .setFontSize(16).setAlign("left")\ .setVisible(1) y += 33 self.chk_force_info = ac.addCheckBox(self.window.app, "") ac.setPosition(self.chk_force_info, 20, y) ac.addOnCheckBoxChanged(self.chk_force_info, self.on_check_force_info_changed) self.lbl_title_force_info = Label(self.window.app, "Info always visible")\ .setSize(200, 26).setPos(65, y + 1)\ .setFontSize(16).setAlign("left")\ .setVisible(1) # --------- Theme RGB ---------- y = 50 # General theme : 0-Dark 1-white self.spin_general_theme = ac.addSpinner(self.window.app, "Theme :") ac.setRange(self.spin_general_theme, 0, len(Colors.theme_files)) ac.setPosition(self.spin_general_theme, 20, y) ac.setValue(self.spin_general_theme, 0) ac.addOnValueChangeListener(self.spin_general_theme, self.on_spin_general_theme_changed) ac.setVisible(self.spin_general_theme, 0) self.lbl_general_theme = Label(self.window.app, "Dark").setSize(120, 26).setPos(152, y - 28).setFontSize( 12).setAlign("left").setVisible(0) # Font y += 70 self.spin_font = ac.addSpinner(self.window.app, "Font :") ac.setRange(self.spin_font, 0, len(Font.font_files)) ac.setPosition(self.spin_font, 20, y) ac.setValue(self.spin_font, Font.current) ac.addOnValueChangeListener(self.spin_font, self.on_spin_font_changed) ac.setVisible(self.spin_font, 0) self.lbl_font = Label(self.window.app, "Default").setSize(120, 26).setPos(148, y - 28).setFontSize( 12).setAlign("left").setVisible(0) y += 70 self.spin_theme_red = ac.addSpinner(self.window.app, "Red") ac.setRange(self.spin_theme_red, 0, 255) ac.setPosition(self.spin_theme_red, 20, y) ac.setValue(self.spin_theme_red, self.__class__.theme_red) ac.addOnValueChangeListener(self.spin_theme_red, self.on_red_changed) y += 70 self.spin_theme_green = ac.addSpinner(self.window.app, "Green") ac.setRange(self.spin_theme_green, 0, 255) ac.setPosition(self.spin_theme_green, 20, y) ac.setValue(self.spin_theme_green, self.__class__.theme_green) ac.addOnValueChangeListener(self.spin_theme_green, self.on_green_changed) y += 70 self.spin_theme_blue = ac.addSpinner(self.window.app, "Blue") ac.setRange(self.spin_theme_blue, 0, 255) ac.setPosition(self.spin_theme_blue, 20, y) ac.setValue(self.spin_theme_blue, self.__class__.theme_blue) ac.addOnValueChangeListener(self.spin_theme_blue, self.on_blue_changed) ac.setVisible(self.spin_theme_red, 0) ac.setVisible(self.spin_theme_green, 0) ac.setVisible(self.spin_theme_blue, 0) # byClass y += 70 self.spin_colors_by = ac.addSpinner(self.window.app, "Car colors by :") ac.setRange(self.spin_colors_by, 0, 1) ac.setPosition(self.spin_colors_by, 20, y) ac.setValue(self.spin_colors_by, self.__class__.carColorsBy) ac.addOnValueChangeListener(self.spin_colors_by, self.on_spin_colors_by_changed) ac.setVisible(self.spin_colors_by, 0) self.lbl_colors_by = Label(self.window.app, "Brand").setSize(120, 26).setPos(178, y - 28).setFontSize( 12).setAlign("left").setVisible(0) # Border direction - Horizontal vertical none y += 70 self.spin_border_direction = ac.addSpinner(self.window.app, "Border direction :") ac.setRange(self.spin_border_direction, 0, 1) ac.setPosition(self.spin_border_direction, 20, y) ac.setValue(self.spin_border_direction, 0) ac.addOnValueChangeListener(self.spin_border_direction, self.on_spin_border_direction_changed) ac.setVisible(self.spin_border_direction, 0) self.lbl_border_direction = Label(self.window.app, "Horizontal").setSize(120, 26).setPos(192, y - 28).setFontSize( 12).setAlign("left").setVisible(0) self.cfg_loaded = False self.cfg = Config("apps/python/prunn/", "config.ini") self.load_cfg() # thread self.key_listener = threading.Thread(target=self.listen_key) self.key_listener.daemon = True self.key_listener.start()
def load_cfg(self): self.__class__.lapCanBeInvalidated = self.cfg.get("SETTINGS", "lap_can_be_invalidated", "int") if self.__class__.lapCanBeInvalidated == -1: self.__class__.lapCanBeInvalidated = 1 self.__class__.forceInfoVisible = self.cfg.get("SETTINGS", "force_info_visible", "int") if self.__class__.forceInfoVisible == -1: self.__class__.forceInfoVisible = 0 self.__class__.max_num_cars = self.cfg.get("SETTINGS", "num_cars_tower", "int") if self.__class__.max_num_cars == -1: self.__class__.max_num_cars = 10 self.__class__.max_num_laps_stint = self.cfg.get("SETTINGS", "num_laps_stint", "int") if self.__class__.max_num_laps_stint == -1: self.__class__.max_num_laps_stint = 8 self.__class__.ui_row_height = self.cfg.get("SETTINGS", "ui_row_height", "int") if self.__class__.ui_row_height == -1: user32 = ctypes.windll.user32 window_height = user32.GetSystemMetrics(1) if window_height >= 2000: # 4k self.__class__.ui_row_height = 72 elif window_height >= 1400: # 2k self.__class__.ui_row_height = 54 else: # 1080p self.__class__.ui_row_height = 36 self.__class__.race_mode = self.cfg.get("SETTINGS", "race_mode", "int") if self.__class__.race_mode == -1: self.__class__.race_mode = 1 self.__class__.qual_mode = self.cfg.get("SETTINGS", "qual_mode", "int") if self.__class__.qual_mode == -1: self.__class__.qual_mode = 0 self.__class__.names = self.cfg.get("SETTINGS", "names", "int") if self.__class__.names == -1: self.__class__.names = 0 self.__class__.refresh_rate = self.cfg.get("SETTINGS", "refresh_rate", "int") if self.__class__.refresh_rate == -1: self.__class__.refresh_rate = 50 Label.refresh_rate = self.__class__.refresh_rate # RGB self.__class__.theme_red = self.cfg.get("SETTINGS", "red", "int") if self.__class__.theme_red == -1: self.__class__.theme_red = 191 self.__class__.theme_green = self.cfg.get("SETTINGS", "green", "int") if self.__class__.theme_green == -1: self.__class__.theme_green = 0 self.__class__.theme_blue = self.cfg.get("SETTINGS", "blue", "int") if self.__class__.theme_blue == -1: self.__class__.theme_blue = 0 self.__class__.carColorsBy = self.cfg.get("SETTINGS", "car_colors_by", "int") if self.__class__.carColorsBy == -1: self.__class__.carColorsBy = 0 font_ini = self.cfg.get("SETTINGS", "font_ini", "string") if font_ini != -1: Font.font_ini = font_ini else: Font.font_ini = '' if Font.font_ini != '' and len(Font.font_files): # font number from ini for i in range(0, len(Font.font_files)): if Font.font_files[i]['file'] == Font.font_ini: Font.set_font(i + 1) break else: font = self.cfg.get("SETTINGS", "font", "int") if font == -1 or font > len(Font.font_files) - 1: font = 2 # Open Sans Font.set_font(font) theme_ini = self.cfg.get("SETTINGS", "theme_ini", "string") if theme_ini != -1: Colors.theme_ini = theme_ini else: Colors.theme_ini = '' if Colors.theme_ini != '' and len(Colors.theme_files): # Get_theme number from ini for i in range(0, len(Colors.theme_files)): if Colors.theme_files[i]['file'] == Colors.theme_ini: Colors.general_theme = i + 1 break else: general_theme = self.cfg.get("SETTINGS", "general_theme", "int") if general_theme >= 0: Colors.general_theme = general_theme border_direction = self.cfg.get("SETTINGS", "border_direction", "int") if border_direction >= 0: Colors.border_direction = border_direction ac.setValue(self.spin_race_mode, self.__class__.race_mode) ac.setValue(self.spin_qual_mode, self.__class__.qual_mode) ac.setValue(self.spin_names, self.__class__.names) ac.setValue(self.spin_refresh_rate, self.__class__.refresh_rate) ac.setValue(self.spin_num_cars, self.__class__.max_num_cars) ac.setValue(self.spin_num_laps, self.__class__.max_num_laps_stint) ac.setValue(self.spin_row_height, self.__class__.ui_row_height) ac.setValue(self.chk_invalidated, self.__class__.lapCanBeInvalidated) ac.setValue(self.chk_force_info, self.__class__.forceInfoVisible) ac.setValue(self.spin_theme_red, self.__class__.theme_red) ac.setValue(self.spin_theme_green, self.__class__.theme_green) ac.setValue(self.spin_theme_blue, self.__class__.theme_blue) ac.setValue(self.spin_colors_by, self.__class__.carColorsBy) ac.setValue(self.spin_font, Font.current) ac.setValue(self.spin_general_theme, Colors.general_theme) ac.setValue(self.spin_border_direction, Colors.border_direction) self.set_labels() self.cfg_loaded = True
def value(self, value: float): if self.range[0] <= value <= self.range[1]: self._value = value if self.has_id: ac.setValue(self.id, value)
def __init__(self): self.session = Value(-1) self.listen_active = True self.window = Window(name="ACTV Config", icon=True, width=251, height=480, texture="").setBgOpacity(0.6) y = 60 self.spin_race_mode = ac.addSpinner(self.window.app, "Race tower mode :") ac.setRange(self.spin_race_mode, 0, 2) ac.setPosition(self.spin_race_mode, 20, y) ac.setValue(self.spin_race_mode, self.__class__.race_mode) ac.addOnValueChangeListener(self.spin_race_mode, self.onSpinRaceModeChanged) self.lbl_race_mode = ( Label(self.window.app, "Auto") .setSize(120, 26) .setPos(186, y - 28) .setFontSize(12) .setAlign("left") .setVisible(1) ) y += 80 self.spin_qual_mode = ac.addSpinner(self.window.app, "Qual tower mode :") ac.setRange(self.spin_qual_mode, 0, 1) ac.setPosition(self.spin_qual_mode, 20, y) ac.setValue(self.spin_qual_mode, self.__class__.qual_mode) ac.addOnValueChangeListener(self.spin_qual_mode, self.onSpinQualModeChanged) self.lbl_qual_mode = ( Label(self.window.app, "Gaps") .setSize(120, 26) .setPos(186, y - 28) .setFontSize(12) .setAlign("left") .setVisible(1) ) y += 80 self.spin_num_cars = ac.addSpinner(self.window.app, "Number cars tower") ac.setRange(self.spin_num_cars, 6, 28) ac.setPosition(self.spin_num_cars, 20, y) ac.setValue(self.spin_num_cars, self.__class__.max_num_cars) ac.addOnValueChangeListener(self.spin_num_cars, self.onSpinNumCarsChanged) y += 80 self.spin_num_laps = ac.addSpinner(self.window.app, "Number laps stint mode") ac.setRange(self.spin_num_laps, 2, 28) ac.setPosition(self.spin_num_laps, 20, y) ac.setValue(self.spin_num_laps, self.__class__.max_num_laps_stint) ac.addOnValueChangeListener(self.spin_num_laps, self.onSpinNumLapsChanged) y += 80 self.spin_row_height = ac.addSpinner(self.window.app, "Row height") ac.setRange(self.spin_row_height, 20, 48) ac.setPosition(self.spin_row_height, 20, y) ac.setValue(self.spin_row_height, self.__class__.ui_row_height) ac.addOnValueChangeListener(self.spin_row_height, self.onSpinRowHeightChanged) y += 60 self.chk_invalidated = ac.addCheckBox(self.window.app, "") ac.setPosition(self.chk_invalidated, 20, y) ac.addOnCheckBoxChanged(self.chk_invalidated, self.onCheckInvalidatedChanged) self.lbl_title_invalidated = ( Label(self.window.app, "Lap can be invalidated") .setSize(200, 26) .setPos(65, y + 1) .setFontSize(16) .setAlign("left") .setVisible(1) ) self.cfg_loaded = False self.cfg = Config("apps/python/prunn/", "config.ini") self.loadCFG() # thread self.key_listener = threading.Thread(target=self.listen_key) self.key_listener.daemon = True self.key_listener.start()
def FillEvent(name, state): global FuelSelection, FuelMax ac.setValue(FuelSelection, int(FuelMax)) FuelEvent(1)
def __init__(self): self.visual_timeout = -1 self.session = Value(-1) self.listen_active = True Colors.load_themes() Font.load_fonts() self.window = Window(name="ACTV CP Config", icon=False, width=251, height=570, texture="").setBgOpacity(0) y = 50 self.spin_race_mode = ac.addSpinner(self.window.app, "Race tower mode :") ac.setRange(self.spin_race_mode, 0, 8) ac.setPosition(self.spin_race_mode, 20, y) ac.setValue(self.spin_race_mode, self.__class__.race_mode) ac.addOnValueChangeListener(self.spin_race_mode, self.on_spin_race_mode_changed) self.lbl_race_mode = Label(self.window.app, "Auto")\ .setSize(120, 26).setPos(186, y - 28)\ .setFontSize(12).setAlign("left")\ .setVisible(1) y += 70 self.spin_qual_mode = ac.addSpinner(self.window.app, "Qual tower mode :") ac.setRange(self.spin_qual_mode, 0, 4) ac.setPosition(self.spin_qual_mode, 20, y) ac.setValue(self.spin_qual_mode, self.__class__.qual_mode) ac.addOnValueChangeListener(self.spin_qual_mode, self.on_spin_qual_mode_changed) self.lbl_qual_mode = Label(self.window.app, "Gaps")\ .setSize(120, 26).setPos(186, y - 28)\ .setFontSize(12).setAlign("left")\ .setVisible(1) y += 70 self.spin_num_cars = ac.addSpinner(self.window.app, "Number cars tower") ac.setRange(self.spin_num_cars, 6, 80) ac.setPosition(self.spin_num_cars, 20, y) ac.setValue(self.spin_num_cars, self.__class__.max_num_cars) ac.addOnValueChangeListener(self.spin_num_cars, self.on_spin_num_cars_changed) y += 70 self.spin_row_height = ac.addSpinner(self.window.app, "Row height") ac.setRange(self.spin_row_height, 26, 80) ac.setPosition(self.spin_row_height, 20, y) ac.setValue(self.spin_row_height, self.__class__.ui_row_height) ac.addOnValueChangeListener(self.spin_row_height, self.on_spin_row_height_changed) # Names mode y += 70 self.spin_names = ac.addSpinner(self.window.app, "Names :") ac.setRange(self.spin_names, 0, 4) ac.setPosition(self.spin_names, 20, y) ac.setValue(self.spin_names, self.__class__.names) ac.addOnValueChangeListener(self.spin_names, self.on_spin_names_changed) self.lbl_names = Label(self.window.app, "TLC") \ .setSize(120, 26).setPos(150, y - 28) \ .setFontSize(12).setAlign("left") \ .setVisible(1) # Refresh rate y += 70 self.spin_refresh_rate = ac.addSpinner(self.window.app, "Refresh rate / sec") ac.setRange(self.spin_refresh_rate, 20, 120) ac.setPosition(self.spin_refresh_rate, 20, y) ac.setValue(self.spin_refresh_rate, self.__class__.refresh_rate) ac.addOnValueChangeListener(self.spin_refresh_rate, self.on_spin_refresh_rate_changed) y += 52 self.chk_force_info = ac.addCheckBox(self.window.app, "") ac.setPosition(self.chk_force_info, 20, y) ac.addOnCheckBoxChanged(self.chk_force_info, self.on_check_force_info_changed) self.lbl_title_force_info = Label(self.window.app, "Info always visible")\ .setSize(200, 26).setPos(65, y + 1)\ .setFontSize(16).setAlign("left")\ .setVisible(1) y += 33 self.chk_save_delta = ac.addCheckBox(self.window.app, "") ac.setPosition(self.chk_save_delta, 20, y) ac.addOnCheckBoxChanged(self.chk_save_delta, self.on_check_save_delta_changed) self.lbl_title_save_delta = Label(self.window.app, "Save delta between sessions")\ .setSize(200, 26).setPos(65, y + 3)\ .setFontSize(14).setAlign("left")\ .setVisible(1) y += 33 self.chk_show_tires = ac.addCheckBox(self.window.app, "") ac.setPosition(self.chk_show_tires, 20, y) ac.addOnCheckBoxChanged(self.chk_show_tires, self.on_check_show_tires_changed) self.lbl_title_show_tires = Label(self.window.app, "Show tires (tower)")\ .setSize(200, 26).setPos(65, y + 3)\ .setFontSize(14).setAlign("left")\ .setVisible(1) self.cfg_loaded = False self.cfg = Config(Colors.app_path, "config.ini") self.load_cfg() # thread self.key_listener = threading.Thread(target=self.listen_key) self.key_listener.daemon = True self.key_listener.start()
def __init__(self): self.window = Window(name="ACTV Delta", icon=False, width=240, height=246, texture="") self.cursor = Value(False) self.session = Value(-1) self.performance = Value(0) self.performance_session = Value(0) self.spline = Value(0) self.laptime = Value(0) self.TimeLeftUpdate = Value(0) self.referenceLap = [] self.referenceLap_session = [] self.referenceLapTime = Value(0) self.referenceLapTime_session = Value(0) self.lastLapTime = Value(0) self.lapCount = 0 self.lastLapIsValid = True self.currentLap = [] self.deltaLoaded = False self.thread_save = False self.highlight_end = 0 self.rowHeight = Value(-1) self.lbl_delta = Label(self.window.app, "+0.000")\ .set(w=150, h=36, x=0, y=60, font_size=26, align="right", visible=1) self.lbl_session_delta = Label(self.window.app, "+0.000")\ .set(w=150, h=36, x=0, y=40, font_size=14, align="right", visible=1) self.lbl_lap = Label(self.window.app, "0.000")\ .set(w=150, h=32, x=0, y=80, font_size=17, align="right", visible=1) self.btn_reset = Button(self.window.app, self.on_reset_press)\ .setPos(90, 68).setSize(60, 20)\ .setText("Reset")\ .setAlign("center")\ .setBgColor(rgb([255, 12, 12], bg=True))\ .setVisible(0) self.spin_row_height = ac.addSpinner(self.window.app, "") ac.setRange(self.spin_row_height, 20, 70) ac.setPosition(self.spin_row_height, 20, 28) ac.setValue(self.spin_row_height, self.__class__.ui_row_height) ac.addOnValueChangeListener(self.spin_row_height, self.on_spin_row_height_changed) ac.setVisible(self.spin_row_height, 0) font_name = "Segoe UI" if ac.initFont(0, font_name, 0, 0) > 0: self.lbl_delta.setFont(font_name, 0, 1) self.lbl_session_delta.setFont(font_name, 0, 1) self.cfg = Config("apps/python/prunn/", "config.ini") self.load_cfg()
def loadCFG(self): self.__class__.ui_row_height = self.cfg.get("DELTA", "delta_row_height", "int") ac.setValue(self.spin_row_height, self.__class__.ui_row_height) self.reDrawSize()
def percent(self, value): self._percent = value/100 # need to be 0.0 <= value <= 1.0 ac.setValue(self.id, self._percent)
def acMain(ac_version): global appWindow global sound_player, SoundPackSpinner, VolumeSpinner global Beforerace, Overtake, Suspense, Win, Lose, labeldesc, Hotlap global StatusLabel, NotificationLabel, audio, audiolist, BeforeraceLabel, OvertakeLabel, SuspenseLabel global WinLabel, LoseLabel, audiolabel, position, debuglabel # DEBUG INFO global enable_overtake, enable_lose, enable_win, enable_hotlap global enable_before_race, enable_suspense, suspense_laps, log global audio, overtake, position, newposition, start_time, finish_time, count_overtake global session, sessionTime, numberOfLaps, completedLaps appWindow = ac.newApp("Epic Race") ac.setSize(appWindow, 430, 350) ac.setTitle(appWindow, "Epic Race") ac.setBackgroundOpacity(appWindow, 0.5) ac.drawBorder(appWindow, 0) # SoundPackSpinner = ac.addSpinner(appWindow, "") ac.setFontColor(SoundPackSpinner, 1, 1, 1, 1) ac.setFontSize(SoundPackSpinner, 12) spinner_config(SoundPackSpinner, 10, 55, 80, 18, 0, 1, 10, 0, onSoundPackChanged) # VolumeSpinner = ac.addSpinner(appWindow, "") ac.setFontColor(VolumeSpinner, 1, 1, 1, 1) ac.setFontSize(VolumeSpinner, 12) spinner_config(VolumeSpinner, 10, 105, 80, 18, 0, 1, 100, audio_volume, onVolumeChanged) # audiolabel = ac.addLabel(appWindow, "") ac.setPosition(audiolabel, 10, 30) ac.setFontColor(audiolabel, 1, 1, 1, 1) ac.setFontSize(audiolabel, 15) # volumelabel = ac.addLabel(appWindow, "Volume") ac.setPosition(volumelabel, 10, 80) ac.setFontColor(volumelabel, 1, 1, 1, 1) ac.setFontSize(volumelabel, 15) Beforerace = ac.addCheckBox(appWindow, "") ac.setValue(Beforerace, enable_before_race) ac.setPosition(Beforerace, 10, 130) ac.setSize(Beforerace, 20, 20) ac.drawBorder(Beforerace, 1) ac.addOnCheckBoxChanged(Beforerace, onEnableBeforeRace) # Overtake = ac.addCheckBox(appWindow, "") ac.setValue(Overtake, enable_overtake) ac.setPosition(Overtake, 10, 160) ac.setSize(Overtake, 20, 20) ac.drawBorder(Overtake, 1) ac.addOnCheckBoxChanged(Overtake, onEnableOverTake) # Suspense = ac.addCheckBox(appWindow, "") ac.setValue(Suspense, enable_suspense) ac.setPosition(Suspense, 10, 190) ac.setSize(Suspense, 20, 20) ac.drawBorder(Suspense, 1) ac.addOnCheckBoxChanged(Suspense, onEnableSuspense) # Win = ac.addCheckBox(appWindow, "") ac.setValue(Win, enable_win) ac.setPosition(Win, 10, 220) ac.setSize(Win, 20, 20) ac.drawBorder(Win, 1) ac.addOnCheckBoxChanged(Win, onEnableWin) # Lose = ac.addCheckBox(appWindow, "") ac.setValue(Lose, enable_lose) ac.setPosition(Lose, 10, 250) ac.setSize(Lose, 20, 20) ac.drawBorder(Lose, 1) ac.addOnCheckBoxChanged(Lose, onEnableLose) # Hotlap = ac.addCheckBox(appWindow, "") ac.setValue(Hotlap, enable_hotlap) ac.setPosition(Hotlap, 10, 280) ac.setSize(Hotlap, 20, 20) ac.drawBorder(Hotlap, 1) ac.addOnCheckBoxChanged(Hotlap, onEnableHotlap) # BeforeraceLabel = ac.addLabel(appWindow, "Enable before race") ac.setPosition(BeforeraceLabel, 40, 130) ac.setFontColor(BeforeraceLabel, 1, 1, 1, 1) ac.setFontSize(BeforeraceLabel, 15) # OvertakeLabel = ac.addLabel(appWindow, "Enable overtake") ac.setPosition(OvertakeLabel, 40, 160) ac.setFontColor(OvertakeLabel, 1, 1, 1, 1) ac.setFontSize(OvertakeLabel, 15) # SuspenseLabel = ac.addLabel(appWindow, "Enable suspense") ac.setPosition(SuspenseLabel, 40, 190) ac.setFontColor(SuspenseLabel, 1, 1, 1, 1) ac.setFontSize(SuspenseLabel, 15) # WinLabel = ac.addLabel(appWindow, "Enable win") ac.setPosition(WinLabel, 40, 220) ac.setFontColor(WinLabel, 1, 1, 1, 1) ac.setFontSize(WinLabel, 15) # LoseLabel = ac.addLabel(appWindow, "Enable lose") ac.setPosition(LoseLabel, 40, 250) ac.setFontColor(LoseLabel, 1, 1, 1, 1) ac.setFontSize(LoseLabel, 15) # HotlapLabel = ac.addLabel(appWindow, "Enable hotlap") ac.setPosition(HotlapLabel, 40, 280) ac.setFontColor(HotlapLabel, 1, 1, 1, 1) ac.setFontSize(HotlapLabel, 15) # labeldesc = ac.addLabel(appWindow, "Something is broken") ac.setPosition(labeldesc, 180, 40) ac.setSize(labeldesc, 200, 200) # StatusLabel = ac.addLabel(appWindow, Status) ac.setPosition(StatusLabel, 10, 305) ac.setFontColor(StatusLabel, 1, 1, 1, 1) ac.setFontSize(StatusLabel, 15) # NotificationLabel = ac.addLabel(appWindow, Notify) ac.setPosition(NotificationLabel, 10, 325) ac.setFontColor(NotificationLabel, 1, 1, 1, 1) ac.setFontSize(NotificationLabel, 12) ac.setSize(NotificationLabel, 24, 310) # # DEBUG INFO # debuglabel = ac.addLabel(appWindow, "") ac.setPosition(debuglabel, 215, 30) ac.setSize(debuglabel, 200, 200) # # # box.FModSystem.init() sound_player = box.SoundPlayer(box.FModSystem) sound_player.set_volume(audio_volume / 100) sound_player.set_gain(2.0) audiolist = os.listdir(os.path.join(os.path.dirname(__file__), "SoundPacks")) ac.setRange(SoundPackSpinner, 0, len(audiolist) - 1) ac.setStep(SoundPackSpinner, 1) ac.setValue(SoundPackSpinner, audiolist.index(audio)) getNotification() if AutoUpdate: CheckNewUpdate() position = ac.getCarRealTimeLeaderboardPosition(0) return "EpicRace"
def sValue(self, value): return ac.setValue(self.dt, value)
def loadCFG(self): self.__class__.lapCanBeInvalidated = self.cfg.get("SETTINGS", "lap_can_be_invalidated", "int") if self.__class__.lapCanBeInvalidated == -1: self.__class__.lapCanBeInvalidated = 1 self.__class__.max_num_cars = self.cfg.get("SETTINGS", "num_cars_tower", "int") if self.__class__.max_num_cars == -1: self.__class__.max_num_cars = 18 self.__class__.max_num_laps_stint = self.cfg.get("SETTINGS", "num_laps_stint", "int") if self.__class__.max_num_laps_stint == -1: self.__class__.max_num_laps_stint = 8 self.__class__.ui_row_height = self.cfg.get("SETTINGS", "ui_row_height", "int") if self.__class__.ui_row_height == -1: self.__class__.ui_row_height = 36 self.__class__.race_mode = self.cfg.get("SETTINGS", "race_mode", "int") if self.__class__.race_mode == -1: self.__class__.race_mode = 0 self.__class__.qual_mode = self.cfg.get("SETTINGS", "qual_mode", "int") if self.__class__.qual_mode == -1: self.__class__.qual_mode = 0 ac.setValue(self.spin_race_mode, self.__class__.race_mode) ac.setValue(self.spin_qual_mode, self.__class__.qual_mode) ac.setValue(self.spin_num_cars, self.__class__.max_num_cars) ac.setValue(self.spin_num_laps, self.__class__.max_num_laps_stint) ac.setValue(self.spin_row_height, self.__class__.ui_row_height) ac.setValue(self.chk_invalidated, self.__class__.lapCanBeInvalidated) self.setLabelQual() self.setLabelRace() self.cfg_loaded = True
def load_cfg(self): self.__class__.ui_row_height = self.cfg.get("DELTA", "delta_row_height", "int") ac.setValue(self.spin_row_height, self.__class__.ui_row_height) self.redraw_size()
def load_cfg(self): self.__class__.forceInfoVisible = self.cfg.get("SETTINGS", "force_info_visible", "int") if self.__class__.forceInfoVisible == -1: self.__class__.forceInfoVisible = 0 self.__class__.save_delta = self.cfg.get("SETTINGS", "save_delta", "int") if self.__class__.save_delta == -1: self.__class__.save_delta = 1 self.__class__.show_tires = self.cfg.get("SETTINGS", "show_tires", "int") if self.__class__.show_tires == -1: self.__class__.show_tires = 1 self.__class__.info_picture_width = self.cfg.get( "SETTINGS", "info_picture_width", "int") if self.__class__.info_picture_width == -1: self.__class__.info_picture_width = 300 self.__class__.info_picture_height = self.cfg.get( "SETTINGS", "info_picture_height", "int") if self.__class__.info_picture_height == -1: self.__class__.info_picture_height = 300 self.__class__.max_num_cars = self.cfg.get("SETTINGS", "num_cars_tower", "int") if self.__class__.max_num_cars == -1: self.__class__.max_num_cars = 10 self.__class__.ui_row_height = self.cfg.get("SETTINGS", "ui_row_height", "int") if self.__class__.ui_row_height == -1: user32 = ctypes.windll.user32 window_height = user32.GetSystemMetrics(1) if window_height >= 2000: # 4k self.__class__.ui_row_height = 76 elif window_height >= 1400: # 2k self.__class__.ui_row_height = 57 else: # 1080p self.__class__.ui_row_height = 38 self.__class__.race_mode = self.cfg.get("SETTINGS", "race_mode", "int") if self.__class__.race_mode == -1: self.__class__.race_mode = 1 self.__class__.qual_mode = self.cfg.get("SETTINGS", "qual_mode", "int") if self.__class__.qual_mode == -1: self.__class__.qual_mode = 0 self.__class__.names = self.cfg.get("SETTINGS", "names", "int") if self.__class__.names == -1: self.__class__.names = 3 self.__class__.refresh_rate = self.cfg.get("SETTINGS", "refresh_rate", "int") if self.__class__.refresh_rate == -1: self.__class__.refresh_rate = 50 Label.refresh_rate = self.__class__.refresh_rate #font_ini = self.cfg.get("SETTINGS", "font_ini", "string") font_ini = Colors.app_path + "fonts/actvcpbold.ini" if font_ini != -1: Font.font_ini = font_ini else: Font.font_ini = '' if Font.font_ini != '' and len(Font.font_files): # font number from ini for i in range(0, len(Font.font_files)): if Font.font_files[i]['file'] == Font.font_ini: Font.set_font(i + 1) break else: font = self.cfg.get("SETTINGS", "font", "int") if font == -1 or font > len(Font.font_files) - 1: font = 2 # Open Sans Font.set_font(font) Colors.theme_ini = theme_ini = Colors.app_path + 'themes/cp.ini' #theme_ini = self.cfg.get("SETTINGS", "theme_ini", "string") if theme_ini != -1: Colors.theme_ini = theme_ini else: Colors.theme_ini = '' if Colors.theme_ini != '' and len(Colors.theme_files): # Get_theme number from ini for i in range(0, len(Colors.theme_files)): if Colors.theme_files[i]['file'] == Colors.theme_ini: Colors.general_theme = i + 1 break else: general_theme = self.cfg.get("SETTINGS", "general_theme", "int") if general_theme >= 0: Colors.general_theme = general_theme ac.setValue(self.spin_race_mode, self.__class__.race_mode) ac.setValue(self.spin_qual_mode, self.__class__.qual_mode) ac.setValue(self.spin_names, self.__class__.names) ac.setValue(self.spin_refresh_rate, self.__class__.refresh_rate) ac.setValue(self.spin_num_cars, self.__class__.max_num_cars) ac.setValue(self.spin_row_height, self.__class__.ui_row_height) ac.setValue(self.chk_force_info, self.__class__.forceInfoVisible) ac.setValue(self.chk_save_delta, self.__class__.save_delta) ac.setValue(self.chk_show_tires, self.__class__.show_tires) self.set_labels() self.cfg_loaded = True
def create_ui_components(): global appWindow global spinner_ballast, spinner_restrictor, spinner_smoothing, spinner_nonlinearity, spinner_calculation_interval, spinner_posting_interval global label_names, label_track_progress, label_penalties, label_last_message x_margin = 10 y_margin = 80 spacing = 16 # Spinners spinner_ballast = ac.addSpinner(appWindow, "Max. ballast penalty (kg)") ac.setRange(spinner_ballast, 0, 5000) ac.setStep(spinner_ballast, 500) ac.setValue(spinner_ballast, 600) spinner_restrictor = ac.addSpinner(appWindow, "Max. restrictor penalty (pct.)") ac.setRange(spinner_restrictor, 0, 100) ac.setStep(spinner_restrictor, 10) ac.setValue(spinner_restrictor, 100) spinner_smoothing = ac.addSpinner(appWindow, "Smoothing (pct. of track)") ac.setRange(spinner_smoothing, 0, 100) ac.setStep(spinner_smoothing, 5) ac.setValue(spinner_smoothing, 10) spinner_nonlinearity = ac.addSpinner(appWindow, "Non-linearity") ac.setRange(spinner_nonlinearity, 1, 5) ac.setStep(spinner_nonlinearity, 1) ac.setValue(spinner_nonlinearity, 3) spinner_calculation_interval = ac.addSpinner(appWindow, "Calculation interval (ms)") ac.setRange(spinner_calculation_interval, 500, 5000) ac.setStep(spinner_calculation_interval, 500) ac.setValue(spinner_calculation_interval, 1000) spinner_posting_interval = ac.addSpinner(appWindow, "Posting interval (ms)") ac.setRange(spinner_posting_interval, 1000, 20000) ac.setStep(spinner_posting_interval, 100) ac.setValue(spinner_posting_interval, 1500) # Text output label_names = ac.addLabel(appWindow, "Driver names: {}".format(DRIVER_NAMES)) ac.setFontSize(label_names, 10) label_track_progress = ac.addLabel(appWindow, "Track progresses:") ac.setFontSize(label_track_progress, 10) label_penalties = ac.addLabel(appWindow, "Penalty percentages:") ac.setFontSize(label_penalties, 10) label_last_message = ac.addLabel(appWindow, "Last message posted:") ac.setFontSize(label_last_message, 10) # Component positions ac.setPosition(spinner_ballast, x_margin, y_margin + (spacing * 0)) ac.setPosition(spinner_restrictor, x_margin, y_margin + (spacing * 5)) ac.setPosition(spinner_smoothing, x_margin, y_margin + (spacing * 10)) ac.setPosition(spinner_nonlinearity, x_margin, y_margin + (spacing * 15)) ac.setPosition(spinner_calculation_interval, x_margin, y_margin + (spacing * 20)) ac.setPosition(spinner_posting_interval, x_margin, y_margin + (spacing * 25)) ac.setPosition(label_names, x_margin, y_margin + (spacing * 30)) ac.setPosition(label_track_progress, x_margin, y_margin + (spacing * 31)) ac.setPosition(label_penalties, x_margin, y_margin + (spacing * 32)) ac.setPosition(label_last_message, x_margin, y_margin + (spacing * 33))