'debug_items': 0,
'mouse_coords': 0,
'fps': 0,
- 'editor': 0,
+ 'editor': 1,
'auto_start_editor': 0}}
opt_path = LogicsTools.platform_specific_path(data_path + '/' + optfile) if data_path else optfile
opt_exists = exists(opt_path)
class Inspector(DirectObject):
- def __init__(self, item, all_items, pos_mgr):
+ def __init__(self, item, all_items, pos_mgr, strategy_items):
super().__init__()
self.__item = item
self.__all_items = all_items
t, restitution_entry = self.__add_row('restitution', _('restitution'), f'{round(restitution, 3)}', self.on_edit_restitution, _('restitution (default 0.5)'))
t, friction_entry = self.__add_row('friction', _('friction'), f'{round(f, 3)}', self.on_edit_friction, _('friction (default 0.5)'))
t, id_entry = self.__add_row('id', _('id'), _id, self.on_edit_id, _('id of the item (for the strategies)'))
- item_modules = glob('pmachines/items/*.py')
- item_modules = [basename(i)[:-3] for i in item_modules]
- strategy_items = ['']
- for item_module in item_modules:
- mod_name = 'pmachines.items.' + item_module
- for member in import_module(mod_name).__dict__.values():
- if isclass(member) and issubclass(member, ItemStrategy) and \
- member != ItemStrategy:
- strategy_items = list(set(strategy_items + [member.__name__]))
- t, strategy_entry = self.__add_row_option(_('strategy'), _strategy, strategy_items, self.on_edit_strategy, _('the strategy of the item'))
+ # item_modules = glob('pmachines/items/*.py')
+ # item_modules = [basename(i)[:-3] for i in item_modules]
+ # strategy_items = ['']
+ # for item_module in item_modules:
+ # mod_name = 'pmachines.items.' + item_module
+ # for member in import_module(mod_name).__dict__.values():
+ # if isclass(member) and issubclass(member, ItemStrategy) and \
+ # member != ItemStrategy:
+ # strategy_items = list(set(strategy_items + [member.__name__]))
+ strategy_names = [s.__name__ for s in strategy_items]
+ t, strategy_entry = self.__add_row_option(_('strategy'), _strategy, strategy_names, self.on_edit_strategy, _('the strategy of the item'))
def strategy_set(comps):
- strategy_labels = [f'inspector_strategy_{i.lower()}' for i in strategy_items]
+ strategy_labels = [f'inspector_strategy_{i.lower()}' for i in strategy_names]
for i in strategy_labels:
if i in self.__pos_mgr:
del self.__pos_mgr[i]
from ya2.utils.gfx import Point, DirectGuiMixin
from pmachines.editor.augmented_frame import AugmentedDirectFrame
from ya2.utils.gui.base_page import DirectOptionMenuTestable
+from pmachines.items.basketball import Basketball
+from pmachines.items.box import Box
+from pmachines.items.domino import Domino
+from pmachines.items.shelf import Shelf
+from pmachines.items.teetertooter import TeeterTooter
+from pmachines.items.item import FixedStrategy, StillStrategy
+from pmachines.items.domino import UpStrategy, DownStrategy
+from pmachines.items.box import HitStrategy
class SceneEditor(DirectObject):
self._font.set_pixels_per_unit(60)
self._font.set_minfilter(Texture.FTLinearMipmapLinear)
self._font.set_outline((0, 0, 0, 1), .8, .2)
+ self.__item_classes = [Basketball, Box, Domino, Shelf, TeeterTooter]
+ self.__item_strategy_classes = [FixedStrategy, StillStrategy, HitStrategy, UpStrategy, DownStrategy]
self._common = {
'scale': .046,
'text_font': self._font,
b.__class__ = type('DirectButtonMixed', (DirectButton, DirectGuiMixin), {})
self.__pos_mgr['editor_sorting'] = b.pos_pixel()
b.set_tooltip(_('Set the sorting of the scenes'), *tooltip_args)
- item_modules = glob('pmachines/items/*.py')
- item_modules = [basename(i)[:-3] for i in item_modules]
+ # item_modules = glob('pmachines/items/*.py')
+ # item_modules = [basename(i)[:-3] for i in item_modules]
self.__new_items = {}
- for item_module in item_modules:
- mod_name = 'pmachines.items.' + item_module
- for member in import_module(mod_name).__dict__.values():
- if isclass(member) and issubclass(member, Item) and \
- member != Item:
- self.__new_items[member.__name__] = member
+ # for item_module in item_modules:
+ # mod_name = 'pmachines.items.' + item_module
+ # for member in import_module(mod_name).__dict__.values():
+ # if isclass(member) and issubclass(member, Item) and \
+ # member != Item:
+ # self.__new_items[member.__name__] = member
+ for i in self.__item_classes: self.__new_items[i.__name__] = i
OnscreenText(
_('new item'), pos=(.02, .46), parent=self._frm,
font=self._common['text_font'],
elif item.__class__ == WorldSpaceTestItem:
self.__inspector = WorldSpaceInspector(item, self.__items, self.__pos_mgr)
else:
- self.__inspector = Inspector(item, self.__items, self.__pos_mgr)
+ self.__inspector = Inspector(item, self.__items, self.__pos_mgr, self.__item_strategy_classes)
def __on_inspector_destroy(self):
self.__inspector = None
messenger.send('new_scene')
def __on_start_items(self):
- self.__start_items = StartItems(self.__json['start_items'], self.__pos_mgr)
+ self.__start_items = StartItems(self.__json['start_items'], self.__pos_mgr, self.__item_classes, self.__item_strategy_classes)
def __on_start_items_save(self, start_items):
self.__json['start_items'] = start_items
class StartItems(DirectObject):
- def __init__(self, json_items, pos_mgr):
+ def __init__(self, json_items, pos_mgr, item_classes, strategy_items):
super().__init__()
self.__items = json_items
self.__json = self.__items[0]
pos_mgr=pos_mgr,
frame_name='start')
self.__z = -.08
- item_modules = glob('pmachines/items/*.py')
- item_modules = [basename(i)[:-3] for i in item_modules]
- new_items = ['']
- for item_module in item_modules:
- mod_name = 'pmachines.items.' + item_module
- for member in import_module(mod_name).__dict__.values():
- if isclass(member) and issubclass(member, Item) and \
- member != Item:
- new_items = list(set(new_items + [member.__name__]))
- t, item_class_entry = self.__add_row_option(_('class'), '', new_items, self.on_edit_class, _('class of the item'))
+ # item_modules = glob('pmachines/items/*.py')
+ # item_modules = [basename(i)[:-3] for i in item_modules]
+ # new_items = ['']
+ # for item_module in item_modules:
+ # mod_name = 'pmachines.items.' + item_module
+ # for member in import_module(mod_name).__dict__.values():
+ # if isclass(member) and issubclass(member, Item) and \
+ # member != Item:
+ # new_items = list(set(new_items + [member.__name__]))
+ item_names = [i.__name__ for i in item_classes]
+ t, item_class_entry = self.__add_row_option(_('class'), '', item_names, self.on_edit_class, _('class of the item'))
def item_class_set(comps):
- class_labels = [f'start_class_{i.lower()}' for i in new_items]
+ class_labels = [f'start_class_{i.lower()}' for i in item_names]
for i in class_labels:
if i in self.__pos_mgr:
del self.__pos_mgr[i]
t, restitution_entry = self.__add_row('restitution', _('restitution'), '', self.on_edit_restitution, _('restitution (default 0.5)'))
t, friction_entry = self.__add_row('friction', _('friction'), '', self.on_edit_friction, _('friction (default 0.5)'))
t, id_entry = self.__add_row('id', _('id'), '', self.on_edit_id, _('id'))
- strategy_items = ['']
- for item_module in item_modules:
- mod_name = 'pmachines.items.' + item_module
- for member in import_module(mod_name).__dict__.values():
- if isclass(member) and issubclass(member, ItemStrategy) and \
- member != ItemStrategy:
- strategy_items = list(set(strategy_items + [member.__name__]))
- t, strategy_entry = self.__add_row_option(_('strategy'), '', strategy_items, self.on_edit_strategy, _('the strategy of the item'))
+ # strategy_items = ['']
+ # for item_module in item_modules:
+ # mod_name = 'pmachines.items.' + item_module
+ # for member in import_module(mod_name).__dict__.values():
+ # if isclass(member) and issubclass(member, ItemStrategy) and \
+ # member != ItemStrategy:
+ # strategy_items = list(set(strategy_items + [member.__name__]))
+ strategy_names = [s.__name__ for s in strategy_items]
+ t, strategy_entry = self.__add_row_option(_('strategy'), '', strategy_names, self.on_edit_strategy, _('the strategy of the item'))
def strategy_set(comps):
- strategy_labels = [f'start_strategy_{i.lower()}' for i in strategy_items]
+ strategy_labels = [f'start_strategy_{i.lower()}' for i in strategy_names]
for i in strategy_labels:
if i in self.__pos_mgr:
del self.__pos_mgr[i]
self._outline_model.hide(BitMask32(0x01))
self._start_drag_pos = None
self._prev_rot_info = None
- self._last_nonoverlapping_pos = None
- self._last_nonoverlapping_rot = None
+ self._last_nonoverlapping_pos = (0, 0, 0)
+ self._last_nonoverlapping_rot = 0
self._instantiated = not count
self._box_tsk = taskMgr.add(self.on_frame, 'item_on_frame')
if count:
* BACKLOG actions: rewind, prev, next
* BACKLOG (python 3.11) manylinux2014_x86_64
* BACKLOG (when panda3d provides it) android build (test with the emulator of android studio)
-* BACKLOG (test with wine 8.0 | when itch.io's client works with wine) functional tests for windows-itch.io
+* BACKLOG (when itch.io's client works with wine) functional tests for windows-itch.io
* calendar :calendar:
** publish post q1; reschedule
SCHEDULED: <2023-03-20 Mon +1y>
from panda3d.core import load_prc_file_data
load_prc_file_data('', 'window-type none')
-import datetime
+import datetime, sys
from pathlib import Path
from time import sleep
from os import system
from direct.showbase.ShowBase import ShowBase
import asyncio
import xmlrpc
-from logging import basicConfig, debug, info, DEBUG, getLogger, Formatter, FileHandler
+from logging import basicConfig, debug, info, DEBUG, getLogger, Formatter, FileHandler, StreamHandler
basicConfig(level=DEBUG, format='(evt-test) %(asctime)s.%(msecs)03d %(message)s', datefmt='%H:%M:%S')
getLogger().setLevel(DEBUG) # it doesn't work otherwise
+getLogger().addHandler(StreamHandler(sys.stdout))
class FunctionalTest:
debug('creating FunctionalTest (%s)' % id(self))
super().__init__()
- timestamp = datetime.datetime.now().strftime('%y%m%d%H%M%S')
- logFormatter = Formatter('%(asctime)s.%(msecs)03d %(message)s', datefmt='%H:%M:%S')
- path = str(Path.home()) + '/.local/share/pmachines/logs/evt/'
- if not exists(path):
- makedirs(path)
- lpath = path + 'evt_%s.log' % timestamp
- fileHandler = FileHandler(lpath)
- fileHandler.setFormatter(logFormatter)
- getLogger().addHandler(fileHandler)
+ # timestamp = datetime.datetime.now().strftime('%y%m%d%H%M%S')
+ # logFormatter = Formatter('%(asctime)s.%(msecs)03d %(message)s', datefmt='%H:%M:%S')
+ # path = str(Path.home()) + '/.local/share/pmachines/logs/evt/'
+ # if not exists(path):
+ # makedirs(path)
+ # lpath = path + 'evt_%s.log' % timestamp
+ # fileHandler = FileHandler(lpath)
+ # fileHandler.setFormatter(logFormatter)
+ # getLogger().addHandler(fileHandler)
info('test idx: %s' % idx)
self._offset = offset
from os import system, remove, environ
from os.path import exists, basename, join
from glob import glob
-from subprocess import PIPE, Popen
+from subprocess import PIPE, Popen, STDOUT
from panda3d.core import Filename
from ya2.build.build import exec_cmd, _branch, _version
sleep(8)
info('launching ' + app_cmd)
print('launching ' + app_cmd)
- p_app = Popen(app_cmd, shell=True, stdout=PIPE, stderr=PIPE, universal_newlines=True)
+ p_app = Popen(app_cmd, shell=True, stderr=STDOUT, universal_newlines=True)
sleep(30)
info('launching ' + test_cmd)
print('launching ' + test_cmd)
- p_test = Popen(test_cmd, shell=True, stdout=PIPE, stderr=PIPE, universal_newlines=True)
+ p_test = Popen(test_cmd, shell=True, stderr=STDOUT, universal_newlines=True
p_app_out, p_app_err = p_app.communicate()
t_out, t_err = p_test.communicate()
info('output (%s): %s' % (app_cmd, p_app_out))
list(map(self.log, self.__messages))
def __write_observed_version(self):
- info(f'writing {LogicsTools.appdata_path}/{self.__appname}/observed_version.txt')
+ info(f'writing {LogicsTools.appdata_path}/{self.__app_name}/observed_version.txt')
with open(LogicsTools.appdata_path + '/pmachines/observed_version.txt', 'w') as f:
f.write(self.build_version)