diff --git a/plugins/utilities/camera.py b/plugins/utilities/camera.py index cbb0a36..7ebe021 100755 --- a/plugins/utilities/camera.py +++ b/plugins/utilities/camera.py @@ -46,22 +46,25 @@ from bauiv1lib.ingamemenu import InGameMenuWindow as igm from babase import Plugin, InputType as IT from math import sqrt, dist + class Camera: __doc__ = 'A simple camera.' __ins__ = None __lst__ = None __yes__ = False + def __init__(s) -> None: c = s.__class__ if c.__yes__: - note('Stopped camera!',True) + note('Stopped camera!', True) c.__ins__.done(talk=False) return c.__ins__ = s c.__yes__ = True - if c.__lst__: SCM(False) + if c.__lst__: + SCM(False) s.stage = 0 - p = (0,1,0) + p = (0, 1, 0) s.tex = 'achievementCrossHair' s.kids = [] s.okay = [] @@ -94,7 +97,7 @@ class Camera: 'is_area_of_interest': True } ) - tick(0.15, animate(n,'mesh_scale',{0:2,0.1:0.5}).delete) + tick(0.15, animate(n, 'mesh_scale', {0: 2, 0.1: 0.5}).delete) gbs('powerup01').play(position=p) s.step = 0.01 s.node = n @@ -104,7 +107,7 @@ class Camera: s.overlay = Overlay() LN({ 'UP_DOWN': lambda a: s.manage(a), - 'LEFT_RIGHT': lambda a: s.manage(a,1), + 'LEFT_RIGHT': lambda a: s.manage(a, 1), 'PICK_UP_PRESS': lambda: s.start(2), 'JUMP_PRESS': lambda: s.start(0), 'PICK_UP_RELEASE': lambda: s.stop(2), @@ -116,58 +119,61 @@ class Camera: }) s.move() """Write a tip""" - def tip(s,t,p,h='left',b=True): + def tip(s, t, p, h='left', b=True): n = newnode( 'text', attrs={ 'in_world': True, 'scale': 0.01, 'flatness': 1, - 'color': (1,1,1), + 'color': (1, 1, 1), 'shadow': 1.0, 'position': p, 'text': t, 'h_align': h } ) - if b: s.kids.append(n) + if b: + s.kids.append(n) return n """Create a dot""" - def dot(s,p,b=True,tex='black'): + def dot(s, p, b=True, tex='black'): n = newnode( 'prop', delegate=s, - attrs={ - 'mesh': getmesh('tnt'), - 'color_texture': gbt(tex), - 'body': 'crate', - 'mesh_scale': 0.1, - 'position': p, - 'gravity_scale': 0, - 'materials': [s.M], - } + attrs={ + 'mesh': getmesh('tnt'), + 'color_texture': gbt(tex), + 'body': 'crate', + 'mesh_scale': 0.1, + 'position': p, + 'gravity_scale': 0, + 'materials': [s.M], + } ) - if b: s.kids.append(n) + if b: + s.kids.append(n) return n """Draw a line""" - def line(s,p1,p2,i=2,tex='black'): - x1,y1,z1 = p1 - x2,y2,z2 = p2 - n = dist(p1,p2)*i - for i in range(1,int(n+1)): + def line(s, p1, p2, i=2, tex='black'): + x1, y1, z1 = p1 + x2, y2, z2 = p2 + n = dist(p1, p2)*i + for i in range(1, int(n+1)): t = i/n x = x1+t*(x2-x1) y = y1+t*(y2-y1) z = z1+t*(z2-z1) - s.kids.append(s.dot((x,y,z),tex=tex)) + s.kids.append(s.dot((x, y, z), tex=tex)) """Mark""" def mark(s): if not s.stage: s.stage = 1 p = s.getpos() - s.p1 = (p[0]-0.01,p[1],p[2]) - s.okay.append(s.dot(s.p1,b=False)) - s.okay.append(s.tip(f'Camera position\n{tuple([round(i,2) for i in s.p1])}',s.p1,b=False)) + s.p1 = (p[0]-0.01, p[1], p[2]) + s.okay.append(s.dot(s.p1, b=False)) + s.okay.append( + s.tip(f'Camera position\n{tuple([round(i, 2) for i in s.p1])}', s.p1, b=False)) else: [i.delete() for i in s.kids] s.kids.clear() @@ -201,16 +207,17 @@ class Camera: s.line(s.p1, bl) m = 4 - j = {'tex':'crossOutMask'} + j = {'tex': 'crossOutMask'} s.line(tr, tl, m, **j) s.line(tl, bl, m, **j) s.line(bl, br, m, **j) s.line(br, tr, m, **j) - s.tip(f'Your display\n{r[0]}x{r[1]} px\n{tuple([round(i,2) for i in p2])}',tr,'right') + s.tip( + f'Your display\n{r[0]}x{r[1]} px\n{tuple([round(i, 2) for i in p2])}', tr, 'right') s.stage = 2 s.overlay.press(3) - tick(0.25, animate(s.node,'mesh_scale',{0:0.5,0.1:0.2,0.2:0.5}).delete) + tick(0.25, animate(s.node, 'mesh_scale', {0: 0.5, 0.1: 0.2, 0.2: 0.5}).delete) gbs('gunCocking').play(position=s.node.position) """Handle events""" def handlemessage(s, m): @@ -237,117 +244,132 @@ class Camera: def reset(s): s.__class__.__yes__ = False me = getme() - if not me: return + if not me: + return me.resetinput() - with ga().context: me.actor.connect_controls_to_player() + with ga().context: + me.actor.connect_controls_to_player() [i.delete() for i in (s.kids+s.okay)] """Manage movement""" - def manage(s,a,lr=0): - if lr: s.llr = a; return + def manage(s, a, lr=0): + if lr: + s.llr = a + return s.lud = a """Move""" def move(s): m = getme(1) - if (not m) or m._dead: s.destroy() - try: p = s.getpos() + if (not m) or m._dead: + s.destroy() + try: + p = s.getpos() except: s.overlay.destroy() return - s.setpos((p[0]+s.llr*s.step,p[1],p[2]-s.lud*s.step)) - s.overlay.up(*p,s.llr,s.lud) + s.setpos((p[0]+s.llr*s.step, p[1], p[2]-s.lud*s.step)) + s.overlay.up(*p, s.llr, s.lud) SCT(*p) - teck(s.wait,s.move) + teck(s.wait, s.move) """Start elevating""" - def start(s,i): + def start(s, i): s.overlay.press(i) s.mode = i s.loop(i) """Keep elevating""" - def loop(s,i): - if s.mode != i: return - try: p = list(s.node.position) - except: return + def loop(s, i): + if s.mode != i: + return + try: + p = list(s.node.position) + except: + return p[1] += s.step if i else -s.step s.node.position = tuple(p) teck(s.wait, lambda: s.loop(i)) """Stop elevating""" - def stop(s,i): + def stop(s, i): s.overlay.release(i) s.mode = 4 """Get position""" def getpos(s): return s.node.position """Set position""" - def setpos(s,p): + def setpos(s, p): s.node.position = p """Done""" - def done(s,talk=True): + def done(s, talk=True): s.overlay.press(1) s.overlay.destroy() - try: p = s.node.position - except: return + try: + p = s.node.position + except: + return with ga().context: gbs('laser').play(position=p) - tick(0.2,animate(s.node,'mesh_scale',{0:0.5,0.08:1,0.2:0}).delete) - tick(0.2,s.node.delete) + tick(0.2, animate(s.node, 'mesh_scale', {0: 0.5, 0.08: 1, 0.2: 0}).delete) + tick(0.2, s.node.delete) s.reset() if s.stage > 1 and talk: SCM(True) SCP(*s.p1) SCT(*s.p2) - var('lp1',s.p1) - var('lp2',s.p2) + var('lp1', s.p1) + var('lp2', s.p2) nice('Applied!') elif talk: note('Incomplete camera setup\nNo changes applied.') - if s.__class__.__ins__ == s: s.__class__.__ins__ = None + if s.__class__.__ins__ == s: + s.__class__.__ins__ = None + """Controls overlay""" + + class Overlay: __lst__ = None """Place nodes""" def __init__(s): s.__class__.__lst__ = str(ga()) s.colors = [ - [(0.2,0.6,0.2),(0.4,1,0.4)], - [(0.6,0,0),(1,0,0)], - [(0.2,0.6,0.6),(0.4,1,1)], - [(0.6,0.6,0.2),(1,1,0.4)], - [(0.3,0.23,0.5),(0.2,0.13,0.3)] + [(0.2, 0.6, 0.2), (0.4, 1, 0.4)], + [(0.6, 0, 0), (1, 0, 0)], + [(0.2, 0.6, 0.6), (0.4, 1, 1)], + [(0.6, 0.6, 0.2), (1, 1, 0.4)], + [(0.3, 0.23, 0.5), (0.2, 0.13, 0.3)] ] s.pics = [] s.texts = [] s.pos = [] s.nub = [] - s.old = [0,0,0] + s.old = [0, 0, 0] s.dead = False with ga().context: for i in range(4): - j = ['Jump','Bomb','PickUp','Punch'][i] - k = [600,650,600,550][i] - l = [170,220,270,220][i] + j = ['Jump', 'Bomb', 'PickUp', 'Punch'][i] + k = [600, 650, 600, 550][i] + l = [170, 220, 270, 220][i] c = s.colors[i][0] n = newnode( 'image', attrs={ 'texture': gbt('button'+j), 'absolute_scale': True, - 'position': (k,l), - 'scale': (60,60), + 'position': (k, l), + 'scale': (60, 60), 'color': c } ) s.pics.append(n) - j = ['Down','Done','Up','Mark'][i] - k = [600,680,600,515][i] - l = [115,220,325,220][i] - h = ['center','left','center','right'][i] - v = ['bottom','center','top','center'][i] + j = ['Down', 'Done', 'Up', 'Mark'][i] + k = [600, 680, 600, 515][i] + l = [115, 220, 325, 220][i] + h = ['center', 'left', 'center', 'right'][i] + v = ['bottom', 'center', 'top', 'center'][i] n = newnode( 'text', attrs={ 'text': j, - 'position': (k,l), + 'position': (k, l), 'color': c, 'h_align': h, 'v_align': v @@ -355,92 +377,103 @@ class Overlay: ) s.texts.append(n) for i in range(3): - c = s.colors[[1,0,2][i]][0] + c = s.colors[[1, 0, 2][i]][0] n = newnode( 'text', attrs={ 'text': '0', - 'position': (640,155-30*i), + 'position': (640, 155-30*i), 'color': c, 'h_align': 'left' } ) s.pos.append(n) - s.np = (790,140) - for i in [0,1]: - j = [110,60][i] + s.np = (790, 140) + for i in [0, 1]: + j = [110, 60][i] n = newnode( 'image', attrs={ 'texture': gbt('nub'), 'absolute_scale': True, 'position': s.np, - 'scale': (j,j), + 'scale': (j, j), 'color': s.colors[4][i] } ) s.nub.append(n) s.fade() """Color overlays""" - def set(s,i,c): + def set(s, i, c): s.pics[i].color = s.texts[i].color = c """Color position""" - def pset(s,i,c): + def pset(s, i, c): s.pos[i].color = c """Simulate pressed""" - def press(s,i): - s.set(i,s.colors[i][1]) + def press(s, i): + s.set(i, s.colors[i][1]) s.pics[i].opacity = 1.0 """Simulate released""" - def release(s,i): - s.set(i,s.colors[i][0]) + def release(s, i): + s.set(i, s.colors[i][0]) s.pics[i].opacity = 0.7 """Get all nodes""" def nodes(s): return s.pics+s.texts+s.pos+s.nub """Update position""" - def up(s,x,y,z,lr,ud): - new = [x,y,z] + def up(s, x, y, z, lr, ud): + new = [x, y, z] for i in range(3): - c = s.colors[[1,0,2][i]] - if s.old[i] == new[i]: s.pset(i,c[0]); continue + c = s.colors[[1, 0, 2][i]] + if s.old[i] == new[i]: + s.pset(i, c[0]) + continue t = s.pos[i] - t.text = str(round(new[i],5)) - s.pset(i,c[1]) + t.text = str(round(new[i], 5)) + s.pset(i, c[1]) s.old = new - [setattr(s.nub[i],'opacity',[[0.5,0.2],[0.7,0.3]][bool(lr or ud)][i]) for i in [0,1]] + [setattr(s.nub[i], 'opacity', [[0.5, 0.2], [0.7, 0.3]][bool(lr or ud)][i]) for i in [0, 1]] p = s.np m = sqrt(lr**2+ud**2) or 1 - d = 25*min(sqrt(lr**2+ud**2),1) + d = 25*min(sqrt(lr**2+ud**2), 1) lr /= m ud /= m - s.nub[1].position = (p[0]+lr*d,p[1]+ud*d) + s.nub[1].position = (p[0]+lr*d, p[1]+ud*d) """Fade""" - def fade(s,i=0): - if str(ga()) != s.__class__.__lst__: return + def fade(s, i=0): + if str(ga()) != s.__class__.__lst__: + return mem = s.nodes() - [tick(1, animate(n,'opacity',{0:i,0.5:abs(i-0.7)}).delete) for n in mem] + [tick(1, animate(n, 'opacity', {0: i, 0.5: abs(i-0.7)}).delete) for n in mem] """Destroy overlay""" def destroy(s): - if s.dead: return + if s.dead: + return s.dead = True with ga().context: - tick(0.2,lambda:s.fade(0.7)) - tick(2,lambda: [n.delete() for n in s.nodes()]) + tick(0.2, lambda: s.fade(0.7)) + tick(2, lambda: [n.delete() for n in s.nodes()]) + # Mini tools -note = lambda t, b=False: (push(t,color=(1,1,0)),gs('block').play() if b else None) -nice = lambda t: (push(t,color=(0,1,0)),gs('dingSmallHigh').play()) -SCM = lambda b: (setattr(Camera,'__lst__',b),SSCM(b)) -scale = lambda v,s: (v[0]*s,v[1]*s,v[2]*s) -cross = lambda a,b: (a[1]*b[2]-a[2]*b[1],a[2]*b[0]-a[0]*b[2],a[0]*b[1]-a[1]*b[0]) -sub = lambda a,b: (a[0]-b[0],a[1]-b[1],a[2]-b[2]) -add = lambda a,b: (a[0]+b[0],a[1]+b[1],a[2]+b[2]) +def note(t, b=False): return (push(t, color=(1, 1, 0)), gs('block').play() if b else None) +def nice(t): return (push(t, color=(0, 1, 0)), gs('dingSmallHigh').play()) +def SCM(b): return (setattr(Camera, '__lst__', b), SSCM(b)) +def scale(v, s): return (v[0]*s, v[1]*s, v[2]*s) +def cross(a, b): return (a[1]*b[2]-a[2]*b[1], a[2]*b[0]-a[0]*b[2], a[0]*b[1]-a[1]*b[0]) +def sub(a, b): return (a[0]-b[0], a[1]-b[1], a[2]-b[2]) +def add(a, b): return (a[0]+b[0], a[1]+b[1], a[2]+b[2]) + + def getme(actor=0): for p in ga().players: if p.sessionplayer.inputdevice.client_id == -1: return p.actor if actor else p -def LN(d): me = getme(); [me.assigninput(getattr(IT,k), d[k]) for k in d] + + +def LN(d): me = getme(); [me.assigninput(getattr(IT, k), d[k]) for k in d] + + def RESUME(): u = APP.ui_v1 c = APP.classic @@ -448,70 +481,80 @@ def RESUME(): u.clear_main_window() [z() for z in c.main_menu_resume_callbacks] c.main_menu_resume_callbacks.clear() + + def norm(v): - a,b,c = v + a, b, c = v l = sqrt(a**2+b**2+c**2) - return (0, 0, 0) if l == 0 else (a/l,b/l,c/l) -def var(s,v=None): + return (0, 0, 0) if l == 0 else (a/l, b/l, c/l) + + +def var(s, v=None): c = APP.config s = 'cam_'+s - if v is None: return c.get(s,v) + if v is None: + return c.get(s, v) c[s] = v c.commit() # brobord collide grass # ba_meta require api 9 # ba_meta export babase.Plugin + + class byBordd(Plugin): - has_settings_ui = lambda s: True - show_settings_ui = lambda s, src: s.ui(source=src) - col = (0.18,0.18,0.18) + def has_settings_ui(s): return True + def show_settings_ui(s, src): return s.ui(source=src) + col = (0.18, 0.18, 0.18) + def __init__(s): o = igm._refresh_in_game - def e(f,*a,**k): - r = o(f,*a,**k) + + def e(f, *a, **k): + r = o(f, *a, **k) b = bw( label='', - size=(90,40), + size=(90, 40), button_type='square', parent=f._root_widget, - color=(0.18,0.18,0.18), - position=(f._width-20,0), + color=(0.18, 0.18, 0.18), + position=(f._width-20, 0), ) - bw(b,on_activate_call=lambda:s.ui(source=b,main=True)) + bw(b, on_activate_call=lambda: s.ui(source=b, main=True)) iw( - size=(40,40), + size=(40, 40), texture=gt('tv'), parent=f._root_widget, - position=(f._width-20,5) + position=(f._width-20, 5) ) tw( maxwidth=50, text='Camera', h_align='left', parent=f._root_widget, - position=(f._width+15,0) + position=(f._width+15, 0) ) return r igm._refresh_in_game = e """The UI""" - def ui(s,source=None,main=False): + def ui(s, source=None, main=False): s.main = main - off = source.get_screen_space_center() if source else (0,0) + off = source.get_screen_space_center() if source else (0, 0) w = cw( color=s.col, - size=(350,305), + size=(350, 305), stack_offset=off, transition='in_scale', parent=gsw('overlay_stack'), scale_origin_stack_offset=off ) - s.back = lambda b=True: (cw(w,transition=['out_right','out_scale'][bool(source) and b]),gs('swish').play() if b else None) - cw(w,on_outside_click_call=s.back) + s.back = lambda b=True: ( + cw(w, transition=['out_right', 'out_scale'][bool(source) and b]), gs('swish').play() if b else None) + cw(w, on_outside_click_call=s.back) b = Camera.__yes__ t = [ - ('Camera is ready!',(0,1,1)), - ('Camera is running!',(0,1,0)), + ('Camera is ready!', (0, 1, 1)), + ('Camera is running!', (0, 1, 0)), ][b] tw( parent=w, @@ -519,59 +562,68 @@ class byBordd(Plugin): scale=1.5, color=t[1], h_align='center', - position=(155,250) + position=(155, 250) ) for i in range(4): j = [ - ('3D Camera mapper',s.start), - ('Last mapped config',s.load), - ('Last dev command',s.copy), - ('Reset all settings',s.reset) + ('3D Camera mapper', s.start), + ('Last mapped config', s.load), + ('Last dev command', s.copy), + ('Reset all settings', s.reset) ][i] tw( parent=w, text=j[0], maxwidth=195, - position=(20,30+55*i) + position=(20, 30+55*i) ) k = [ - (['Start','Stop'][b],'cursor'), - ('Load','achievementOutline'), - ('Copy','file'), - ('Reset','replayIcon') + (['Start', 'Stop'][b], 'cursor'), + ('Load', 'achievementOutline'), + ('Copy', 'file'), + ('Reset', 'replayIcon') ][i] bw( parent=w, label=k[0], color=s.col, - size=(120,50), + size=(120, 50), icon=gt(k[1]), enable_sound=not i, - textcolor=(1,1,1), + textcolor=(1, 1, 1), button_type='square', on_activate_call=j[1], - position=(220,20+55*i) + position=(220, 20+55*i) ) """Gather last""" def gather(s): - return var('lp1'),var('lp2') + return var('lp1'), var('lp2') """Reset""" def reset(s): SCM(False) nice('Resetored original settings!') """Copy last""" def copy(s): - if not CIS(): note('Unsupported!',True); return + if not CIS(): + note('Unsupported!', True) + return g = s.gather() - if not g[1]: note('Apply something first!',True); return - g = [tuple([round(i,2) for i in j]) for j in g] - COPY(f'from _babase import set_camera_manual as SCM, set_camera_target as SCT, set_camera_position as SCP; SCM(True); SCP(*{g[0]}); SCT(*{g[1]})') + if not g[1]: + note('Apply something first!', True) + return + g = [tuple([round(i, 2) for i in j]) for j in g] + COPY( + f'from _babase import set_camera_manual as SCM, set_camera_target as SCT, set_camera_position as SCP; SCM(True); SCP(*{g[0]}); SCT(*{g[1]})') nice('Copied command!\nPaste it in dev console anytime to load config!') """Load last""" def load(s): g = s.gather() - if not g[1]: note('Apply something first!',True); return - if Camera.__yes__: note('Stop camera first!',True); return + if not g[1]: + note('Apply something first!', True) + return + if Camera.__yes__: + note('Stop camera first!', True) + return SCM(True) SCP(*g[0]) SCT(*g[1]) @@ -579,8 +631,13 @@ class byBordd(Plugin): """Start camera""" def start(s): a = ga() - if not a: note('Only mapping requires you to be the host!\nYou still can load previous config though',True); return - if not getme(): note('Join the game first!',True); return + if not a: + note('Only mapping requires you to be the host!\nYou still can load previous config though', True) + return + if not getme(): + note('Join the game first!', True) + return s.back(False) RESUME() if s.main else None - with a.context: Camera() + with a.context: + Camera() diff --git a/plugins/utilities/fileman.py b/plugins/utilities/fileman.py index 58fb580..b2e28e3 100755 --- a/plugins/utilities/fileman.py +++ b/plugins/utilities/fileman.py @@ -75,40 +75,50 @@ from random import uniform as UF from threading import Thread from pathlib import Path + class FileMan(MainWindow): VER = '1.0' INS = [] + @classmethod def resize(c): c.clean() [_.on_resize() for _ in c.INS] + @classmethod def clean(c): c.INS = [_ for _ in c.INS if not _.gn and _.p.exists()] + @classmethod def loadc(c): - [setattr(c,f'COL{i}',_) for i,_ in enumerate(var('col'))] + [setattr(c, f'COL{i}', _) for i, _ in enumerate(var('col'))] + def __del__(s): s.__class__.clean() + def on_resize(s): [_.delete() for _ in s.killme] s.killme.clear() c = s.uploadc s.spyt = s.sharel = s.buf = s.uploadc = None - if c: c.close() + if c: + c.close() s.fresh() - def __init__(s,src): + + def __init__(s, src): s.__class__.clean() s.__class__.INS.append(s) s.wop() s.url = s.urlo = var('cwd') s.urlbln = s.dro = s.gn = s.rlyd = s.flon = False - s.amoled = sum(s.COL5)==0 + s.amoled = sum(s.COL5) == 0 s.pusho = s.sorti = 0 s.pushi = -0.1 - s.sl = (None,None) - [setattr(s,_,None) for _ in ['pushe','eno','leno','clp','gab','clpm','rlydt','buf','uploadc','cursnd','rfl','rflo']] - [setattr(s,_,[]) for _ in ['trash','btns','secs','docs','drkids','drol','okes','fkids','ftrash','statkids','fcons','flkids','killme']] + s.sl = (None, None) + [setattr(s, _, None) for _ in ['pushe', 'eno', 'leno', 'clp', 'gab', + 'clpm', 'rlydt', 'buf', 'uploadc', 'cursnd', 'rfl', 'rflo']] + [setattr(s, _, []) for _ in ['trash', 'btns', 'secs', 'docs', 'drkids', 'drol', + 'okes', 'fkids', 'ftrash', 'statkids', 'fcons', 'flkids', 'killme']] s.pushq = '' # root s.p = cw( @@ -117,7 +127,7 @@ class FileMan(MainWindow): ) s.rect = iw( texture=gt('softRect'), - opacity=[0.3,0.85][s.amoled], + opacity=[0.3, 0.85][s.amoled], color=s.COL5, parent=s.p ) @@ -129,7 +139,7 @@ class FileMan(MainWindow): s.bg = iw( texture=gt('white'), parent=s.p, - position=(-2,0), + position=(-2, 0), color=s.COL5 ) s.bg2 = bw( @@ -151,31 +161,31 @@ class FileMan(MainWindow): h_align='center', color=s.COL4, scale=0.7 - ) for _ in ['Action','Extra','New']] + ) for _ in ['Action', 'Extra', 'New']] # actions s.gab = bw( parent=s.p, oac=s.cancel, - size=(0,0), + size=(0, 0), selectable=False ) r = [] for _ in range(6): - l = ['Copy','Move','Delete','Share','Rename','Open'][_] + l = ['Copy', 'Move', 'Delete', 'Share', 'Rename', 'Open'][_] r.append(bw( parent=s.p, label=l, - oac=Call(s.act,0,_) + oac=Call(s.act, 0, _) )) s.btns.append(r) # extra r = [] for _ in range(4): - l = ['Star','Sort','Filter','Theme'][_] + l = ['Star', 'Sort', 'Filter', 'Theme'][_] r.append(bw( parent=s.p, label=l, - oac=Call(s.act,1,_) + oac=Call(s.act, 1, _) )) s.btns.append(r) s.fltxt = tw( @@ -193,17 +203,17 @@ class FileMan(MainWindow): s.gab2 = bw( parent=s.p, oac=s.unfl, - size=(0,0), + size=(0, 0), selectable=False ) # new r = [] for _ in range(2): - l = ['File','Folder'][_] + l = ['File', 'Folder'][_] r.append(bw( parent=s.p, label=l, - oac=Call(s.act,2,_) + oac=Call(s.act, 2, _) )) s.btns.append(r) # back @@ -212,7 +222,7 @@ class FileMan(MainWindow): label=' '+cs(sc.BACK), oac=s.bye ) - cw(s.p,cancel_button=s.bb) + cw(s.p, cancel_button=s.bb) # up s.ub = bw( parent=s.p, @@ -232,12 +242,12 @@ class FileMan(MainWindow): ) s.urla = tw( editable=True, - size=(0,0), + size=(0, 0), parent=s.p, text=s.url ) - s.trash.append(tuck(0.01,s.urlspy,repeat=True)) - s.trash.append(tuck(0.1,s.urlbl,repeat=True)) + s.trash.append(tuck(0.01, s.urlspy, repeat=True)) + s.trash.append(tuck(0.1, s.urlbl, repeat=True)) # rf s.rfb = bw( parent=s.p, @@ -256,7 +266,7 @@ class FileMan(MainWindow): texture=gt('white'), color=s.COL1, opacity=0.5, - position=(20,20) + position=(20, 20) ) s.yesbg2 = iw( parent=s.p, @@ -267,7 +277,7 @@ class FileMan(MainWindow): s.yesp1 = sw( parent=s.p, border_opacity=0, - position=(17,20) + position=(17, 20) ) s.yesp2 = cw( parent=s.yesp1, @@ -319,10 +329,11 @@ class FileMan(MainWindow): h_align='center', v_align='center' ) - s.trash.append(tuck(0.01,s.fpush,repeat=True)) + s.trash.append(tuck(0.01, s.fpush, repeat=True)) # finally s.fresh() - teck(0.5,lambda:s.push(f'FileMan v{s.VER} Ready!',du=1.5) if s.eno is None else 0) + teck(0.5, lambda: s.push(f'FileMan v{s.VER} Ready!', du=1.5) if s.eno is None else 0) + def meh(s): if s.sl[0] is None: s.btw('Select something!') @@ -330,11 +341,14 @@ class FileMan(MainWindow): if s.sl[1] == '..': s.btw('What are you doing blud') return 1 - def btw(s,t,du=3): + + def btw(s, t, du=3): s.snd('block') - s.push(t,color=s.COL3,du=du) - def act(s,i,j,gay=False): - if s.gn: return + s.push(t, color=s.COL3, du=du) + + def act(s, i, j, gay=False): + if s.gn: + return w = s.btns[i][j] match i: case 0: @@ -345,23 +359,26 @@ class FileMan(MainWindow): s.btw("You're already doing something else!") return c = var('cwd') - chk = join(c,basename(s.clp)) - st1,st2 = splitext(chk) + chk = join(c, basename(s.clp)) + st1, st2 = splitext(chk) nn = st1+'_copy'+st2 if exists(chk) else chk if exists(nn): - s.btw('A copy of this '+['file','folder'][isdir(chk)]+' already exists!') + s.btw('A copy of this '+['file', 'folder'] + [isdir(chk)]+' already exists!') return - try: [copy,copytree][isdir(s.clp)](s.clp,nn) + try: + [copy, copytree][isdir(s.clp)](s.clp, nn) except Exception as e: s.btw(str(e)) return else: GUN() s.push('Pasted!') - s.clp = None + s.clp = None s.fresh() else: - if s.meh(): return + if s.meh(): + return s.clp = s.sl[1] s.clpm = j s.push(f'Copied! Now go to destination.') @@ -373,11 +390,13 @@ class FileMan(MainWindow): s.btw("You are already doing something else!") return c = var('cwd') - chk = join(c,basename(s.clp)) + chk = join(c, basename(s.clp)) if exists(chk): - s.btw('There is a '+['file','folder'][isdir(chk)]+' with the same name here.') + s.btw('There is a '+['file', 'folder'] + [isdir(chk)]+' with the same name here.') return - try: move(s.clp,c) + try: + move(s.clp, c) except Exception as e: s.btw(str(e)) return @@ -387,7 +406,8 @@ class FileMan(MainWindow): s.clp = None s.fresh() else: - if s.meh(): return + if s.meh(): + return s.clp = s.sl[1] s.clpm = j s.push(f'Now go to destination and paste.') @@ -397,96 +417,103 @@ class FileMan(MainWindow): if s.clpm: s.btw("Finish what you're doing first!") return - if s.meh(): return + if s.meh(): + return h = s.sl[1] bn = basename(h) if not s.rlyd: - s.beep(1,0) - s.push(f"Really delete "+["the file '"+bn+"'","the whole '"+bn+"' folder"][isdir(h)]+" forever? Press again to confirm.",du=3,color=s.COL3) - s.rlydt = tuck(2.9,Call(setattr,s,'rlyd',False)) + s.beep(1, 0) + s.push(f"Really delete "+["the file '"+bn+"'", "the whole '"+bn+"' folder"] + [isdir(h)]+" forever? Press again to confirm.", du=3, color=s.COL3) + s.rlydt = tuck(2.9, Call(setattr, s, 'rlyd', False)) s.rlyd = True return s.rlyd = False s.rlydt = None - f = [remove,rmtree][isdir(h)] - try: f(h) + f = [remove, rmtree][isdir(h)] + try: + f(h) except Exception as e: s.btw(str(e)) return else: GUN() s.push('Deleted!') - s.sl = (None,None) + s.sl = (None, None) s.fresh() case 3: - if s.meh(): return + if s.meh(): + return f = s.sl[1] if isdir(f): s.btw("You can't share a folder!") return s.wop() o = w.get_screen_space_center() - xs,ys = 400,170 + xs, ys = 400, 170 p = s.uploadp = cw( parent=zw('overlay_stack'), scale_origin_stack_offset=o, stack_offset=o, - size=(xs,ys), + size=(xs, ys), background=False, transition='in_scale' ) s.killme.append(p) iw( parent=p, - size=(xs*1.2,ys*1.2), + size=(xs*1.2, ys*1.2), texture=gt('softRect'), - opacity=[0.2,0.55][s.amoled], - position=(-xs*0.1,-ys*0.1), + opacity=[0.2, 0.55][s.amoled], + position=(-xs*0.1, -ys*0.1), color=s.COL5 ) iw( - parent=p, - texture=gt('white'), - color=s.COL1, - opacity=0.7, - size=(xs,ys) + parent=p, + texture=gt('white'), + color=s.COL1, + opacity=0.7, + size=(xs, ys) ) bw( parent=p, label='Back', oac=s.cupload, - position=(30,15), - size=(xs-60,30) + position=(30, 15), + size=(xs-60, 30) ) s.cpsharelb = bw( parent=p, label='...', oac=s.cpsharel, - position=(30,50), - size=(xs-60,30) + position=(30, 50), + size=(xs-60, 30) ) s.opsharelb = bw( parent=p, label='...', oac=s.opsharel, - position=(30,85), - size=(xs-60,30) + position=(30, 85), + size=(xs-60, 30) ) bw( parent=p, label='Upload to bashupload.com', oac=s.upload, - position=(30,120), - size=(xs-60,30) + position=(30, 120), + size=(xs-60, 30) ) case 4: - if s.meh(): return + if s.meh(): + return t = s.fkids[s.sl[0]] fp = s.sl[1] if s.clp == j: q = tw(query=t) try: - if sep in q: raise ValueError("You can't use directory separator in filename!") + if sep in q: + raise ValueError( + "You can't use directory separator in filename!") Path(q) except Exception as e: s.btw(str(e) or 'Invalid filename!') @@ -495,16 +522,18 @@ class FileMan(MainWindow): if (basename(fp) == q) and not gay: s.btw("Write a new name blud") return - chk = join(var('cwd'),q) + chk = join(var('cwd'), q) if exists(chk): - s.btw(f"There is a {['file','folder'][isdir(chk)]} with this name already!") + s.btw( + f"There is a {['file', 'folder'][isdir(chk)]} with this name already!") return else: - nfp = join(dirname(fp),q) + nfp = join(dirname(fp), q) try: - rename(fp,nfp) + rename(fp, nfp) except PermissionError: - if exists(nfp): pass + if exists(nfp): + pass else: s.push('Permission denied!') return @@ -520,8 +549,8 @@ class FileMan(MainWindow): if s.clpm: s.btw("You didn't paste yet blud") return - tw(t,editable=True,color=s.COL7) - cw(s.yesp2,visible_child=t) + tw(t, editable=True, color=s.COL7) + cw(s.yesp2, visible_child=t) s.clpm = s.clp = j s.push('Now edit the filename, then press Done.') if s.flon and s.rfl: @@ -529,7 +558,8 @@ class FileMan(MainWindow): GUN() s.fresh(skip=True) case 5: - if s.meh(): return + if s.meh(): + return if s.clpm: s.btw("Press again when you're free!") return @@ -542,54 +572,56 @@ class FileMan(MainWindow): s.stat = 1000 s.wop() k = s.fkids[s.sl[0]] if gay else w - gcen = lambda: ((o:=k.get_screen_space_center()),(o[0]-s.size[0]/5,o[1]) if gay else o)[1] + + def gcen(): return ((o := k.get_screen_space_center()), + (o[0]-s.size[0]/5, o[1]) if gay else o)[1] o = gcen() - xs,ys = [_*0.6 for _ in s.size] + xs, ys = [_*0.6 for _ in s.size] p = cw( parent=zw('overlay_stack'), scale_origin_stack_offset=o, - size=(xs,ys), + size=(xs, ys), background=False, transition='in_scale' ) s.killme.append(p) iw( parent=p, - size=(xs*1.2,ys*1.2), + size=(xs*1.2, ys*1.2), texture=gt('softRect'), - opacity=[0.3,0.7][s.amoled], - position=(-xs*0.1,-ys*0.1), + opacity=[0.3, 0.7][s.amoled], + position=(-xs*0.1, -ys*0.1), color=s.COL5 ) iw( - parent=p, - texture=gt('white'), - color=s.COL5, - opacity=0.7, - size=(xs,ys) + parent=p, + texture=gt('white'), + color=s.COL5, + opacity=0.7, + size=(xs, ys) ) b = bw( parent=p, - position=(20,ys-70), + position=(20, ys-70), label=' '+cs(sc.BACK), - size=(50,50), - oac=Call(s.statbye,p,gcen) + size=(50, 50), + oac=Call(s.statbye, p, gcen) ) - cw(p,cancel_button=b) + cw(p, cancel_button=b) ix = xs-250 iw( parent=p, texture=gt('white'), color=s.COL1, - position=(90,ys-72), - size=(ix,54), + position=(90, ys-72), + size=(ix, 54), opacity=0.5 ) tw( parent=p, h_align='center', v_align='center', - position=(xs/2-60,ys-60), + position=(xs/2-60, ys-60), text=basename(h), maxwidth=ix-100 ) @@ -598,35 +630,38 @@ class FileMan(MainWindow): texture=gt('white'), color=s.COL1, opacity=0.5, - position=(20,20), - size=(xs-40,ys-110) + position=(20, 20), + size=(xs-40, ys-110) ) bw( parent=p, label=cs(sc.REWIND_BUTTON), - position=(xs-141,ys-70), - size=(50,50), - oac=Call(s.stata,-1), + position=(xs-141, ys-70), + size=(50, 50), + oac=Call(s.stata, -1), repeat=True ) bw( parent=p, label=cs(sc.FAST_FORWARD_BUTTON), - position=(xs-71,ys-70), - size=(50,50), - oac=Call(s.stata,1), + position=(xs-71, ys-70), + size=(50, 50), + oac=Call(s.stata, 1), repeat=True ) s.oops = 0 try: - with open(h,'r') as f: + with open(h, 'r') as f: da = f.read() except Exception as ex: da = '' s.oops = 1 - if isinstance(ex,PermissionError): kek = 'Permission denied!' - elif isinstance(ex,UnicodeDecodeError): kek = 'No preview avaiable' - else: kek = str(ex) + if isinstance(ex, PermissionError): + kek = 'Permission denied!' + elif isinstance(ex, UnicodeDecodeError): + kek = 'No preview avaiable' + else: + kek = str(ex) else: if not da: s.oops = 1 @@ -634,11 +669,11 @@ class FileMan(MainWindow): if not s.oops: fxs = xs-40 fys = ys-110 - s.statsz = (fxs,fys) + s.statsz = (fxs, fys) p0 = s.statp0 = sw( parent=p, - position=(20,20), - size=(fxs,fys), + position=(20, 20), + size=(fxs, fys), border_opacity=0, capture_arrows=True ) @@ -651,7 +686,7 @@ class FileMan(MainWindow): if ty == 'Replay': tw( parent=p, - position=(xs/2-20,ys-150), + position=(xs/2-20, ys-150), text='Press start to preview replay.\nKeep in mind that this will destroy the current FileMan session.', h_align='center', color=s.COL4, @@ -660,23 +695,24 @@ class FileMan(MainWindow): bw( parent=p, label='Start', - oac=lambda:(b.activate(),teck(0.1,s.bye),teck(0.3,Call(REP,h))), - position=(xs/2-75,ys/2-135), - size=(150,40) + oac=lambda: (b.activate(), teck(0.1, s.bye), + teck(0.3, Call(REP, h))), + position=(xs/2-75, ys/2-135), + size=(150, 40) ) elif ty == 'Texture' and bn in TEX(): - wd = min(xs-80,ys-150) + wd = min(xs-80, ys-150) tex = gt(splitext(bn)[0]) iw( parent=p, texture=tex, - size=(wd,wd), - position=(xs/2-wd/2,40) + size=(wd, wd), + position=(xs/2-wd/2, 40) ) elif ty == 'Audio' and bn in AUDIO(): tw( parent=p, - position=(xs/2-20,ys-150), + position=(xs/2-20, ys-150), text=f'Sound is recognized by filename, not data.\nPress the buttons below to play/pause', h_align='center', color=s.COL4, @@ -685,22 +721,23 @@ class FileMan(MainWindow): bw( parent=p, label=cs(sc.PLAY_BUTTON), - oac=lambda:(getattr(s.cursnd,'stop',lambda:0)(),setattr(s,'cursnd',gs(splitext(bn)[0])),s.cursnd.play()), - position=(xs/2-30,ys/2-135), - size=(40,40) + oac=lambda: (getattr(s.cursnd, 'stop', lambda: 0)(), setattr( + s, 'cursnd', gs(splitext(bn)[0])), s.cursnd.play()), + position=(xs/2-30, ys/2-135), + size=(40, 40) ) bw( parent=p, label=cs(sc.PAUSE_BUTTON), - oac=lambda:getattr(s.cursnd,'stop',lambda:0)(), - position=(xs/2+30,ys/2-135), - size=(40,40) + oac=lambda: getattr(s.cursnd, 'stop', lambda: 0)(), + position=(xs/2+30, ys/2-135), + size=(40, 40) ) else: tw( parent=p, text=kek, - position=(xs/2-25,ys/2-35), + position=(xs/2-25, ys/2-35), h_align='center', v_align='center', maxwidth=xs-100 @@ -716,47 +753,49 @@ class FileMan(MainWindow): else: star.append(c) s.push('Starred! (bomb top right)') - var('star',star) + var('star', star) GUN() s.fresh(skip=True) case 1: - xs,ys = 200,230 + xs, ys = 200, 230 s.wop() - gcen = lambda: ((o:=w.get_screen_space_center()),(o[0]-s.size[0]/5,o[1]) if gay else o)[1] + + def gcen(): return ((o := w.get_screen_space_center()), + (o[0]-s.size[0]/5, o[1]) if gay else o)[1] o = gcen() p = cw( parent=zw('overlay_stack'), scale_origin_stack_offset=o, - size=(xs,ys), + size=(xs, ys), background=False, transition='in_scale', - stack_offset=(o[0],o[1]), - on_outside_click_call=lambda:(cw(p,transition='out_scale'),s.laz()) + stack_offset=(o[0], o[1]), + on_outside_click_call=lambda: (cw(p, transition='out_scale'), s.laz()) ) s.killme.append(p) iw( parent=p, - size=(xs*1.2,ys*1.2), + size=(xs*1.2, ys*1.2), texture=gt('softRect'), - opacity=[0.3,0.7][s.amoled], - position=(-xs*0.1,-ys*0.1), + opacity=[0.3, 0.7][s.amoled], + position=(-xs*0.1, -ys*0.1), color=s.COL5 ) iw( - parent=p, - texture=gt('white'), - color=s.COL5, - opacity=0.7, - size=(xs,ys) + parent=p, + texture=gt('white'), + color=s.COL5, + opacity=0.7, + size=(xs, ys) ) by = 40 srt = SRT() for _ in range(4): bw( - position=(20,ys-20-by-(by+10)*_), - size=(xs-40,by), + position=(20, ys-20-by-(by+10)*_), + size=(xs-40, by), label=srt[_], - oac=Call(s.surt,_,p), + oac=Call(s.surt, _, p), parent=p ) case 2: @@ -768,39 +807,52 @@ class FileMan(MainWindow): xs = ys = min(ox / 2, oy / 2) xs *= 1.3 s.wop() - s.push('FileMan uses 12 main colors. Tap on a color to edit it. Press outside to cancel.',du=6) + s.push( + 'FileMan uses 12 main colors. Tap on a color to edit it. Press outside to cancel.', du=6) o = w.get_screen_space_center() + def nuke(): - cw(p,transition='out_scale') + cw(p, transition='out_scale') s.laz() s.push('Cancelled! Nothing was saved') - p = cw(parent=zw('overlay_stack'), scale_origin_stack_offset=o, size=(xs, ys), stack_offset=(-100,0), background=False, transition='in_scale',on_outside_click_call=nuke) - bw(parent=p,size=(xs+200,ys),bg='empty') + p = cw(parent=zw('overlay_stack'), scale_origin_stack_offset=o, size=( + xs, ys), stack_offset=(-100, 0), background=False, transition='in_scale', on_outside_click_call=nuke) + bw(parent=p, size=(xs+200, ys), bg='empty') s.killme.append(p) - iw(parent=p, size=(xs * 1.2, ys * 1.2), texture=gt('softRect'), opacity=[0.3,0.7][s.amoled], position=(-xs * 0.1, -ys * 0.1), color=s.COL5) - iw(parent=p, texture=gt('white'), color=s.COL5, opacity=0.7, size=(xs + 200, ys)) - temp_colors, scl, sl = [getattr(s, f'COL{i}') for i in range(12)], [0, 0, 0, 0], 0 + iw(parent=p, size=(xs * 1.2, ys * 1.2), texture=gt('softRect'), + opacity=[0.3, 0.7][s.amoled], position=(-xs * 0.1, -ys * 0.1), color=s.COL5) + iw(parent=p, texture=gt('white'), color=s.COL5, + opacity=0.7, size=(xs + 200, ys)) + temp_colors, scl, sl = [getattr(s, f'COL{i}') for i in range(12)], [ + 0, 0, 0, 0], 0 kids, nubs, grad = [], [], [] + def save(): if var('col') == temp_colors: s.btw('At least change a color blud') return - var('col',temp_colors) + var('col', temp_colors) GUN() - cw(p,transition='out_scale') + cw(p, transition='out_scale') s.__class__.loadc() s.bye() SM('Reopen FileMan to see changes!') + def update_previews(): f3() f4() c = temp_colors[sl] obw(kids[sl], color=c, textcolor=INV(c)) + def f3(): - [iw(l, position=(xs + scl[k] * ps - 16, 39 + qs * 5 - (qs) * k)) for k, l in enumerate(nubs)] + [iw(l, position=(xs + scl[k] * ps - 16, 39 + qs * 5 - (qs) * k)) + for k, l in enumerate(nubs)] + def f4(): c = temp_colors[sl] - [obw(l, color=(c[0] * (k / 19), c[1] * (k / 19), c[2] * (k / 19))) for k, l in enumerate(grad)] + [obw(l, color=(c[0] * (k / 19), c[1] * (k / 19), c[2] * (k / 19))) + for k, l in enumerate(grad)] + def f2(k, l): nonlocal scl scl[k] = l @@ -815,15 +867,18 @@ class FileMan(MainWindow): current_max = max(c) if current_max > 0: scale = val / current_max - temp_colors[sl] = new_color = (c[0] * scale, c[1] * scale, c[2] * scale) + temp_colors[sl] = new_color = ( + c[0] * scale, c[1] * scale, c[2] * scale) scl[:3] = [int(x * 19) for x in new_color] update_previews() + def f(z, sh=0): nonlocal sl, scl [obw(_, label='') for _ in kids] obw(kids[z], label=cs(sc.DPAD_CENTER_BUTTON)) sl = z - if not sh: s.snd('deek') + if not sh: + s.snd('deek') c = temp_colors[sl] scl[:3] = [int(x * 19) for x in c] scl[3] = int(max(c) * 19) if any(c) else 0 @@ -834,27 +889,34 @@ class FileMan(MainWindow): ah = l / 19.0 b = obw( parent=p, position=(xs + l * ps, 47 + qs * 5 - qs * k), size=(ps + 2, qs / 2), label='', texture=gt('white'), enable_sound=False, on_activate_call=Call(f2, k, l), - color=( (ah, 0, 0) if k < 1 else (0, ah, 0) if k < 2 else (0, 0, ah) if k < 3 else (ah, ah, ah) ) + color=((ah, 0, 0) if k < 1 else (0, ah, 0) if k < + 2 else (0, 0, ah) if k < 3 else (ah, ah, ah)) ) - if k == 3: grad.append(b) - nubs = [iw(parent=p, size=(35, 35), texture=gt('nub'), color=(10, 10, 10), opacity=0.4) for _ in range(4)] + if k == 3: + grad.append(b) + nubs = [iw(parent=p, size=(35, 35), texture=gt('nub'), + color=(10, 10, 10), opacity=0.4) for _ in range(4)] for x in range(4): for y in range(3): z = x * 3 + y c = temp_colors[z] - kids.append(bw(parent=p, position=(20 + (bs + 10) * x, 20 + (bs + 10) * y), size=(bs, bs), color=c, textcolor=INV(c), oac=Call(f, z))) - bw(parent=p, position=(xs + 5, 24 + qs), size=(172, qs - 2), label='Save', oac=save) + kids.append(bw(parent=p, position=( + 20 + (bs + 10) * x, 20 + (bs + 10) * y), size=(bs, bs), color=c, textcolor=INV(c), oac=Call(f, z))) + bw(parent=p, position=(xs + 5, 24 + qs), + size=(172, qs - 2), label='Save', oac=save) + def reset(): mem = COL() if mem == temp_colors: s.btw("Reset what? It's already at default") return - for i,m in enumerate(mem): + for i, m in enumerate(mem): temp_colors[i] = m update_previews() GUN() s.push('Restored default colors! now press save') - bw(parent=p, position=(xs + 5, 18.5), size=(172, qs - 3), label='Reset', oac=reset) + bw(parent=p, position=(xs + 5, 18.5), + size=(172, qs - 3), label='Reset', oac=reset) f(0, sh=1) case 2: match j: @@ -863,9 +925,11 @@ class FileMan(MainWindow): s.btw("You're already in the middle of something") return c = var('cwd') - n = join(c,'new_file') - while exists(n): n+='_again' - try: Path(n).touch() + n = join(c, 'new_file') + while exists(n): + n += '_again' + try: + Path(n).touch() except PermissionError: s.btw('Permission denied!') return @@ -874,15 +938,17 @@ class FileMan(MainWindow): return s.fresh(sl=n) # rename - s.act(0,4,gay=True) + s.act(0, 4, gay=True) case 1: if s.clpm: s.btw("You're already in the middle of something") return c = var('cwd') - n = join(c,'new_folder') - while exists(n): n+='_again' - try: mkdir(n) + n = join(c, 'new_folder') + while exists(n): + n += '_again' + try: + mkdir(n) except PermissionError: s.btw('Permission denied!') return @@ -891,23 +957,29 @@ class FileMan(MainWindow): return s.fresh(sl=n) # rename - s.act(0,4) - def surt(s,_,p): + s.act(0, 4) + + def surt(s, _, p): if _ == s.sorti: s.btw('Already sorted by '+SRT()[_]+'!') return s.sorti = _ GUN() - cw(p,transition='out_scale') + cw(p, transition='out_scale') s.fresh(sl=s.sl[1]) - def statbye(s,p,gcen): - try: cen = gcen() - except: p.delete() - else: cw(p,transition='out_scale',scale_origin_stack_offset=cen) + + def statbye(s, p, gcen): + try: + cen = gcen() + except: + p.delete() + else: + cw(p, transition='out_scale', scale_origin_stack_offset=cen) s.laz() s.statda = None s.statl = [] s.statp = 0 + def itw(s): PYTHON_KEYWORDS = { 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue', 'def', @@ -934,7 +1006,7 @@ class FileMan(MainWindow): s.COL_NUMBER = getattr(s, 'COL_NUMBER', (1.2, 1.2, 0.5)) s.COL_OPERATOR = getattr(s, 'COL_OPERATOR', (1.5, 1.5, 1.5)) s.COL_BRACKET = getattr(s, 'COL_BRACKET', (0.9, 0.9, 0.9)) - s.COL_END_MARKER = getattr(s, 'COL_END_MARKER', (1.8, 0.6, 0.6)) # Neon Red for the marker + s.COL_END_MARKER = getattr(s, 'COL_END_MARKER', (1.8, 0.6, 0.6)) # Neon Red for the marker da = s.statda end_marker = f'[End of chunk | Press {cs(sc.FAST_FORWARD_BUTTON)}]' @@ -944,7 +1016,7 @@ class FileMan(MainWindow): else: da = da[s.statp:s.stat + s.statp] az = sum(s.statl) - lines = [_.replace('\\n','\\'+"~"+"n") for _ in da.splitlines()] + lines = [_.replace('\\n', '\\'+"~"+"n") for _ in da.splitlines()] zc = len(str(az + len(lines))) da = '\\n'.join([f"{str(i+1+az).zfill(zc)} | {_}" for i, _ in enumerate(lines)]) z = len(da) @@ -955,8 +1027,8 @@ class FileMan(MainWindow): hh = 35 m = max(da.replace('\\n', '') or ' ', key=GSW) l = GSW(str(m)) / 1.5 - l = max(15,l) - l = min(l,20) + l = max(15, l) + l = min(l, 20) das = da.split('\\n') mm = len(max(das, key=len) or '') ldas = len(das) @@ -975,7 +1047,7 @@ class FileMan(MainWindow): nc = 0 in_triple_comment = False triple_quote_char = None - is_first_char_offset_applied = False # Flag for the critical offset + is_first_char_offset_applied = False # Flag for the critical offset off = zc + 3 try: mud = int(da[off] == '#') @@ -986,11 +1058,13 @@ class FileMan(MainWindow): # -- Priority 1: The End Marker -- if not in_triple_comment and not mud and da.startswith(end_marker, i): if not is_first_char_offset_applied: - po[0] -= l * 1.5; is_first_char_offset_applied = True + po[0] -= l * 1.5 + is_first_char_offset_applied = True for c in end_marker: big = nc < zc po[0] += l - s.statkids.append(tw(text=c, position=(po[0], po[1] - (3 if big else 0)), h_align='center', v_align='top', parent=q1, big=big, color=s.COL_END_MARKER)) + s.statkids.append(tw(text=c, position=( + po[0], po[1] - (3 if big else 0)), h_align='center', v_align='top', parent=q1, big=big, color=s.COL_END_MARKER)) nc += 1 i += len(end_marker) continue @@ -1000,20 +1074,28 @@ class FileMan(MainWindow): chunk = da[i:i+3] if not in_triple_comment or chunk == triple_quote_char * 3: if not is_first_char_offset_applied: - po[0] -= l * 1.5; is_first_char_offset_applied = True + po[0] -= l * 1.5 + is_first_char_offset_applied = True if not in_triple_comment: - in_triple_comment = True; triple_quote_char = chunk[0] + in_triple_comment = True + triple_quote_char = chunk[0] else: - in_triple_comment = False; triple_quote_char = None + in_triple_comment = False + triple_quote_char = None for _ in range(3): - big = nc < zc; po[0] += l - s.statkids.append(tw(text=da[i], position=(po[0], po[1] - (3 if big else 0)), h_align='center', v_align='top', parent=q1, big=big, color=s.COL3 if big else s.COL0)) - nc += 1; i += 1 + big = nc < zc + po[0] += l + s.statkids.append(tw(text=da[i], position=( + po[0], po[1] - (3 if big else 0)), h_align='center', v_align='top', parent=q1, big=big, color=s.COL3 if big else s.COL0)) + nc += 1 + i += 1 continue # -- Priority 3: Newlines -- if i + 1 < z and da[i:i+2] == '\\n': - po[0] = pos[0]-l*1.5; po[1] -= hh; nc = 0 + po[0] = pos[0]-l*1.5 + po[1] -= hh + nc = 0 try: mud = int(da[i + 2 + off] == '#' and not in_triple_comment) except IndexError: @@ -1024,157 +1106,196 @@ class FileMan(MainWindow): # -- Priority 4: Render based on state (comment or code) -- # Apply the critical offset before rendering the first character if not is_first_char_offset_applied: - po[0] -= l * 1.5; is_first_char_offset_applied = True + po[0] -= l * 1.5 + is_first_char_offset_applied = True if in_triple_comment or mud: big = nc < zc - color = (s.COL0 if big else s.COL3) if in_triple_comment else (s.COL10 if big else s.COL11) + color = (s.COL0 if big else s.COL3) if in_triple_comment else ( + s.COL10 if big else s.COL11) po[0] += l - s.statkids.append(tw(text=da[i], position=(po[0], po[1] - (3 if big else 0)), h_align='center', v_align='top', parent=q1, big=big, color=color)) - nc += 1; i += 1 + s.statkids.append(tw(text=da[i], position=( + po[0], po[1] - (3 if big else 0)), h_align='center', v_align='top', parent=q1, big=big, color=color)) + nc += 1 + i += 1 continue # -- Priority 5: Python Syntax Highlighting -- - char = da[i]; token = char; token_color = s.COL2 + char = da[i] + token = char + token_color = s.COL2 if char in ("'", '"'): k = i + 1 - while k < z and (da[k] != char or da[k-1] == '\\'): k += 1 - token = da[i:k+1]; token_color = s.COL_STRING + while k < z and (da[k] != char or da[k-1] == '\\'): + k += 1 + token = da[i:k+1] + token_color = s.COL_STRING elif char.isdigit() or (char == '.' and i + 1 < z and da[i+1].isdigit()): k = i - while k < z and (da[k].isdigit() or da[k] == '.'): k += 1 - token = da[i:k]; token_color = s.COL_NUMBER + while k < z and (da[k].isdigit() or da[k] == '.'): + k += 1 + token = da[i:k] + token_color = s.COL_NUMBER elif char.isalpha() or char == '_': k = i - while k < z and (da[k].isalnum() or da[k] == '_'): k += 1 + while k < z and (da[k].isalnum() or da[k] == '_'): + k += 1 token = da[i:k] - if token in PYTHON_KEYWORDS: token_color = s.COL_KEYWORD - elif token in PYTHON_BUILTINS: token_color = s.COL_BUILTIN - elif char in OPERATORS: token_color = s.COL_OPERATOR - elif char in BRACKETS: token_color = s.COL_BRACKET + if token in PYTHON_KEYWORDS: + token_color = s.COL_KEYWORD + elif token in PYTHON_BUILTINS: + token_color = s.COL_BUILTIN + elif char in OPERATORS: + token_color = s.COL_OPERATOR + elif char in BRACKETS: + token_color = s.COL_BRACKET for c in token: - big = nc < zc; po[0] += l - s.statkids.append(tw(text=c, position=(po[0], po[1] - (3 if big else 0)), h_align='center', v_align='top', parent=q1, big=big, color=token_color)) + big = nc < zc + po[0] += l + s.statkids.append(tw(text=c, position=( + po[0], po[1] - (3 if big else 0)), h_align='center', v_align='top', parent=q1, big=big, color=token_color)) nc += 1 i += len(token) - cw(q0,visible_child=tw(parent=q0, text='', position=(0,rys))) - cw(q1,visible_child=tw(parent=q1, text='', position=(0,rys))) - def stata(s,i): + cw(q0, visible_child=tw(parent=q0, text='', position=(0, rys))) + cw(q1, visible_child=tw(parent=q1, text='', position=(0, rys))) + + def stata(s, i): if not s.oops: n = s.statp + s.stat*i ok = len(s.statda) if ok <= n: - s.btw('Reached EOF!',du=1) + s.btw('Reached EOF!', du=1) return if n < 0: - s.btw('Already at first chunk!',du=1) + s.btw('Already at first chunk!', du=1) return s.snd('deek') s.statp = n - if i<0: [s.statl.pop(-1) for _ in [0,0]] + if i < 0: + [s.statl.pop(-1) for _ in [0, 0]] s.itw() else: s.btw('No more open file buffers!') + def cpsharel(s): l = s.vsharel() - if not l: return + if not l: + return COPY(str(l)) - s.ding(1,1) + s.ding(1, 1) s.push(f"Copied '{l}' to clipboard!") + def opsharel(s): l = s.vsharel() - if not l: return + if not l: + return s.snd('deek') open_url(l) + def vsharel(s): - l = getattr(s,'sharel',0) + l = getattr(s, 'sharel', 0) if not l: s.btw("Upload first!") return return l + def cupload(s): c = s.uploadc s.spyt = s.sharel = s.buf = s.uploadc = None if c: c.close() - s.ding(0,0) + s.ding(0, 0) s.push('Cancelled!') - else: s.laz() - cw(s.uploadp,transition='out_scale') + else: + s.laz() + cw(s.uploadp, transition='out_scale') + def upload(s): f = s.sl[1] - s.ding(1,0) + s.ding(1, 0) s.push('Uploading...') - Thread(target=Call(s._upload,f)).start() - s.spyt = tuck(0.2,Call(s.spy,s.on_upload),repeat=True) + Thread(target=Call(s._upload, f)).start() + s.spyt = tuck(0.2, Call(s.spy, s.on_upload), repeat=True) + def _upload(s, l): try: c = s.uploadc = GO('bashupload.com') filename = basename(l) url_path = '/' + filename - with open(l, 'rb') as f: body = f.read() + with open(l, 'rb') as f: + body = f.read() headers = {'Content-Type': 'application/octet-stream'} c.request('POST', url_path, body=body, headers=headers) s.buf = c.getresponse().read().decode() except Exception: - if s.uploadc: s.buf = '' + if s.uploadc: + s.buf = '' finally: if s.uploadc: s.uploadc.close() s.uploadc = s.sharel = None - def on_upload(s,t): + + def on_upload(s, t): if not t: s.btw("Couldn't upload") return s.sharel = t.splitlines()[5][5:]+'?download=1' - s.ding(0,1) + s.ding(0, 1) s.push('Success!') - obw(s.cpsharelb,label='Copy Direct URL') - obw(s.opsharelb,label=s.sharel) - def ding(s,i,j): - a = ['Small',''] - x,y = a[i],a[j] + obw(s.cpsharelb, label='Copy Direct URL') + obw(s.opsharelb, label=s.sharel) + + def ding(s, i, j): + a = ['Small', ''] + x, y = a[i], a[j] s.snd('ding'+x) - teck(0.1,gs('ding'+y).play) - def beep(s,i,j): + teck(0.1, gs('ding'+y).play) + + def beep(s, i, j): s.snd(f'raceBeep{str(i+1)}') - teck(0.1,gs(f'raceBeep{str(j+1)}').play) - def spy(s,f): - if s.buf is None: return + teck(0.1, gs(f'raceBeep{str(j+1)}').play) + + def spy(s, f): + if s.buf is None: + return b = s.buf s.buf = None f(b) s.spyt = None + def cancel(s): c = s.clp s.clp = None s.push('Cancelled!') s.snd('deek') - s.fresh(skip=c!=4) - def fresh(s,skip=False,sl=None): - if s.gn: return - rx,ry = res() - z = s.size = (rx*0.8,ry*0.8) - x,y = z + s.fresh(skip=c != 4) + + def fresh(s, skip=False, sl=None): + if s.gn: + return + rx, ry = res() + z = s.size = (rx*0.8, ry*0.8) + x, y = z # root - cw(s.p,size=z) - iw(s.bg,size=z) - obw(s.bg2,size=z) - iw(s.rect,size=(x*1.2,y*1.2),position=(-x*0.1,-y*0.1)) + cw(s.p, size=z) + iw(s.bg, size=z) + obw(s.bg2, size=z) + iw(s.rect, size=(x*1.2, y*1.2), position=(-x*0.1, -y*0.1)) # docks, secs, btns h = (x-80) f = y-191 v = 18 for i in range(3): - e = h/[2,3,6][i] - iw(s.docs[i],size=(e,100),position=(v,f)) - tw(s.secs[i],position=(v+e/2-23,f+1)) - a = s.btns[i]; l = int(len(a)/2) - bh = (e-[6,5,4][i]*10-(l-1)*10)/l + e = h/[2, 3, 6][i] + iw(s.docs[i], size=(e, 100), position=(v, f)) + tw(s.secs[i], position=(v+e/2-23, f+1)) + a = s.btns[i] + l = int(len(a)/2) + bh = (e-[6, 5, 4][i]*10-(l-1)*10)/l for j in range(l): - for k in [0,l]: + for k in [0, l]: zz = bh of = 20 ga = ( @@ -1185,62 +1306,66 @@ class FileMan(MainWindow): if ga and s.clp: zz -= 40 of -= 2 - po = v+of+(bh+20)*j,f+60-30*bool(k) + po = v+of+(bh+20)*j, f+60-30*bool(k) ww = a[j+k] - obw(ww,position=po,size=(zz,25)) + obw(ww, position=po, size=(zz, 25)) if not ga: if i == 1 and j == k == 0: - obw(ww,label=['Star','Unstar'][var('cwd') in var('star')]) + obw(ww, label=['Star', 'Unstar'][var('cwd') in var('star')]) elif i == 1 and j == 0 and k: - tw(s.fltxt,position=(po[0]-2,po[1]-2)) - tw(s.flh,position=(po[0],po[1]-2),max_height=37,maxwidth=zz-42) - obw(s.gab2,position=(po[0]+zz-32,po[1])) + tw(s.fltxt, position=(po[0]-2, po[1]-2)) + tw(s.flh, position=(po[0], po[1]-2), max_height=37, maxwidth=zz-42) + obw(s.gab2, position=(po[0]+zz-32, po[1])) if s.flon: - obw(ww,size=(0,0),label='') - tw(s.fltxt,size=(zz-38,27)) - tw(s.flh,text='' if s.rfl else 'Write something...') - obw(s.gab2,size=(bh-(zz-38),25),label='X') + obw(ww, size=(0, 0), label='') + tw(s.fltxt, size=(zz-38, 27)) + tw(s.flh, text='' if s.rfl else 'Write something...') + obw(s.gab2, size=(bh-(zz-38), 25), label='X') if not s.fltk: s.rflo = s.fltk = '' - s.fltk = tuck(0.1,s.onfl,repeat=True) + s.fltk = tuck(0.1, s.onfl, repeat=True) else: - obw(ww,size=(zz,25),label='Filter') - tw(s.fltxt,size=(0,0),text='') - tw(s.flh,text='') - obw(s.gab2,size=(0,0),label='') + obw(ww, size=(zz, 25), label='Filter') + tw(s.fltxt, size=(0, 0), text='') + tw(s.flh, text='') + obw(s.gab2, size=(0, 0), label='') s.rfl = s.rflo = s.fltk = None continue he = bool(s.clp) - obw(s.gab,position=(po[0]+zz+11,po[1]),size=(bh-3-zz,25),label=['','X'][he],selectable=he) - obw(ww,label=[['Copy','Move',0,0,'Rename'][s.clpm],['Paste','Done'][s.clpm==4]][he]) - if not he: s.clpm = None + obw(s.gab, position=(po[0]+zz+11, po[1]), + size=(bh-3-zz, 25), label=['', 'X'][he], selectable=he) + obw(ww, label=[['Copy', 'Move', 0, 0, 'Rename'] + [s.clpm], ['Paste', 'Done'][s.clpm == 4]][he]) + if not he: + s.clpm = None v += e+20 # back f = y-70 - obw(s.bb,position=(20,f),size=(50,50)) + obw(s.bb, position=(20, f), size=(50, 50)) # up - obw(s.ub,position=(90,f),size=(50,50)) + obw(s.ub, position=(90, f), size=(50, 50)) # url e = x - 398 - obw(s.urlbg,size=(e,50),position=(195,f)) - tw(s.urlt,position=(180,y-60),maxwidth=x-370) + obw(s.urlbg, size=(e, 50), position=(195, f)) + tw(s.urlt, position=(180, y-60), maxwidth=x-370) # rf - obw(s.rfb,position=(251+e,f),size=(50,50)) + obw(s.rfb, position=(251+e, f), size=(50, 50)) # pre - obw(s.preb,position=(323+e,f),size=(50,50)) + obw(s.preb, position=(323+e, f), size=(50, 50)) # skip the rest - if skip: return + if skip: + return # drop s.droc() # oke fly = 35 - sx,sy = x-37,y-230 + sx, sy = x-37, y-230 h = sx/6 v = 30 - rat = [3,1,1,1] - for i,_ in enumerate(s.okes): + rat = [3, 1, 1, 1] + for i, _ in enumerate(s.okes): j = rat[i] - tw(_,position=(v+[30,0][i!=0],sy-15)) + tw(_, position=(v+[30, 0][i != 0], sy-15)) v += h*j # push s.rpush() @@ -1260,36 +1385,38 @@ class FileMan(MainWindow): fl = [_ for _ in fl if (_ == '..') or (u in basename(_))] cur = s.sl[1] if cur: - if cur in fl: sl = cur - else: s.sl = (None,None) + if cur in fl: + sl = cur + else: + s.sl = (None, None) # yes rsy = len(fl)*fly - sw(s.yesp1,size=(sx,sy-40)) - cw(s.yesp2,size=(sx,rsy)) - tw(s.lmao,position=(0,rsy)) - iw(s.yesbg,size=(sx,sy)) - iw(s.yesbg2,size=(sx,40),position=(20,sy-20)) + sw(s.yesp1, size=(sx, sy-40)) + cw(s.yesp2, size=(sx, rsy)) + tw(s.lmao, position=(0, rsy)) + iw(s.yesbg, size=(sx, sy)) + iw(s.yesbg2, size=(sx, 40), position=(20, sy-20)) # files - for i,_ in enumerate(fl): + for i, _ in enumerate(fl): if _ == sl: - s.sl = (i,_) + s.sl = (i, _) v = 15 hm = s.gdata(_) for k in range(4): j = rat[k] e = h*j - ee = [30,0][k!=0] - po = (v+ee,rsy-fly-fly*i) + ee = [30, 0][k != 0] + po = (v+ee, rsy-fly-fly*i) t = tw( parent=p, - size=(e-15-ee,fly), + size=(e-15-ee, fly), position=po, text=hm[k], maxwidth=e-15-ee, v_align='center', selectable=True, click_activate=True, - on_activate_call=Call(s._sl,i,_,fl), + on_activate_call=Call(s._sl, i, _, fl), glow_type='uniform', allow_clear_button=False ) @@ -1298,40 +1425,46 @@ class FileMan(MainWindow): bn = basename(_) ret = [] while True: - nxt = bn.find(u,ci) - if nxt == -1: break + nxt = bn.find(u, ci) + if nxt == -1: + break bf = bn[:nxt] ret.append(tw( parent=p, text=u, - position=(po[0]+GSW(bf),po[1]+3), + position=(po[0]+GSW(bf), po[1]+3), v_align='center' )) ci = nxt + len(u) s.flkids.append(ret) if ee: s.fcons.append(iw( - position=(po[0]-ee-8,po[1]+1), + position=(po[0]-ee-8, po[1]+1), texture=s.gtex(_), - size=(ee+1,ee+1), + size=(ee+1, ee+1), parent=p )) v += e - if k: s.ftrash.append(t) - else: s.fkids.append(t) + if k: + s.ftrash.append(t) + else: + s.fkids.append(t) if _ == sl: - cw(s.yesp2,visible_child=t) + cw(s.yesp2, visible_child=t) s.slco(fl) + def onfl(s): s.rfl = tw(query=s.fltxt) if s.rfl != s.rflo: s.rflo = s.rfl s.fresh(sl=s.sl[1]) + def unfl(s): s.flon = False s.snd('deek') s.fresh(sl=s.sl[1]) - def gtex(s,_): + + def gtex(s, _): ty = s.gtype(_) t = ( 'replayIcon' if _ == '..' else @@ -1344,66 +1477,87 @@ class FileMan(MainWindow): 'file' ) return gt(t) - def slco(s,fl): + + def slco(s, fl): # cancel rename - if s.clp == 4: s.cancel() + if s.clp == 4: + s.cancel() sli = s.sl[0] - for i,g in enumerate(zip(fl,s.fkids,s.fcons)): - _,w,r = g - c = [(s.COL10,s.COL11),(s.COL8,s.COL9)][isdir(_)][sli == i] - tw(w,color=c,editable=False) - iw(r,color=c) - for i,z in enumerate(s.flkids): + for i, g in enumerate(zip(fl, s.fkids, s.fcons)): + _, w, r = g + c = [(s.COL10, s.COL11), (s.COL8, s.COL9)][isdir(_)][sli == i] + tw(w, color=c, editable=False) + iw(r, color=c) + for i, z in enumerate(s.flkids): for j in z: - tw(j,color=[s.COL0,s.COL3][sli==i]) - def _sl(s,i,_,fl): + tw(j, color=[s.COL0, s.COL3][sli == i]) + + def _sl(s, i, _, fl): if s.sl[0] == i: - if isdir(_): s.cd(_) - else: s.act(0,5,gay=True) + if isdir(_): + s.cd(_) + else: + s.act(0, 5, gay=True) return - s.sl = (i,_) + s.sl = (i, _) s.slco(fl) - def gdata(s,_): + + def gdata(s, _): b = isdir(_) - try: mt = DT.fromtimestamp(getmtime(_)).strftime('%m/%d/%Y %I:%M %p') - except: mt = '?' - try: sz = FMT(getsize(_)) - except: sz = '?' + try: + mt = DT.fromtimestamp(getmtime(_)).strftime('%m/%d/%Y %I:%M %p') + except: + mt = '?' + try: + sz = FMT(getsize(_)) + except: + sz = '?' return ( basename(_), s.gtype(_), '' if b else mt, '' if b else sz ) - def gtype(s,_): - if isdir(_): return ['Folder','Parent'][_=='..'] + + def gtype(s, _): + if isdir(_): + return ['Folder', 'Parent'][_ == '..'] f = 'File' h = guess_type(_)[0] or f - if not '.' in _: return h.title() + if not '.' in _: + return h.title() if h == f: return { - 'brp':'Replay', - 'bob':'Mesh', - 'cob':'Mesh', - 'ogg':'Audio', - 'ktx':'Texture', - 'fdata':'Font' - }.get(_.split('.')[-1],f) - else: return h.title() + 'brp': 'Replay', + 'bob': 'Mesh', + 'cob': 'Mesh', + 'ogg': 'Audio', + 'ktx': 'Texture', + 'fdata': 'Font' + }.get(_.split('.')[-1], f) + else: + return h.title() + def gfull(s): c = var('cwd') h = [] - if dirname(c) != c: h = ['..'] - if not access(c, R_OK): return h - items = [join(c,_) for _ in ls(c)] + if dirname(c) != c: + h = ['..'] + if not access(c, R_OK): + return h + items = [join(c, _) for _ in ls(c)] da = {} for item in items: name, item_type, date_modified_str, _ = s.gdata(item) try: - date_sortable = DT.strptime(date_modified_str, '%m/%d/%Y %I:%M %p') if date_modified_str else DT.min - except: date_sortable = DT.min - try: mt = getmtime(item) - except: mt = 0 + date_sortable = DT.strptime( + date_modified_str, '%m/%d/%Y %I:%M %p') if date_modified_str else DT.min + except: + date_sortable = DT.min + try: + mt = getmtime(item) + except: + mt = 0 da[item] = (basename(item).lower(), item_type.lower(), date_sortable, mt, isdir(item)) return h + sorted(items, key=lambda i: ( not da[i][4], @@ -1412,6 +1566,7 @@ class FileMan(MainWindow): da[i][2] if s.sorti == 2 else da[i][3] )) + def pre(s): s.wop() r = s._pre() @@ -1423,76 +1578,80 @@ class FileMan(MainWindow): background=False, transition='in_scale', scale_origin_stack_offset=pc, - on_outside_click_call=lambda:(cw(p,transition='out_scale'),s.laz()), - size=(xs,ys), - stack_offset=(pc[0]-xs/2+27,pc[1]-ys/2+27) + on_outside_click_call=lambda: (cw(p, transition='out_scale'), s.laz()), + size=(xs, ys), + stack_offset=(pc[0]-xs/2+27, pc[1]-ys/2+27) ) s.killme.append(p) iw( parent=p, - size=(xs*1.2,ys*1.2), + size=(xs*1.2, ys*1.2), texture=gt('softRect'), - opacity=[0.2,0.55][s.amoled], - position=(-xs*0.1,-ys*0.1), + opacity=[0.2, 0.55][s.amoled], + position=(-xs*0.1, -ys*0.1), color=s.COL5 ) iw( parent=p, - size=(xs,ys), + size=(xs, ys), texture=gt('white'), color=s.COL1, opacity=0.7 ) p2 = sw( parent=p, - size=(xs,ys) + size=(xs, ys) ) rys = 30*len(r) p3 = cw( parent=p2, - size=(xs,max(ys,rys)), + size=(xs, max(ys, rys)), background=False ) - for i,_ in enumerate(r): - j,k = _ + for i, _ in enumerate(r): + j, k = _ tw( parent=p3, - size=(xs,30), - position=(0,rys-30-30*i), + size=(xs, 30), + position=(0, rys-30-30*i), maxwidth=xs-20, text=j, click_activate=True, selectable=True, glow_type='uniform', - on_activate_call=Call(s.pres,k) + on_activate_call=Call(s.pres, k) ) - def pres(s,k): + + def pres(s, k): GUN() - cw(s.prep,transition='out_scale') + cw(s.prep, transition='out_scale') s.cd(k) + def _pre(s): e = app.env c = e.cache_directory d = dirname - f = join(d(c),'ballistica_files','ba_data') + f = join(d(c), 'ballistica_files', 'ba_data') g = cs(sc.LOGO_FLAT)+' ' return [ - *[(cs(sc.DPAD_CENTER_BUTTON)+' '+(basename(_) or _),_) for _ in var('star')], - (g+'Mods',e.python_directory_user), - (g+'Replays',rdir()), - (g+'Config',e.config_directory), - (g+'Cache',c), - (g+'Files',f), - (g+'Python',join(f,'python')), - (g+'Meshes',join(f,'meshes')), - (g+'Audio',join(f,'audio')), - (g+'Textures',join(f,'textures')) + *[(cs(sc.DPAD_CENTER_BUTTON)+' '+(basename(_) or _), _) for _ in var('star')], + (g+'Mods', e.python_directory_user), + (g+'Replays', rdir()), + (g+'Config', e.config_directory), + (g+'Cache', c), + (g+'Files', f), + (g+'Python', join(f, 'python')), + (g+'Meshes', join(f, 'meshes')), + (g+'Audio', join(f, 'audio')), + (g+'Textures', join(f, 'textures')) ] + def rf(s): s.snd('ding') s.fresh() c = var('cwd') s.push('Refreshed '+(basename(c) or c)) + def up(s): o = var('cwd') n = dirname(o) @@ -1503,61 +1662,71 @@ class FileMan(MainWindow): return s.cd(n) s.snd('deek') + def glike(s): c = var('cwd') - if not access(c,R_OK): - s.eno = not access(c,X_OK) + if not access(c, R_OK): + s.eno = not access(c, X_OK) s.nah() return [] a = ls(c) f = [] for _ in a: - j = join(c,_) - if isdir(j): f.append(j) + j = join(c, _) + if isdir(j): + f.append(j) r = [_ for _ in f if _.startswith(s.url)] return r + def nah(s): - if s.eno == s.leno: return + if s.eno == s.leno: + return s.leno = s.eno s.push([ "I can't list files here! Write next folder name manually.", "I can't even enter there! Select another folder.", "Already reached root!" - ][s.eno],color=s.enoc(),du=[3,3,2][s.eno]) + ][s.eno], color=s.enoc(), du=[3, 3, 2][s.eno]) + def enoc(s): return [ s.COL7, s.COL4, s.COL2 ][s.eno] - def drop(s,i): - if s.gn: return - s.dro = i>0 + + def drop(s, i): + if s.gn: + return + s.dro = i > 0 s.droc() + def droc(s): s.drol = s.glike() s.rdrop() + def rdrop(s): - if s.gn: return + if s.gn: + return [_.delete() for _ in s.drkids] s.drkids.clear() l = len(s.drol) - if not s.dro or not s.drol or (l==1 and s.drol[0] == s.url): - iw(s.drbg,size=(0,0)) - sw(s.drp1,size=(0,0)) + if not s.dro or not s.drol or (l == 1 and s.drol[0] == s.url): + iw(s.drbg, size=(0, 0)) + sw(s.drp1, size=(0, 0)) return - x,y = s.size + x, y = s.size of = 20 ys = 30*l+of - fys = min(300,ys) + fys = min(300, ys) yp = y-71-fys xs = x-325 xp = 160 - iw(s.drbg,size=(xs,fys),position=(xp,yp)) - sw(s.drp1,size=(xs,fys),position=(xp,yp)) - cw(s.drp2,size=(xs,ys-of)) - for i,_ in enumerate(s.drol): - p = (0,ys-30-30*i-of) + iw(s.drbg, size=(xs, fys), position=(xp, yp)) + sw(s.drp1, size=(xs, fys), position=(xp, yp)) + cw(s.drp2, size=(xs, ys-of)) + for i, _ in enumerate(s.drol): + p = (0, ys-30-30*i-of) s.drkids.append(tw( parent=s.drp2, position=p, @@ -1566,8 +1735,8 @@ class FileMan(MainWindow): selectable=True, click_activate=True, glow_type='uniform', - on_activate_call=Call(s.cd,_), - size=(GSW(_),30) + on_activate_call=Call(s.cd, _), + size=(GSW(_), 30) )) s.drkids.append(tw( parent=s.drp2, @@ -1575,95 +1744,124 @@ class FileMan(MainWindow): text=s.url, color=s.COL4, )) - def push(s,t,color=None,du=2): - if s.gn: return + + def push(s, t, color=None, du=2): + if s.gn: + return s.rly = False s.rlydt = None - tw(s.pusht,color=color or s.COL2) - s.pushe = tuck(du,s.upush) + tw(s.pusht, color=color or s.COL2) + s.pushe = tuck(du, s.upush) s.pushi = 0.05 s.pushq = t s.rpush() + def upush(s): - if s.gn: return + if s.gn: + return s.pushi = -abs(s.pushi) s.pushq = '' s.rpush(1) - def rpush(s,mode=0): - if s.gn: return + + def rpush(s, mode=0): + if s.gn: + return if mode: - tw(s.pusht,text=s.pushq,color=s.COL2) + tw(s.pusht, text=s.pushq, color=s.COL2) return x = s.size[0] t = s.pushq w = GSW(t+' '*3) - iw(s.pushbg,size=(w,30),position=(x/2-w/2,40)) - iw(s.pushbg2,size=(w*1.1,30*1.2),position=((x/2-w/2)-w*0.05,(40)-30*0.1)) - tw(s.pusht,text=t,maxwidth=w*0.95,position=(x/2-25,40)) + iw(s.pushbg, size=(w, 30), position=(x/2-w/2, 40)) + iw(s.pushbg2, size=(w*1.1, 30*1.2), position=((x/2-w/2)-w*0.05, (40)-30*0.1)) + tw(s.pusht, text=t, maxwidth=w*0.95, position=(x/2-25, 40)) + def fpush(s): - if s.gn: return + if s.gn: + return n = s.pusho + s.pushi - if not (1 >= n >= 0): return + if not (1 >= n >= 0): + return s.pusho = n - iw(s.pushbg,opacity=n) - iw(s.pushbg2,opacity=[n*0.4,n][s.amoled]) + iw(s.pushbg, opacity=n) + iw(s.pushbg2, opacity=[n*0.4, n][s.amoled]) + def urlbl(s): - if s.gn: return - if s.p.get_selected_child() not in [s.ub,s.drp2,s.drp1,s.urlbg]+s.drkids: + if s.gn: + return + if s.p.get_selected_child() not in [s.ub, s.drp2, s.drp1, s.urlbg]+s.drkids: s.urlbln = False - if s.dro: s.drop(-1) + if s.dro: + s.drop(-1) return s.urlbln = not s.urlbln - if not s.dro: s.drop(1) + if not s.dro: + s.drop(1) + def urlspy(s): - if s.gn: return + if s.gn: + return s.url = tw(query=s.urla) b1 = exists(s.url) b2 = isdir(s.url) - g1 = access(var('cwd'),R_OK) - g2 = access(s.url,X_OK) + g1 = access(var('cwd'), R_OK) + g2 = access(s.url, X_OK) b = b1 and b2 and g1 and g2 av = not b1 and g1 and not g2 and s.drol - if b or av: s.eno = None + if b or av: + s.eno = None q = s.url != s.urlo - if q: s.droc() + if q: + s.droc() lurl = var('cwd') can = b1 and b2 and s.url != lurl - if can: s.cd(s.url); lurl = s.url + if can: + s.cd(s.url) + lurl = s.url co = ( s.COL2 if b else s.COL3 if av else s.COL6 if not b1 else s.enoc() ) - tw(s.urlt,text=s.url+[' ','|'][s.urlbln or q],color=co) + tw(s.urlt, text=s.url+[' ', '|'][s.urlbln or q], color=co) s.urlo = s.url - if can or isdir(s.url): return + if can or isdir(s.url): + return # complete f = dirname(s.url) - if not exists(f): return - if f == lurl: return - s.cd(f,dry=True) - def cd(s,t,dry=False): - if t == '..': t = dirname(var('cwd')) - s.sl = (None,None) + if not exists(f): + return + if f == lurl: + return + s.cd(f, dry=True) + + def cd(s, t, dry=False): + if t == '..': + t = dirname(var('cwd')) + s.sl = (None, None) if s.flon and s.rfl: - s.push("Filter is active! Press 'X' to cancel.",du=1.2,color=s.COL3) - var('cwd',t) - if s.eno != 1 and not access(t,X_OK): + s.push("Filter is active! Press 'X' to cancel.", du=1.2, color=s.COL3) + var('cwd', t) + if s.eno != 1 and not access(t, X_OK): s.eno = 1 s.nah() - 0 if dry else tw(s.urla,text=t) - cw(s.yesp2,visible_child=s.lmao) + 0 if dry else tw(s.urla, text=t) + cw(s.yesp2, visible_child=s.lmao) s.fresh() + def urled(s): - if s.gn: return + if s.gn: + return s.snd('deek') s.urla.activate() + def wop(s): s.snd('powerup01') + def laz(s): s.snd('laser') + def bye(s): s.gn = True s.trash.clear() @@ -1671,60 +1869,81 @@ class FileMan(MainWindow): s.main_window_back() s.__class__.clean() del s - def snd(s,t): + + def snd(s, t): s.sn = gs(t) s.sn.play() - teck(UF(0.13,0.15),s.sn.stop) + teck(UF(0.13, 0.15), s.sn.stop) + def bga(s): s.urlbln = False + # Tools and Resources # Lambda means it won't be stored in memory unless called -UI = lambda: app.ui_v1 -SCL = lambda a,b,c=None: [a,b,c][UI().uiscale.value] or b -GSW = lambda t: strw(t,suppress_warning=True) -GSH = lambda t: strh(t,suppress_warning=True) -FMT = lambda size: ( +def UI(): return app.ui_v1 + + +def SCL(a, b, c=None): return [a, b, c][UI().uiscale.value] or b +def GSW(t): return strw(t, suppress_warning=True) +def GSH(t): return strh(t, suppress_warning=True) + + +def FMT(size): return ( f"{size / 1024**3:.1f} GB" if size >= 1024**3 else ( - f"{size / 1024**2:.1f} MB" if size >= 1024**2 else ( - f"{size / 1024:.1f} KB" if size >= 1024 else f"{size} B")) + f"{size / 1024**2:.1f} MB" if size >= 1024**2 else ( + f"{size / 1024:.1f} KB" if size >= 1024 else f"{size} B")) ) -GUN = lambda: gs('gunCocking').play() -BASE = lambda: join(dirname(app.env.cache_directory),'ballistica_files','ba_data') -AUDIO = lambda: ls(join(BASE(),'audio')) -TEX = lambda: ls(join(BASE(),'textures')) -SRT = lambda: ['Name','Type','Date Modifed','Size'] -INV = lambda c: ((1-c[0])*2,(1-c[1])*2,(1-c[2])*2) -COL = lambda: [ - (0.5,0.5,0), - (0.17,0.17,0.17), - (1,1,1), - (1,1,0), - (0.6,0.6,0.6), - (0,0,0), - (1,0,0), - (1,0,1), - (0.5,0.25,0), - (1,0.5,0), - (0,0.5,0.5), - (0,1,1) +def GUN(): return gs('gunCocking').play() + + +def BASE(): return join(dirname(app.env.cache_directory), 'ballistica_files', 'ba_data') +def AUDIO(): return ls(join(BASE(), 'audio')) +def TEX(): return ls(join(BASE(), 'textures')) + + +def SRT(): return ['Name', 'Type', 'Date Modifed', 'Size'] +def INV(c): return ((1-c[0])*2, (1-c[1])*2, (1-c[2])*2) + + +def COL(): return [ + (0.5, 0.5, 0), + (0.17, 0.17, 0.17), + (1, 1, 1), + (1, 1, 0), + (0.6, 0.6, 0.6), + (0, 0, 0), + (1, 0, 0), + (1, 0, 1), + (0.5, 0.25, 0), + (1, 0.5, 0), + (0, 0.5, 0.5), + (0, 1, 1) ] # Config -def var(s,v=None): - cfg = app.config; s = 'fm_'+s - return cfg.get(s,v) if v is None else (cfg.__setitem__(s,v),cfg.commit()) -def con(v,t): - if var(v) is None: var(v,t) + + +def var(s, v=None): + cfg = app.config + s = 'fm_'+s + return cfg.get(s, v) if v is None else (cfg.__setitem__(s, v), cfg.commit()) + + +def con(v, t): + if var(v) is None: + var(v, t) + # Default -con('cwd',getcwd()) -con('star',[]) -con('col',COL()) +con('cwd', getcwd()) +con('star', []) +con('col', COL()) # Patches -f = SUB.on_screen_size_change; SUB.on_screen_size_change = lambda *a,**k: (FileMan.resize(),f(*a,**k)) -bw = lambda *a,color=None,textcolor=None,oac=None,bg='white',label='',**k: obw( +f = SUB.on_screen_size_change +SUB.on_screen_size_change = lambda *a, **k: (FileMan.resize(), f(*a, **k)) +bw = lambda *a, color=None, textcolor=None, oac=None, bg='white', label='', **k: obw( *a, on_activate_call=oac, texture=gt(bg), @@ -1738,34 +1957,40 @@ bw = lambda *a,color=None,textcolor=None,oac=None,bg='white',label='',**k: obw( # brobord collide grass # ba_meta require api 9 # ba_meta export babase.Plugin + + class byBordd(Plugin): def on_app_running(s): FileMan.loadc() - teck(0.1,s.kang) + teck(0.1, s.kang) + def kang(s): from bauiv1lib.settings.allsettings import AllSettingsWindow as m i = '__init__' - o = getattr(m,i) - setattr(m,i,lambda z,*a,**k:(o(z,*a,**k),s.mk(z))[0]) - def fix(s,p): + o = getattr(m, i) + setattr(m, i, lambda z, *a, **k: (o(z, *a, **k), s.mk(z))[0]) + + def fix(s, p): m = __import__('logging') i = 'exception' - o = getattr(m,i) - setattr(m,i,lambda *a,**k:0 if s.b == p.get_selected_child() else o(*a,**k)) - def mk(s,z): + o = getattr(m, i) + setattr(m, i, lambda *a, **k: 0 if s.b == p.get_selected_child() else o(*a, **k)) + + def mk(s, z): s.fix(z._root_widget) - x,y = SCL((1000,800),(900,450)) + x, y = SCL((1000, 800), (900, 450)) s.b = obw( - position=(x*0.7,y*SCL(0.5,0.9)), + position=(x*0.7, y*SCL(0.5, 0.9)), parent=z._root_widget, icon=gt('folder'), - size=(100,30), + size=(100, 30), button_type='square', label='Man', enable_sound=False, color=FileMan.COL1, textcolor=FileMan.COL2, - on_activate_call=lambda:s.run(z) + on_activate_call=lambda: s.run(z) ) - def run(s,z): + + def run(s, z): z.main_window_replace(new_window=FileMan(s.b)) diff --git a/plugins/utilities/finder.py b/plugins/utilities/finder.py index ce385eb..50d1647 100755 --- a/plugins/utilities/finder.py +++ b/plugins/utilities/finder.py @@ -44,26 +44,28 @@ from bascenev1 import ( get_game_roster as GGR ) + class Finder: - COL1 = (0,0.3,0.3) - COL2 = (0,0.55,0.55) - COL3 = (0,0.7,0.7) - COL4 = (0,1,1) - COL5 = (1,1,0) + COL1 = (0, 0.3, 0.3) + COL2 = (0, 0.55, 0.55) + COL3 = (0, 0.7, 0.7) + COL4 = (0, 1, 1) + COL5 = (1, 1, 0) MAX = 0.3 TOP = 15 VER = '1.0' MEM = [] BST = [] SL = None - def __init__(s,src): + + def __init__(s, src): s.thr = [] s.ikids = [] s.busy = False s.s1 = s.snd('powerup01') c = s.__class__ # parent - z = (460,400) + z = (460, 400) s.p = cw( scale_origin_stack_offset=src.get_screen_space_center(), size=z, @@ -80,12 +82,12 @@ class Finder: parent=s.p, text='Fetch Servers', color=s.COL4, - position=(19,359) + position=(19, 359) ) bw( parent=s.p, - position=(360,343), - size=(80,39), + position=(360, 343), + size=(80, 39), label='Fetch', color=s.COL2, textcolor=s.COL4, @@ -96,14 +98,14 @@ class Finder: text='Fetches, pings, and sorts public servers.', color=s.COL3, scale=0.8, - position=(15,330), + position=(15, 330), maxwidth=320 ) # separator iw( parent=s.p, - size=(429,1), - position=(17,330), + size=(429, 1), + position=(17, 330), texture=gt('white'), color=s.COL2 ) @@ -112,12 +114,12 @@ class Finder: parent=s.p, text='Cycle Servers', color=s.COL4, - position=(19,294) + position=(19, 294) ) bw( parent=s.p, - position=(360,278), - size=(80,39), + position=(360, 278), + size=(80, 39), label='Cycle', color=s.COL2, textcolor=s.COL4, @@ -128,15 +130,15 @@ class Finder: text='Cycles through best servers and saves their players.', color=s.COL3, scale=0.8, - position=(15,265), + position=(15, 265), maxwidth=320, v_align='center' ) # separator iw( parent=s.p, - size=(429,1), - position=(17,265), + size=(429, 1), + position=(17, 265), texture=gt('white'), color=s.COL2 ) @@ -145,12 +147,12 @@ class Finder: parent=s.p, text='Server Cycle Limit', color=s.COL4, - position=(19,230) + position=(19, 230) ) s.top = tw( parent=s.p, - position=(398,228), - size=(80,50), + position=(398, 228), + size=(80, 50), text=str(c.TOP), color=s.COL4, editable=True, @@ -167,76 +169,78 @@ class Finder: text='Maximum number of servers to cycle.', color=s.COL3, scale=0.8, - position=(15,201), + position=(15, 201), maxwidth=320 ) # separator iw( parent=s.p, - size=(429,1), - position=(17,200), + size=(429, 1), + position=(17, 200), texture=gt('white'), color=s.COL2 ) # players pl = s.plys() - sy = max(len(pl)*30,140) + sy = max(len(pl)*30, 140) p1 = sw( parent=s.p, - position=(20,18), - size=(205,172), + position=(20, 18), + size=(205, 172), border_opacity=0.4 ) p2 = ocw( parent=p1, - size=(205,sy), + size=(205, sy), background=False ) 0 if pl else tw( parent=s.p, - position=(90,100), + position=(90, 100), text='Cycle some servers\nto collect players', color=s.COL4, maxwidth=175, h_align='center' ) s.kids = [] - for _,g in enumerate(pl): - p,a = g + for _, g in enumerate(pl): + p, a = g s.kids.append(tw( parent=p2, - size=(200,30), + size=(200, 30), selectable=True, click_activate=True, color=s.COL3, text=p, - position=(0,sy-30-30*_), + position=(0, sy-30-30*_), maxwidth=175, - on_activate_call=Call(s.hl,_,p), + on_activate_call=Call(s.hl, _, p), v_align='center' )) # info iw( parent=s.p, - position=(235,18), - size=(205,172), + position=(235, 18), + size=(205, 172), texture=gt('scrollWidget'), mesh_transparent=gm('softEdgeOutside'), opacity=0.4 ) s.tip = tw( parent=s.p, - position=(310,98), + position=(310, 98), text='Select something to\nview server info', color=s.COL4, maxwidth=170, h_align='center' ) if c.SL is None else 0 - def hl(s,_,p): - [tw(t,color=s.COL3) for t in s.kids] - tw(s.kids[_],color=s.COL4) + + def hl(s, _, p): + [tw(t, color=s.COL3) for t in s.kids] + tw(s.kids[_], color=s.COL4) s.info(p) - def info(s,p): + + def info(s, p): [_.delete() for _ in s.ikids] s.ikids.clear() s.tip and s.tip.delete() @@ -250,61 +254,69 @@ class Finder: t = str(i['nap'[_]]) s.ikids.append(tw( parent=s.p, - position=(250,155-40*_), + position=(250, 155-40*_), h_align='center', v_align='center', maxwidth=175, text=t, color=s.COL4, - size=(175,30), + size=(175, 30), selectable=True, click_activate=True, - on_activate_call=Call(s.copy,t) + on_activate_call=Call(s.copy, t) )) s.ikids.append(bw( parent=s.p, - position=(253,30), - size=(166,30), + position=(253, 30), + size=(166, 30), label='Connect', color=s.COL2, textcolor=s.COL4, - oac=Call(CON,i['a'],i['p'],False) + oac=Call(CON, i['a'], i['p'], False) )) - def copy(s,t): - s.ding(1,1) + + def copy(s, t): + s.ding(1, 1) TIP('Copied to clipboard!') COPY(t) + def plys(s): z = [] me = app.plus.get_v1_account_name() - me = [me,'\ue063'+me] + me = [me, '\ue063'+me] for _ in s.__class__.BST: a = _['a'] - if (r:=_.get('roster',{})): + if (r := _.get('roster', {})): for p in r: ds = p['display_string'] - 0 if ds in me else z.append((ds,a)) - return sorted(z,key=lambda _: _[0].startswith('\ue030Server')) - def snd(s,t): + 0 if ds in me else z.append((ds, a)) + return sorted(z, key=lambda _: _[0].startswith('\ue030Server')) + + def snd(s, t): l = gs(t) l.play() - teck(uf(0.14,0.18),l.stop) + teck(uf(0.14, 0.18), l.stop) return l + def bye(s): s.s1.stop() - ocw(s.p,transition='out_scale') + ocw(s.p, transition='out_scale') l = s.snd('laser') - f = lambda: teck(0.01,f) if s.p else l.stop() + def f(): return teck(0.01, f) if s.p else l.stop() f() - def ding(s,i,j): - a = ['Small',''] - x,y = a[i],a[j] + + def ding(s, i, j): + a = ['Small', ''] + x, y = a[i], a[j] s.snd('ding'+x) - teck(0.1,gs('ding'+y).play) + teck(0.1, gs('ding'+y).play) + def fresh(s): - if s.busy: BTW("Still busy!"); return + if s.busy: + BTW("Still busy!") + return TIP('Fetching servers...') - s.ding(1,0) + s.ding(1, 0) s.busy = True p = app.plus p.add_v1_account_transaction( @@ -316,15 +328,17 @@ class Finder: callback=s.kang, ) p.run_v1_account_transactions() - def kang(s,r): + + def kang(s, r): c = s.__class__ c.MEM = r['l'] s.thr = [] for _ in s.__class__.MEM: - t = Thread(target=Call(s.ping,_)) + t = Thread(target=Call(s.ping, _)) s.thr.append(t) t.start() - teck(s.MAX*4,s.join) + teck(s.MAX*4, s.join) + def join(s): c = s.__class__ [t.join() for t in s.thr] @@ -333,10 +347,13 @@ class Finder: c.MEM.sort(key=lambda _: _['ping']) s.thr.clear() TIP(f'Loaded {len(c.MEM)} servers!') - s.ding(0,1) + s.ding(0, 1) s.busy = False + def find(s): - if s.busy: BTW("Still busy!"); return + if s.busy: + BTW("Still busy!") + return c = s.__class__ if not c.MEM: BTW('Fetch some servers first!') @@ -347,44 +364,55 @@ class Finder: return top = int(t) if not (0 < top < len(c.MEM)): - BTW('Cycle count is too '+['big','small'][top<=0]+'!') + BTW('Cycle count is too '+['big', 'small'][top <= 0]+'!') return c.TOP = top - s.ding(1,0) + s.ding(1, 0) TIP('Starting cycle...') s.busy = True s.ci = s.lr = 0 c.BST = c.MEM[:top] s.cycle() + def cycle(s): _ = s.__class__.BST[s.ci] s.ca = _['a'] - CON(s.ca,_['p'],False) + CON(s.ca, _['p'], False) s.wait() - def wait(s,i=5): + + def wait(s, i=5): r = GGR() - if (r != s.lr) and r: s.__class__.BST[s.ci]['roster'] = s.lr = r; return s.next() - if not i: s.__class__.BST[s.ci]['roster'] = []; return s.next() - teck(0.1,Call(s.wait,i-1)) + if (r != s.lr) and r: + s.__class__.BST[s.ci]['roster'] = s.lr = r + return s.next() + if not i: + s.__class__.BST[s.ci]['roster'] = [] + return s.next() + teck(0.1, Call(s.wait, i-1)) + def next(s): s.ci += 1 if s.ci >= len(s.__class__.BST): BYE() - teck(0.5,s.yay) + teck(0.5, s.yay) return s.cycle() + def yay(s): TIP('Cycle finished!') - s.ding(0,1) + s.ding(0, 1) s.busy = False zw('squad_button').activate() - teck(0.3,byBordd.up) - def ping(s,_): + teck(0.3, byBordd.up) + + def ping(s, _): sock = ping = None - a,p = _['a'],_['p'] - sock = socket(IPT(a),SOCK_DGRAM) - try: sock.connect((a,p)) - except: ping = None + a, p = _['a'], _['p'] + sock = socket(IPT(a), SOCK_DGRAM) + try: + sock.connect((a, p)) + except: + ping = None else: st = time() sock.settimeout(s.MAX) @@ -393,7 +421,8 @@ class Finder: try: sock.send(b'\x0b') r = sock.recv(10) - except: r = None + except: + r = None if r == b'\x0c': yes = True break @@ -403,28 +432,29 @@ class Finder: _['ping'] = ping sock.close() + # Patches -bw = lambda *,oac=None,**k: obw( +bw = lambda *, oac=None, **k: obw( texture=gt('white'), on_activate_call=oac, enable_sound=False, **k ) -cw = lambda *,size=None,oac=None,**k: (p:=ocw( +cw = lambda *, size=None, oac=None, **k: (p := ocw( parent=zw('overlay_stack'), background=False, transition='in_scale', size=size, on_outside_click_call=oac, **k -)) and (p,iw( +)) and (p, iw( parent=p, texture=gt('softRect'), - size=(size[0]*1.2,size[1]*1.2), - position=(-size[0]*0.1,-size[1]*0.1), + size=(size[0]*1.2, size[1]*1.2), + position=(-size[0]*0.1, -size[1]*0.1), opacity=0.55, - color=(0,0,0) -),iw( + color=(0, 0, 0) +), iw( parent=p, size=size, texture=gt('white'), @@ -432,40 +462,47 @@ cw = lambda *,size=None,oac=None,**k: (p:=ocw( )) # Global -BTW = lambda t: (push(t,color=(1,1,0)),gs('block').play()) -TIP = lambda t: push(t,Finder.COL3) + + +def BTW(t): return (push(t, color=(1, 1, 0)), gs('block').play()) +def TIP(t): return push(t, Finder.COL3) # ba_meta require api 9 # ba_meta export babase.Plugin + + class byBordd(Plugin): BTN = None + @classmethod def up(c): c.BTN.activate() if c.BTN.exists() else None + def __init__(s): from bauiv1lib import party p = party.PartyWindow a = '__init__' - o = getattr(p,a) - setattr(p,a,lambda z,*a,**k:(o(z,*a,**k),s.make(z))[0]) - def make(s,z): - sz = (80,30) + o = getattr(p, a) + setattr(p, a, lambda z, *a, **k: (o(z, *a, **k), s.make(z))[0]) + + def make(s, z): + sz = (80, 30) p = z._root_widget - x,y = (-60,z._height-45) + x, y = (-60, z._height-45) iw( parent=p, - size=(sz[0]*1.34,sz[1]*1.4), - position=(x-sz[0]*0.14,y-sz[1]*0.20), + size=(sz[0]*1.34, sz[1]*1.4), + position=(x-sz[0]*0.14, y-sz[1]*0.20), texture=gt('softRect'), opacity=0.2, - color=(0,0,0) + color=(0, 0, 0) ) s.b = s.__class__.BTN = bw( parent=p, - position=(x,y), + position=(x, y), label='Finder', color=Finder.COL1, textcolor=Finder.COL3, size=sz, - oac=lambda:Finder(s.b) + oac=lambda: Finder(s.b) ) diff --git a/plugins/utilities/path.py b/plugins/utilities/path.py index 37e76da..df6a152 100755 --- a/plugins/utilities/path.py +++ b/plugins/utilities/path.py @@ -16,12 +16,15 @@ from bascenev1 import ( newnode ) + class Path: - def __init__(s,node,holder=None): - if node.body == 'crate': return - s.node,s.kids = node,[] + def __init__(s, node, holder=None): + if node.body == 'crate': + return + s.node, s.kids = node, [] s.me = holder s.spy() + def spy(s): n = s.node if not n.exists(): @@ -29,13 +32,14 @@ class Path: s.kids.clear() return - [_.delete() for _ in s.kids]; s.kids.clear() + [_.delete() for _ in s.kids] + s.kids.clear() ip = n.position iv = n.velocity if s.me and s.me.hold_node == n: mv = s.me.velocity - iv = (iv[0]+mv[0],iv[1]+mv[1],iv[2]+mv[2]) + iv = (iv[0]+mv[0], iv[1]+mv[1], iv[2]+mv[2]) dots = 200 ti = 1.2 @@ -48,17 +52,17 @@ class Path: py = ip[1] + iv[1] * t + 0.5 * -24 * t**2 pz = ip[2] + iv[2] * t - if py <=0: + if py <= 0: l = newnode( 'locator', owner=n, attrs={ 'shape': 'circleOutline', 'size': [1], - 'color': (1,1,0), + 'color': (1, 1, 0), 'draw_beauty': False, 'additive': True, - 'position':(px,py,pz) + 'position': (px, py, pz) } ) s.kids.append(l) @@ -67,13 +71,13 @@ class Path: 'text', owner=n, attrs={ - 'text':'.', - 'scale':0.02, - 'position':(px, py, pz), - 'flatness':1, - 'in_world':True, - 'color':(1-i*4/dots,0,0), - 'shadow':0 + 'text': '.', + 'scale': 0.02, + 'position': (px, py, pz), + 'flatness': 1, + 'in_world': True, + 'color': (1-i*4/dots, 0, 0), + 'shadow': 0 } ) s.kids.append(dot_node) @@ -81,8 +85,10 @@ class Path: # brobord collide grass # ba_meta require api 9 # ba_meta export babase.Plugin + + class byBordd(Plugin): def __init__(s): _ = __import__('bascenev1lib').actor.bomb.Bomb o = _.__init__ - _.__init__ = lambda z,*a,**k: (o(z,*a,**k),Path(z.node))[0] + _.__init__ = lambda z, *a, **k: (o(z, *a, **k), Path(z.node))[0] diff --git a/plugins/utilities/plugtools.py b/plugins/utilities/plugtools.py index 4ab0ed4..58de52a 100755 --- a/plugins/utilities/plugtools.py +++ b/plugins/utilities/plugtools.py @@ -69,47 +69,54 @@ from ast import ( Name ) + class PlugTools(TAB): KEY = 'PT_BY' + def __init__(s): s.bys = META() s.bad = [] s.logs = 'No errors' - s.mem = {_:MT(_) for _ in s.bys} + s.mem = {_: MT(_) for _ in s.bys} s.eye = look() s.e = False s.spy() + def spy(s): b = 0 for _ in s.bys.copy(): if not exists(PAT(_)): s.bys.remove(_) - push(f'Plugin {_} suddenly disappeared!\nAnd so, was removed from list.',color=(1,1,0)) + push(f'Plugin {_} suddenly disappeared!\nAnd so, was removed from list.', color=(1, 1, 0)) gs('block').play() s.eye = look() - if s.hl() == _: s.hl(None) + if s.hl() == _: + s.hl(None) b = 1 - sp = app.plugins.plugin_specs.get(_,0) - if not sp: continue + sp = app.plugins.plugin_specs.get(_, 0) + if not sp: + continue p = app.plugins - if getattr(sp,'enabled',False): + if getattr(sp, 'enabled', False): o = s.sp.plugin if o in p.active_plugins: p.active_plugins.remove(o) if o in p.plugin_specs: p.plugin_specs.pop(o) - del s.sp.plugin,o + del s.sp.plugin, o collect() - try: reload(modules[NAM(_,0)]) - except: pass + try: + reload(modules[NAM(_, 0)]) + except: + pass continue if MT(_) != s.mem[_] and _ not in s.bad: s.bad.append(_) - push(f'Plugin {_} was modified!\nSee if you want to take action.',color=(1,1,0)) + push(f'Plugin {_} was modified!\nSee if you want to take action.', color=(1, 1, 0)) gs('dingSmall').play() b = 1 - if hasattr(s,'sp'): - e = getattr(s.sp,'enabled',False) + if hasattr(s, 'sp'): + e = getattr(s.sp, 'enabled', False) if e != s.e: s.e = e b = 1 @@ -120,7 +127,8 @@ class PlugTools(TAB): nu = [] if df: for dd in df: - try: _ = kang(dd) + try: + _ = kang(dd) except: eye.remove(dd) continue @@ -132,12 +140,16 @@ class PlugTools(TAB): b = 1 if nu: l = len(nu) - push(f"Found {l} new plugin{['s',''][l==1]}:\n{', '.join(nu)}\nSee what to do with {['it','them'][l!=1]}",color=(1,1,0)) + push(f"Found {l} new plugin{['s', ''][l == 1]}:\n{', '.join(nu)}\nSee what to do with {['it', 'them'][l != 1]}", color=( + 1, 1, 0)) gs('dingSmallHigh').play() if b: - try: s.request_refresh() - except RuntimeError: pass - teck(0.1,s.spy) + try: + s.request_refresh() + except RuntimeError: + pass + teck(0.1, s.spy) + @override def refresh(s): # Preload @@ -146,14 +158,14 @@ class PlugTools(TAB): by = None s.hl(None) s.by = by - s.sp = app.plugins.plugin_specs.get(by,0) if by else 0 - s.i = getattr(s,'i',0 if by is None else s.bys.index(by)//10) + s.sp = app.plugins.plugin_specs.get(by, 0) if by else 0 + s.i = getattr(s, 'i', 0 if by is None else s.bys.index(by)//10) # UI w = s.width x = -w/2 z = x+w # Bools - e = s.e = getattr(s.sp,'enabled',False) + e = s.e = getattr(s.sp, 'enabled', False) m = by in s.bad d = by is None # Buttons @@ -162,23 +174,23 @@ class PlugTools(TAB): z -= sx s.button( 'Metadata', - pos=(z,50), - size=(mx,43), + pos=(z, 50), + size=(mx, 43), call=s.metadata, disabled=d ) s.button( - ['Load','Reload'][e], - pos=(z,5), - size=(mx,43), + ['Load', 'Reload'][e], + pos=(z, 5), + size=(mx, 43), call=s._load, disabled=d ) # Separator s.button( '', - pos=(z-(w*0.006),5), - size=(2,90) + pos=(z-(w*0.006), 5), + size=(2, 90) ) # Plugin info sx = w*0.1 @@ -189,28 +201,28 @@ class PlugTools(TAB): mx = sx*0.9 s.text( t, - pos=(az,80), - scale=1 if tw len(s.bys) ) @@ -231,16 +243,17 @@ class PlugTools(TAB): for i in range(5): for j in range(2): k = j*5+i+s.i*10 - if k >= len(s.bys): break + if k >= len(s.bys): + break t = s.bys[k] tw = GSW(t) s.button( t, - size=(mx,43), - pos=(z+sx*i,50-45*j), - label_scale=1 if tw= len(s.r): s.ri = len(s.r) - 1 - if len(s.r) and s.eri >= len(s.r): s.eri = len(s.r) - 1 + T, B = s.text, s.button + if len(s.r) and s.ri >= len(s.r): + s.ri = len(s.r) - 1 + if len(s.r) and s.eri >= len(s.r): + s.eri = len(s.r) - 1 if s.j[0] == 'JRejoin' and s.ji <= s.re: s.ji = s.re + 1 - push('Job time cannot be less than rejoin time\nwhen job is JRejoin. Updated job time to '+str(s.ji),color=(1,1,0)) + push('Job time cannot be less than rejoin time\nwhen job is JRejoin. Updated job time to ' + + str(s.ji), color=(1, 1, 0)) if s.height > 100: B( cs(sc.UP_ARROW), pos=(x + 10 * sf, 606*zf), - size=(280*sf,35*zf), + size=(280*sf, 35*zf), disabled=s.eri <= 0, - call=Call(s.mv,'eri',-1) + call=Call(s.mv, 'eri', -1) ) B( cs(sc.DOWN_ARROW), pos=(x + 10 * sf, 290*zf), - size=(280*sf,35*zf), + size=(280*sf, 35*zf), disabled=s.eri >= len(s.r)-7, - call=Call(s.mv,'eri',1) + call=Call(s.mv, 'eri', 1) ) nt = "No roster detected\nJoin some public party" w = GSW(nt) @@ -118,20 +131,22 @@ class Power(TAB): pos=(x + 150 * sf, 495*zf), h_align='center', v_align='top', - scale=1 if w<(290*sf) else (290*sf)/w + scale=1 if w < (290*sf) else (290*sf)/w ) - for i,z in enumerate(s.rr.items()): - if i < s.eri: continue - if i>=(s.eri+7): break - n,g = z - c,p = g + for i, z in enumerate(s.rr.items()): + if i < s.eri: + continue + if i >= (s.eri+7): + break + n, g = z + c, p = g w = GSW(n) B( n, size=(280 * sf, 37*zf), pos=(x + 10 * sf, (564-39*(i-s.eri))*zf), - style=[['blue','blue_bright'],['purple','purple_bright']][not p][s.c==c], - call=Call(s.prv,c,p,n), + style=[['blue', 'blue_bright'], ['purple', 'purple_bright']][not p][s.c == c], + call=Call(s.prv, c, p, n), label_scale=1 if w < 280 * sf else (280 * sf)/w ) B( @@ -142,45 +157,46 @@ class Power(TAB): ) bb = s.c is None B( - 'Bomb' if bb else (['Client','Host'][s.c==-1]+f' {s.c}'), + 'Bomb' if bb else (['Client', 'Host'][s.c == -1]+f' {s.c}'), pos=(x + 10 * sf, 230*zf), size=(280 * sf, 40*zf), disabled=bb, - call=Call(push,str(s.n)) + call=Call(push, str(s.n)) ) B( 'Mention', size=(280 * sf, 40*zf), pos=(x + 10 * sf, 185*zf), - call=Call(chat,str(s.n)), + call=Call(chat, str(s.n)), disabled=bb ) B( 'Players', size=(280 * sf, 40*zf), pos=(x + 10 * sf, 140*zf), - call=Call(push,'\n'.join([' '.join([f'{i}={j}' for i,j in _.items()]) for _ in s.p]) if s.p else ''), + call=Call(push, '\n'.join( + [' '.join([f'{i}={j}' for i, j in _.items()]) for _ in s.p]) if s.p else ''), disabled=bb or (not s.p) ) B( 'Kick', size=(280 * sf, 40*zf), pos=(x + 10 * sf, 95*zf), - call=Call(KICK,lambda:s.rr[s.n][0]), - disabled=bb or (s.c==-1) + call=Call(KICK, lambda: s.rr[s.n][0]), + disabled=bb or (s.c == -1) ) B( 'JKick', size=(280 * sf, 40*zf), pos=(x + 10 * sf, 50*zf), - call=Call(s.job,Call(KICK,lambda:s.rr[s.n][0]),['JKick',s.c,s.n]), - disabled=bb or (s.c==-1) + call=Call(s.job, Call(KICK, lambda: s.rr[s.n][0]), ['JKick', s.c, s.n]), + disabled=bb or (s.c == -1) ) B( 'Vote', size=(280 * sf, 40*zf), pos=(x + 10 * sf, 5*zf), - call=Call(chat,'1'), + call=Call(chat, '1'), disabled=not s.r ) B( @@ -189,9 +205,9 @@ class Power(TAB): pos=(x + 300 * sf, 5*zf), style='bright' ) - t = getattr(s.h,'name','Not in a server') - a = getattr(s.h,'address','127.0.0.1') - p = getattr(s.h,'port','43210') + t = getattr(s.h, 'name', 'Not in a server') + a = getattr(s.h, 'address', '127.0.0.1') + p = getattr(s.h, 'port', '43210') w = GSW(t) B( t if t.strip() else 'Loading...', @@ -199,14 +215,15 @@ class Power(TAB): pos=(x + 311 * sf, 606*zf), disabled=not s.h, label_scale=1 if w < 390 * sf else (390 * sf)/w, - call=Call(push,f"{t}\nHosted on build {getattr(s.h,'build_number','0')}" if t.strip() else 'Server is still loading...\nIf it remains stuck on this\nthen either party is full, or a network issue.'), + call=Call(push, f"{t}\nHosted on build {getattr(s.h, 'build_number', '0')}" if t.strip( + ) else 'Server is still loading...\nIf it remains stuck on this\nthen either party is full, or a network issue.'), ) w = GSW(a) B( a, size=(300 * sf, 35*zf), pos=(x + 311 * sf, 568*zf), - call=Call(COPY,a), + call=Call(COPY, a), disabled=not s.h, label_scale=1 if w < 290 * sf else (290 * sf)/w ) @@ -216,7 +233,7 @@ class Power(TAB): size=(97 * sf, 35*zf), pos=(x + 614 * sf, 568*zf), disabled=not s.h, - call=Call(COPY,str(p)), + call=Call(COPY, str(p)), label_scale=1 if w < 90 * sf else (90 * sf)/w ) B( @@ -230,34 +247,35 @@ class Power(TAB): 'Rejoin', size=(200 * sf, 35*zf), pos=(x + 311 * sf, 492*zf), - call=Call(REJOIN,a,p,lambda:s.re), + call=Call(REJOIN, a, p, lambda: s.re), disabled=not s.h ) B( 'JRejoin', size=(197 * sf, 35*zf), pos=(x + 514 * sf, 492*zf), - call=Call(s.job,Call(REJOIN,a,p,lambda:s.re),['JRejoin',a,str(p)]), + call=Call(s.job, Call(REJOIN, a, p, lambda: s.re), ['JRejoin', a, str(p)]), disabled=not s.h ) B( '+', size=(131 * sf, 35*zf), pos=(x + 579 * sf, 454*zf), - call=Call(s.mv,'re',1) + call=Call(s.mv, 're', 1) ) B( str(s.re or 0.1), size=(131 * sf, 35*zf), pos=(x + 444 * sf, 454*zf), - call=Call(push,f"Rejoins after {s.re or 0.1} second{['','s'][s.re!=1]}\nKeep this 0.1 unless server kicks fast rejoins\nLife in server = job time - rejoin time") + call=Call( + push, f"Rejoins after {s.re or 0.1} second{['', 's'][s.re != 1]}\nKeep this 0.1 unless server kicks fast rejoins\nLife in server = job time - rejoin time") ) B( '-', size=(131 * sf, 35*zf), pos=(x + 311 * sf, 454*zf), - disabled=s.re<=0.5, - call=Call(s.mv,'re',-1) + disabled=s.re <= 0.5, + call=Call(s.mv, 're', -1) ) B( '', @@ -271,19 +289,21 @@ class Power(TAB): pos=(x + 311 * sf, 445*zf), style='bright' ) - for i,e in enumerate(s.hi.items()): - if i < s.eii: continue - if i >= (s.eii+9): break - g,v = e - _,a = g - n,p = v + for i, e in enumerate(s.hi.items()): + if i < s.eii: + continue + if i >= (s.eii+9): + break + g, v = e + _, a = g + n, p = v w = GSW(n) B( n, size=(400 * sf, 37*zf), pos=(x + 311 * sf, (358-39*(i-s.eii))*zf), label_scale=1 if w < 290 * sf else (290 * sf)/w, - call=Call(JOIN,a,p,False), + call=Call(JOIN, a, p, False), disabled=n == '...' ) nt = "Server join history\nServers you join are saved here" @@ -292,28 +312,28 @@ class Power(TAB): nt, pos=(x + 510 * sf, 265*zf), v_align='top', - scale=1 if w<(380*sf) else (380*sf)/w + scale=1 if w < (380*sf) else (380*sf)/w ) B( cs(sc.DOWN_ARROW), pos=(x + 311 * sf, 8*zf), size=(398*sf, 35*zf), disabled=s.eii >= len(s.hi)-9, - call=Call(s.mv,'eii',1) + call=Call(s.mv, 'eii', 1) ) B( cs(sc.UP_ARROW), pos=(x + 311 * sf, 400*zf), size=(400*sf, 35*zf), disabled=s.eii <= 0, - call=Call(s.mv,'eii',-1) + call=Call(s.mv, 'eii', -1) ) bb = s.j[0] is None B( 'No job' if bb else 'Job', size=(300 * sf, 35*zf), pos=(x + 727 * sf, 606*zf), - call=Call(push,s.j[0]), + call=Call(push, s.j[0]), disabled=bb ) w = 0 if bb else GSW(str(s.j[1])) @@ -321,41 +341,41 @@ class Power(TAB): 'Target' if bb else str(s.j[1]), size=(300 * sf, 35*zf), pos=(x + 727 * sf, 568*zf), - call=Call(push,s.j[2]), + call=Call(push, s.j[2]), disabled=bb, - label_scale=1 if w<110 * sf else (110 * sf)/w + label_scale=1 if w < 110 * sf else (110 * sf)/w ) B( 'Stop', size=(300 * sf, 35*zf), pos=(x + 727 * sf, 530*zf), - call=Call(s.job,None,[None,None,None]), + call=Call(s.job, None, [None, None, None]), disabled=bb ) B( '+', size=(96 * sf, 35*zf), pos=(x + 931 * sf, 492*zf), - call=Call(s.mv,'ji',1) + call=Call(s.mv, 'ji', 1) ) B( str(s.ji or 0.1), size=(100 * sf, 35*zf), pos=(x + 828 * sf, 492*zf), - call=Call(push,f"Job runs every {s.ji or 0.1} second{['','s'][s.ji!=1]}") + call=Call(push, f"Job runs every {s.ji or 0.1} second{['', 's'][s.ji != 1]}") ) B( '-', size=(98 * sf, 35*zf), pos=(x + 727 * sf, 492*zf), - disabled=s.ji<=0.5, - call=Call(s.mv,'ji',-1) + disabled=s.ji <= 0.5, + call=Call(s.mv, 'ji', -1) ) B( 'Power', size=(300 * sf, 35*zf), pos=(x + 727 * sf, 454*zf), - call=Call(push,'Power v2.5 FullUI\nCollapse dev console to switch to MinUI') + call=Call(push, 'Power v2.5 FullUI\nCollapse dev console to switch to MinUI') ) B( '', @@ -373,27 +393,29 @@ class Power(TAB): 'Chat is still empty.\nHurry up and fill it with nonesense', pos=(x+1320 * sf, 330 * zf) ) - for i,g in enumerate(s.cm): - if i < s.ci: continue - if i >= s.ci+15: break + for i, g in enumerate(s.cm): + if i < s.ci: + continue + if i >= s.ci+15: + break i = i - s.ci - m,_ = g - sn,ms = m.split(': ',1) + m, _ = g + sn, ms = m.split(': ', 1) w = GSW(sn) - w = [w,30*sf][w<30*sf] - s1 = [w,200*sf][w>200*sf] + w = [w, 30*sf][w < 30*sf] + s1 = [w, 200*sf][w > 200*sf] B( sn, - size=(s1,35*zf), + size=(s1, 35*zf), pos=(x + 1040*sf, (48+37*i)*zf), style='purple', - label_scale=1 if w<(s1-10*sf) else (s1-10*sf)/w, - call=Call(s.chk,sn) + label_scale=1 if w < (s1-10*sf) else (s1-10*sf)/w, + call=Call(s.chk, sn) ) - s2 = 555*sf - s1 - 53*(_>1) + s2 = 555*sf - s1 - 53*(_ > 1) B( '', - size=(s2,35*zf), + size=(s2, 35*zf), pos=(x + 1045*sf+s1, (48+37*i)*zf), style='black' ) @@ -401,67 +423,69 @@ class Power(TAB): T( ms, pos=(x + s1+(1050)*sf, (48+17+37*i)*zf), - scale=1 if w<(s2-10*sf) else (s2-10*sf)/w, + scale=1 if w < (s2-10*sf) else (s2-10*sf)/w, h_align='left' ) z = f'x{_}' w = GSW(z) - _>1 and B( + _ > 1 and B( z, - pos=(x+s1+s2+(1050)*sf,(48+37*i)*zf), - size=(50*sf,35*zf), - label_scale=1 if w<(40*sf) else (40*sf)/w, + pos=(x+s1+s2+(1050)*sf, (48+37*i)*zf), + size=(50*sf, 35*zf), + label_scale=1 if w < (40*sf) else (40*sf)/w, style='yellow_bright' ) B( cs(sc.DOWN_ARROW), - pos=(x+1042*sf,8*zf), - size=(555*sf,35*zf), - call=Call(s.mv,'ci',-1), + pos=(x+1042*sf, 8*zf), + size=(555*sf, 35*zf), + call=Call(s.mv, 'ci', -1), disabled=s.ci <= 0 or not s.cm ) B( cs(sc.UP_ARROW), - pos=(x+1042*sf,606*zf), - size=(555*sf,35*zf), - call=Call(s.mv,'ci',1), + pos=(x+1042*sf, 606*zf), + size=(555*sf, 35*zf), + call=Call(s.mv, 'ci', 1), disabled=(s.ci >= len(s.cm)-15) or not s.cm ) B( cs(sc.DOWN_ARROW), - pos=(x+727*sf,8*zf), - size=(300*sf,35*zf), + pos=(x+727*sf, 8*zf), + size=(300*sf, 35*zf), disabled=(s.li >= len(s.ls)-16) or not s.ls, - call=Call(s.mv,'li',1) + call=Call(s.mv, 'li', 1) ) B( cs(sc.UP_ARROW), - pos=(x+727*sf,400*zf), - size=(300*sf,35*zf), - disabled=s.li<=0, - call=Call(s.mv,'li',-1) + pos=(x+727*sf, 400*zf), + size=(300*sf, 35*zf), + disabled=s.li <= 0, + call=Call(s.mv, 'li', -1) ) 0 if s.ls else T( 'Job logs here\nLike you even care', - pos=(x+875*sf,232*zf) + pos=(x+875*sf, 232*zf) ) - for _,g in enumerate(s.ls): - if _ < s.li: continue - if _ >= s.li+16: break + for _, g in enumerate(s.ls): + if _ < s.li: + continue + if _ >= s.li+16: + break _ = _ - s.li - l,t = g + l, t = g B( '', - pos=(x+727*sf,(376-_*22)*zf), - size=(300*sf,20*zf), + pos=(x+727*sf, (376-_*22)*zf), + size=(300*sf, 20*zf), label_scale=0.7, corner_radius=0, style='black', - call=Call(push,t) + call=Call(push, t) ) T( l, - pos=(x+732*sf,(386-_*22)*zf), + pos=(x+732*sf, (386-_*22)*zf), scale=0.6, h_align='left' ) @@ -471,14 +495,14 @@ class Power(TAB): pos=(x + 10 * sf, 10), size=(30 * sf, s.height-17), disabled=(s.ri >= len(s.r)-3) or not s.r, - call=Call(s.mv,'ri',1) + call=Call(s.mv, 'ri', 1) ) B( cs(sc.UP_ARROW), pos=(x + 250 * sf, 10), size=(30 * sf, s.height-17), disabled=(s.ri <= 0) or not s.r, - call=Call(s.mv,'ri',-1) + call=Call(s.mv, 'ri', -1) ) nt = "No roster\nYou're alone" w = GSW(nt) @@ -487,63 +511,66 @@ class Power(TAB): pos=(x + 147 * sf, s.height-17), h_align='center', v_align='top', - scale=1 if w<(200*sf) else (200*sf)/w + scale=1 if w < (200*sf) else (200*sf)/w ) - for i,z in enumerate(s.rr.items()): - if i < s.ri: continue - if i>=(s.ri+3): break - n,g = z - c,p = g + for i, z in enumerate(s.rr.items()): + if i < s.ri: + continue + if i >= (s.ri+3): + break + n, g = z + c, p = g w = GSW(n) B( n, size=(210 * sf, 27), pos=(x + 40 * sf, s.height-35-27*(i-s.ri)), - style=[['blue','blue_bright'],['purple','purple_bright']][not p][s.c==c], - call=Call(s.prv,c,p,n), + style=[['blue', 'blue_bright'], ['purple', 'purple_bright']][not p][s.c == c], + call=Call(s.prv, c, p, n), label_scale=1 if w < 200 * sf else (200 * sf)/w ) bb = s.c is None B( - 'Bomb' if bb else (['Client','Host'][s.c==-1]+f' {s.c}'), + 'Bomb' if bb else (['Client', 'Host'][s.c == -1]+f' {s.c}'), pos=(x + 287 * sf, s.height-34), size=(120 * sf, 27), disabled=bb, - call=Call(push,str(s.n)) + call=Call(push, str(s.n)) ) B( 'Mention', size=(120 * sf, 27), pos=(x + 287 * sf, s.height-90), - call=Call(chat,str(s.n)), + call=Call(chat, str(s.n)), disabled=bb ) B( 'Players', size=(120 * sf, 27), pos=(x + 287 * sf, s.height-62), - call=Call(push,'\n'.join([' '.join([f'{i}={j}' for i,j in _.items()]) for _ in s.p]) if s.p else ''), + call=Call(push, '\n'.join( + [' '.join([f'{i}={j}' for i, j in _.items()]) for _ in s.p]) if s.p else ''), disabled=bb or (not s.p) ) B( 'Kick', size=(120 * sf, 27), pos=(x + 407 * sf, s.height-34), - call=Call(KICK,lambda:s.rr[s.n][0]), - disabled=bb or (s.c==-1) + call=Call(KICK, lambda: s.rr[s.n][0]), + disabled=bb or (s.c == -1) ) B( 'JKick', size=(120 * sf, 27), pos=(x + 407 * sf, s.height-62), - call=Call(s.job,Call(KICK,lambda:s.rr[s.n][0]),['JKick',s.c,s.n]), - disabled=bb or (s.c==-1) + call=Call(s.job, Call(KICK, lambda: s.rr[s.n][0]), ['JKick', s.c, s.n]), + disabled=bb or (s.c == -1) ) B( 'Vote', size=(120 * sf, 27), pos=(x + 407 * sf, s.height-90), - call=Call(chat,'1'), + call=Call(chat, '1'), disabled=not s.r ) B( @@ -557,7 +584,7 @@ class Power(TAB): 'No job' if bb else 'Job', size=(120 * sf, 27), pos=(x + 544 * sf, s.height-34), - call=Call(push,s.j[0]), + call=Call(push, s.j[0]), disabled=bb ) w = 0 if bb else GSW(str(s.j[1])) @@ -565,35 +592,35 @@ class Power(TAB): 'Target' if bb else str(s.j[1]), size=(120 * sf, 27), pos=(x + 544 * sf, s.height-62), - call=Call(push,s.j[2]), + call=Call(push, s.j[2]), disabled=bb, - label_scale=1 if w<110 * sf else (110 * sf)/w + label_scale=1 if w < 110 * sf else (110 * sf)/w ) B( 'Stop', size=(120 * sf, 27), pos=(x + 544 * sf, s.height-90), - call=Call(s.job,None,[None,None,None]), + call=Call(s.job, None, [None, None, None]), disabled=bb ) B( '+', size=(50 * sf, 27), pos=(x + 664 * sf, s.height-34), - call=Call(s.mv,'ji',1) + call=Call(s.mv, 'ji', 1) ) B( str(s.ji or 0.1), size=(50 * sf, 27), pos=(x + 664 * sf, s.height-62), - call=Call(push,f"Job runs every {s.ji or 0.1} second{['','s'][s.ji!=1]}") + call=Call(push, f"Job runs every {s.ji or 0.1} second{['', 's'][s.ji != 1]}") ) B( '-', size=(50 * sf, 27), pos=(x + 664 * sf, s.height-90), - disabled=s.ji<=0.5, - call=Call(s.mv,'ji',-1) + disabled=s.ji <= 0.5, + call=Call(s.mv, 'ji', -1) ) B( '', @@ -601,9 +628,9 @@ class Power(TAB): pos=(x + 722 * sf, 10), style='bright' ) - t = getattr(s.h,'name','Not in a server') - a = getattr(s.h,'address','127.0.0.1') - p = getattr(s.h,'port','43210') + t = getattr(s.h, 'name', 'Not in a server') + a = getattr(s.h, 'address', '127.0.0.1') + p = getattr(s.h, 'port', '43210') w = GSW(t) B( t if t.strip() else 'Loading...', @@ -611,14 +638,15 @@ class Power(TAB): pos=(x + 732 * sf, s.height-34), disabled=not s.h, label_scale=1 if w < 290 * sf else (290 * sf)/w, - call=Call(push,f"{t}\nHosted on build {getattr(s.h,'build_number','0')}" if t.strip() else 'Server is still loading...\nIf it remains stuck on this\nthen either party is full, or a network issue.'), + call=Call(push, f"{t}\nHosted on build {getattr(s.h, 'build_number', '0')}" if t.strip( + ) else 'Server is still loading...\nIf it remains stuck on this\nthen either party is full, or a network issue.'), ) w = GSW(a) B( a, size=(200 * sf, 27), pos=(x + 732 * sf, s.height-62), - call=Call(COPY,a), + call=Call(COPY, a), disabled=not s.h, label_scale=1 if w < 190 * sf else (190 * sf)/w ) @@ -628,7 +656,7 @@ class Power(TAB): size=(97 * sf, 27), pos=(x + 935 * sf, s.height-62), disabled=not s.h, - call=Call(COPY,str(p)), + call=Call(COPY, str(p)), label_scale=1 if w < 90 * sf else (90 * sf)/w ) B( @@ -642,34 +670,35 @@ class Power(TAB): 'Rejoin', size=(97 * sf, 27), pos=(x + 835 * sf, s.height-90), - call=Call(REJOIN,a,p,lambda:s.re), + call=Call(REJOIN, a, p, lambda: s.re), disabled=not s.h ) B( 'JRejoin', size=(97 * sf, 27), pos=(x + 935 * sf, s.height-90), - call=Call(s.job,Call(REJOIN,a,p,lambda:s.re),['JRejoin',a,str(p)]), + call=Call(s.job, Call(REJOIN, a, p, lambda: s.re), ['JRejoin', a, str(p)]), disabled=not s.h ) B( '+', size=(50 * sf, 27), pos=(x + 1035 * sf, s.height-34), - call=Call(s.mv,'re',1) + call=Call(s.mv, 're', 1) ) B( str(s.re or 0.1), size=(50 * sf, 27), pos=(x + 1035 * sf, s.height-62), - call=Call(push,f"Rejoins after {s.re or 0.1} second{['','s'][s.re!=1]}\nKeep this 0.1 unless server kicks fast rejoins\nLife in server = job time - rejoin time") + call=Call( + push, f"Rejoins after {s.re or 0.1} second{['', 's'][s.re != 1]}\nKeep this 0.1 unless server kicks fast rejoins\nLife in server = job time - rejoin time") ) B( '-', size=(50 * sf, 27), pos=(x + 1035 * sf, s.height-90), - disabled=s.re<=0.5, - call=Call(s.mv,'re',-1) + disabled=s.re <= 0.5, + call=Call(s.mv, 're', -1) ) B( '', @@ -677,19 +706,21 @@ class Power(TAB): pos=(x + 1092 * sf, 10), style='bright' ) - for i,e in enumerate(s.hi.items()): - if i < s.ii: continue - if i >= (s.ii+3): break - g,v = e - _,a = g - n,p = v + for i, e in enumerate(s.hi.items()): + if i < s.ii: + continue + if i >= (s.ii+3): + break + g, v = e + _, a = g + n, p = v w = GSW(n) B( n, size=(300 * sf, 27), pos=(x + 1134 * sf, s.height-34-28*(i-s.ii)), label_scale=1 if w < 290 * sf else (290 * sf)/w, - call=Call(JOIN,a,p,False), + call=Call(JOIN, a, p, False), disabled=n == '...' ) nt = "Your server join history\nwill appear here. Hi." @@ -699,21 +730,21 @@ class Power(TAB): pos=(x + 1285 * sf, s.height-17), h_align='center', v_align='top', - scale=1 if w<(280*sf) else (280*sf)/w + scale=1 if w < (280*sf) else (280*sf)/w ) B( cs(sc.DOWN_ARROW), pos=(x + 1102 * sf, 10), size=(30 * sf, s.height-17), disabled=s.ii >= len(s.hi)-3, - call=Call(s.mv,'ii',1) + call=Call(s.mv, 'ii', 1) ) B( cs(sc.UP_ARROW), pos=(x + 1436 * sf, 10), size=(30 * sf, s.height-17), disabled=s.ii <= 0, - call=Call(s.mv,'ii',-1) + call=Call(s.mv, 'ii', -1) ) B( 'Force leave', @@ -724,70 +755,99 @@ class Power(TAB): ) B( 'Laugh', - call=Call(chat,'hahaha'), + call=Call(chat, 'hahaha'), pos=(x + 1469 * sf, s.height-62), size=(130 * sf, 27) ) B( 'Power', - call=Call(push,'Power v2.5 MinUI\nExpand dev console to switch to FullUI. thanks.'), + call=Call(push, 'Power v2.5 MinUI\nExpand dev console to switch to FullUI. thanks.'), pos=(x + 1469 * sf, s.height-90), size=(130 * sf, 27) ) - def log(s,t): - s.ls.append((t,NOW())) + + def log(s, t): + s.ls.append((t, NOW())) if s.lii < 99: s.lii += 1 - if s.li == s.lii-17: s.li += 1 - else: s.ls.pop(0) + if s.li == s.lii-17: + s.li += 1 + else: + s.ls.pop(0) s.rf() - def mv(s,a,i): - setattr(s,a,getattr(s,a)+i) + + def mv(s, a, i): + setattr(s, a, getattr(s, a)+i) s.rf() - def job(s,f,j): + + def job(s, f, j): s.j = j s.lf = f s.hd = j[1] if s.j[0] == 'JRejoin' else j[2] if f is not None: s._job(f) - push('Job started',color=(1,1,0)) - else: push('Job stopped',color=(1,1,0)) + push('Job started', color=(1, 1, 0)) + else: + push('Job stopped', color=(1, 1, 0)) s.rf() - def _job(s,f): - if f != s.lf: return + + def _job(s, f): + if f != s.lf: + return s.log(f'[{s.lii:02}] [{s.j[0]}] {s.hd}') - f(); teck(s.ji or 0.1,Call(s._job,f)) - def prv(s,c,p,n): - s.c,s.p,s.n = c,p,n + f() + teck(s.ji or 0.1, Call(s._job, f)) + + def prv(s, c, p, n): + s.c, s.p, s.n = c, p, n s.rf() - def chk(s,pn): + + def chk(s, pn): y = 0 - for n,g in s.rr.items(): - c,p = g - if n == pn: y = 1 + for n, g in s.rr.items(): + c, p = g + if n == pn: + y = 1 else: for _ in p: - if pn in [_['name'],_['name_full']]: y = 1 - if y: s.prv(c,p,n); break + if pn in [_['name'], _['name_full']]: + y = 1 + if y: + s.prv(c, p, n) + break + HAS = app.ui_v1.has_main_window SAVE = app.classic.save_ui_state -KICK = lambda f: DISC(f()) -FORCE = lambda: teck(0.7 if HAS() else 0.1,lambda: 0 if HAS() else app.classic.return_to_main_menu_session_gracefully()) +def KICK(f): return DISC(f()) + + +def FORCE(): return teck(0.7 if HAS() else 0.1, lambda: 0 if HAS() + else app.classic.return_to_main_menu_session_gracefully()) + + JOIN = lambda *a: (SAVE() or 1) and CON(*a) -GSW = lambda s: sw(s,suppress_warning=True) -REJOIN = lambda a,p,f: ((LEAVE() if getattr(HOST(),'name','') else 0) or 1) and teck(f() or 0.1,Call(JOIN,a,p,False)) -COPY = lambda s: ((CST(s) or 1) if CIS() else push('Clipboard not supported!')) and push('Copied!',color=(0,1,0)) -NOW = lambda: DT.now().strftime("%H:%M:%S") +def GSW(s): return sw(s, suppress_warning=True) + + +def REJOIN(a, p, f): return ((LEAVE() if getattr(HOST(), 'name', '') else 0) + or 1) and teck(f() or 0.1, Call(JOIN, a, p, False)) +def COPY(s): return ((CST(s) or 1) if CIS() else push( + 'Clipboard not supported!')) and push('Copied!', color=(0, 1, 0)) + + +def NOW(): return DT.now().strftime("%H:%M:%S") # brobord collide grass # ba_meta require api 9 # ba_meta export babase.Plugin + + class byBordd(Plugin): def __init__(s): C = Power N = C.__name__ - E = ENT(N,C) + E = ENT(N, C) I = app.devconsole I.tabs = [_ for _ in I.tabs if _.name != N]+[E] I._tab_instances[N] = E.factory() diff --git a/plugins/utilities/replay.py b/plugins/utilities/replay.py index d34fd03..0fb2d88 100755 --- a/plugins/utilities/replay.py +++ b/plugins/utilities/replay.py @@ -66,40 +66,45 @@ from threading import Thread from os import listdir as ls from struct import unpack + class Replay: VER = '2.5' - COL1 = (0.18,0.18,0.18) - COL2 = (1,1,1) - COL3 = (0,1,0) - COL4 = (0,1,1) + COL1 = (0.18, 0.18, 0.18) + COL2 = (1, 1, 1) + COL3 = (0, 1, 0) + COL4 = (0, 1, 1) BUSY = False + @classmethod - def BUS(c,b=None): - if b is None: return c.BUSY + def BUS(c, b=None): + if b is None: + return c.BUSY c.BUSY = b - def __init__(s,source=None): + + def __init__(s, source=None): s.sl = s.rn = s.buf = None s.ohno = False s._h = _H() s.p = s.cw( src=source.get_screen_space_center(), p=GOS(), - size=(400,500), - oac=lambda:(ocw(s.p,transition='out_scale' if source and source.exists() else 'out_left'),s.snd('laser'),s.trs.stop()) + size=(400, 500), + oac=lambda: (ocw(s.p, transition='out_scale' if source and source.exists() + else 'out_left'), s.snd('laser'), s.trs.stop()) ) s.trs = s.snd('powerup01') s.tw( p=s.p, h_align='center', text='Replay', - pos=(175,460), + pos=(175, 460), scale=2 ) sy = 360 p1 = sw( - parent=s.p, - size=(sy,sy), - position=(25,80) + parent=s.p, + size=(sy, sy), + position=(25, 80) ) s.rd = rdir() a = [_ for _ in ls(s.rd) if _.endswith('.brp')] @@ -107,94 +112,108 @@ class Replay: p2 = ocw( parent=p1, background=False, - size=(sy,v) + size=(sy, v) ) s.kids = [] - for i,_ in enumerate(a): + for i, _ in enumerate(a): t = s.tw( p=p2, click_activate=True, selectable=True, - pos=(0,v-30*i-30), + pos=(0, v-30*i-30), text=_, maxwidth=sy, - size=(sy,30), + size=(sy, 30), color=s.COL2, - oac=Call(s.hl,i,_) + oac=Call(s.hl, i, _) ) s.kids.append(t) s.psrc = None for _ in range(3): b = s.bw( p=s.p, - pos=(25+120*_,30), - size=(120,40), - label=['Show','Copy','Run'][_], - oac=Call(s.con,[s.show,s.copy,s.play][_]), - icon=gt(['folder','file','nextLevelIcon'][_]) + pos=(25+120*_, 30), + size=(120, 40), + label=['Show', 'Copy', 'Run'][_], + oac=Call(s.con, [s.show, s.copy, s.play][_]), + icon=gt(['folder', 'file', 'nextLevelIcon'][_]) ) - if _ == 2: s.psrc = b - def snd(s,t): + if _ == 2: + s.psrc = b + + def snd(s, t): h = gs(t) h.play() - teck(uf(0.14,0.17),h.stop) + teck(uf(0.14, 0.17), h.stop) return h + def get(s): - return join(s.rd,s.rn) + return join(s.rd, s.rn) + def copy(s): s.snd('dingSmallHigh') COPY(s.get()) - push('Copied replay path to clipboard!',color=s.COL3) + push('Copied replay path to clipboard!', color=s.COL3) + def show(s): gs('ding').play() - push(s.get(),color=s.COL3) - def con(s,f): - if s.sl is None: BTW('Select a replay!'); return - if ON(): BTW('A replay is already running!'); return + push(s.get(), color=s.COL3) + + def con(s, f): + if s.sl is None: + BTW('Select a replay!') + return + if ON(): + BTW('A replay is already running!') + return return f() - def hl(s,i,n): + + def hl(s, i, n): if s.sl == i: s.psrc = s.kids[i] s.play() return s.sl = i s.rn = n - [otw(_,color=s.COL2) for _ in s.kids] - otw(s.kids[i],color=s.COL3) + [otw(_, color=s.COL2) for _ in s.kids] + otw(s.kids[i], color=s.COL3) + def play(s): - if s.BUS(): return + if s.BUS(): + return s.BUS(True) gs('deek').play() s.load() + def load(s): src = s.psrc.get_screen_space_center() if s.psrc.get_widget_type() == 'text': - src = (src[0]-170,src[1]) + src = (src[0]-170, src[1]) s.parc = c = s.cw( src=src, - size=(300,200), + size=(300, 200), p=GOS() ) s.tw( p=c, text='Player', - pos=(125,150), + pos=(125, 150), h_align='center', scale=1.4 ) spin( parent=c, size=60, - position=(75,100) + position=(75, 100) ) s.st = s.tw( p=c, text='Reading...', - pos=(115,87) + pos=(115, 87) ) s.tpar = s.tw( p=c, - pos=(125,30), + pos=(125, 30), maxwidth=240, text=f'{s.rn} with total of {getsize(s.get())} bytes\nstreaming bytes to pybrp_stream', h_align='center' @@ -202,36 +221,44 @@ class Replay: s.tpar2 = s.tw( p=c, maxwidth=240, - pos=(30,20), + pos=(30, 20), v_align='bottom' ) - s.par = [0,1] - teck(0.5,Thread(target=s.calc).start) - teck(0.5,s.fpar) + s.par = [0, 1] + teck(0.5, Thread(target=s.calc).start) + teck(0.5, s.fpar) s.spy(s.calc2) + def fpar(s): - a,b = s.par - teck(0.1,s.fpar) if (a!=b) and (not s.ohno) else 0 - if not a: return + a, b = s.par + teck(0.1, s.fpar) if (a != b) and (not s.ohno) else 0 + if not a: + return p = a/b*100 t = '\u2588'*int(p)+'\u2591'*int(100-p) if not s.ohno: try: - otw(s.tpar,text=t) - otw(s.tpar2,text=f'{a} of {b} bytes read') - except: return + otw(s.tpar, text=t) + otw(s.tpar2, text=f'{a} of {b} bytes read') + except: + return + def calc(s): - try: s.buf = GMS(s._h,s.get(),s.par) - except: s.buf = 0 - def calc2(s,t): - otw(s.st,text='Starting...' if t else 'Wait what?') - otw(s.tpar2,text=f'result was {t} milleseconds') if t else t + try: + s.buf = GMS(s._h, s.get(), s.par) + except: + s.buf = 0 + + def calc2(s, t): + otw(s.st, text='Starting...' if t else 'Wait what?') + otw(s.tpar2, text=f'result was {t} milleseconds') if t else t if not t: s.ohno = True - otw(s.tpar,text='pybrp returned zero duration, error?\nclosing this window in 5 seconds') - otw(s.tpar2,text='') - teck(1 if t else 5,Call(s._play,t)) - def spy(s,f,i=60): + otw(s.tpar, text='pybrp returned zero duration, error?\nclosing this window in 5 seconds') + otw(s.tpar2, text='') + teck(1 if t else 5, Call(s._play, t)) + + def spy(s, f, i=60): if not i: s.buf = None f(None) @@ -241,18 +268,19 @@ class Replay: s.buf = None f(b) return - teck(0.5,Call(s.spy,f,i-1)) - def _play(s,t): + teck(0.5, Call(s.spy, f, i-1)) + + def _play(s, t): if t == 0: BTW("Couldn't load replay!") - ocw(s.parc,transition='out_scale') + ocw(s.parc, transition='out_scale') s.BUS(False) return SET(0) fade(1) - Player(path=s.get(),duration=t) + Player(path=s.get(), duration=t) s.BUS(False) - bw = lambda s,p=None,oac=None,pos=None,**k: obw( + bw = lambda s, p=None, oac=None, pos=None, **k: obw( parent=p, color=s.COL1, textcolor=s.COL2, @@ -262,7 +290,7 @@ class Replay: enable_sound=False, **k ) - cw = lambda s,p=None,pos=None,src=None,oac=None,**k: ocw( + cw = lambda s, p=None, pos=None, src=None, oac=None, **k: ocw( color=s.COL1, parent=p, position=pos, @@ -271,7 +299,7 @@ class Replay: on_outside_click_call=oac, **k ) - tw = lambda s,color=None,oac=None,p=None,pos=None,**k: otw( + tw = lambda s, color=None, oac=None, p=None, pos=None, **k: otw( parent=p, position=pos, color=color or s.COL2, @@ -279,27 +307,29 @@ class Replay: **k ) + class Player: TICK = 0.01 - COL0 = (0.5,0,0) - COL1 = (1,0,0) - COL2 = (0.5,0.5,0) - COL3 = (1,1,0) - COL4 = (0,0.5,0) - COL5 = (0,1,0) - COL6 = (0,0.5,0.5) - COL7 = (0,1,1) - COL8 = (0.6,0.6,0.6) - COL9 = (8,0,0) - COL10 = (0.5,0.25,0) - COL11 = (1,0.5,0) - COL12 = (0.5,0.25,0.5) - COL13 = (1,0.5,1) - COL14 = (0.5,0.5,0.5) - COL15 = (1,1,1) + COL0 = (0.5, 0, 0) + COL1 = (1, 0, 0) + COL2 = (0.5, 0.5, 0) + COL3 = (1, 1, 0) + COL4 = (0, 0.5, 0) + COL5 = (0, 1, 0) + COL6 = (0, 0.5, 0.5) + COL7 = (0, 1, 1) + COL8 = (0.6, 0.6, 0.6) + COL9 = (8, 0, 0) + COL10 = (0.5, 0.25, 0) + COL11 = (1, 0.5, 0) + COL12 = (0.5, 0.25, 0.5) + COL13 = (1, 0.5, 1) + COL14 = (0.5, 0.5, 0.5) + COL15 = (1, 1, 1) COL16 = (0.1, 0.2, 0.4) COL17 = (1, 1.7, 2) - def __init__(s,path,duration): + + def __init__(s, path, duration): s.path = path s.du = duration s.ds = s.du / 1000 @@ -307,20 +337,20 @@ class Player: s.caml = None s.rn = s.st = s.pr = 0 s.camz = 1 - [setattr(s,_,[]) for _ in ['kids','camkids','hdkids','snkids','snuikids']] + [setattr(s, _, []) for _ in ['kids', 'camkids', 'hdkids', 'snkids', 'snuikids']] PLAY(path) - x,y = res() + x, y = res() s.sy = 80 s.p = ocw( - size=(x,s.sy), - stack_offset=(0,-y/2+s.sy/2), + size=(x, s.sy), + stack_offset=(0, -y/2+s.sy/2), background=False ) s.bg = iw( parent=s.p, texture=gt('black'), - size=(x+3,s.sy+5), - position=(0,-2), + size=(x+3, s.sy+5), + position=(0, -2), opacity=0.4 ) s.mkui() @@ -329,13 +359,14 @@ class Player: s.sp = 1 s.foc() s.play() + def mkhd(s): f = s.hdkids.append - s.tex=['\u25bc','\u25b2'] + s.tex = ['\u25bc', '\u25b2'] s.kekb = s.bw( p=s.p, - pos=(20,15), - size=(50,50), + pos=(20, 15), + size=(50, 50), oac=s.kek, color=s.COL10 ) @@ -343,7 +374,7 @@ class Player: s.kekt = otw( parent=s.p, text=s.tex[s.nah], - position=(44,30), + position=(44, 30), scale=2, shadow=0.4, color=s.COL11 @@ -351,26 +382,28 @@ class Player: f(s.kekt) f(iw( parent=s.p, - position=(18,13), - size=(54,54), + position=(18, 13), + size=(54, 54), color=s.COL10, texture=gt('white'), opacity=0.4 )) + def killhd(s): [_.delete() for _ in s.hdkids] s.hdkids.clear() + def mkui(s): s.up = True f = s.kids.append - x,y = res() + x, y = res() sy = s.sy p = s.p # exit f(s.bw( p=p, - pos=(x-65,15), - size=(50,50), + pos=(x-65, 15), + size=(50, 50), color=s.COL0, oac=s.bye )) @@ -378,9 +411,9 @@ class Player: f(iw( parent=p, texture=gt('crossOut'), - color=(c[0]*10,c[1]*10,c[2]*10), - position=(x-60,20), - size=(40,40) + color=(c[0]*10, c[1]*10, c[2]*10), + position=(x-60, 20), + size=(40, 40) )) # speed for _ in range(2): @@ -388,20 +421,20 @@ class Player: 'FAST_FORWARD_BUTTON', 'REWIND_BUTTON' ][_] - pos = (x-130-260*_,15) + pos = (x-130-260*_, 15) f(s.bw( p=p, pos=pos, - size=(50,50), + size=(50, 50), color=s.COL2, - oac=Call(s.boost,[1,-1][_]), + oac=Call(s.boost, [1, -1][_]), repeat=True )) f(otw( parent=p, - text=cs(getattr(sc,a)), + text=cs(getattr(sc, a)), color=s.COL3, - position=(pos[0]-2,pos[1]+13), + position=(pos[0]-2, pos[1]+13), h_align='center', v_align='center', scale=1.8, @@ -413,49 +446,49 @@ class Player: 'RIGHT_ARROW', 'LEFT_ARROW' ][_] - pos = (x-195-130*_,15) + pos = (x-195-130*_, 15) f(s.bw( p=p, pos=pos, - size=(50,50), + size=(50, 50), color=s.COL4, - oac=Call(s.seek,[1,-1][_]), + oac=Call(s.seek, [1, -1][_]), repeat=True )) f(otw( parent=p, - text=cs(getattr(sc,a)), + text=cs(getattr(sc, a)), color=s.COL5, - position=(pos[0]-1,pos[1]+12), + position=(pos[0]-1, pos[1]+12), h_align='center', v_align='center', scale=1.7, shadow=0.2 )) # pause - pos = (x-260,15) + pos = (x-260, 15) f(s.bw( p=p, pos=pos, - size=(50,50), + size=(50, 50), color=s.COL6, oac=s.toggle )) s.tt = otw( parent=p, color=s.COL7, - position=(pos[0]+12,pos[1]+11), + position=(pos[0]+12, pos[1]+11), scale=1.5, shadow=0.3 ) f(s.tt) s.toggle(dry=True) # replay - pos = (x-455,15) + pos = (x-455, 15) f(s.bw( p=p, pos=pos, - size=(50,50), + size=(50, 50), color=s.COL12, oac=s.rloop )) @@ -464,26 +497,26 @@ class Player: f(iw( parent=p, texture=gt('replayIcon'), - color=(c[0]*sk,c[1]*sk,c[2]*sk), - position=(pos[0]+2,pos[1]+1), - size=(47,47), + color=(c[0]*sk, c[1]*sk, c[2]*sk), + position=(pos[0]+2, pos[1]+1), + size=(47, 47), )) # progress - pos = (285,sy/2-2) + pos = (285, sy/2-2) s.px = x-790 f(iw( parent=p, texture=gt('white'), - size=(s.px,5), + size=(s.px, 5), position=pos, opacity=0.4, color=s.COL8 )) - s.nbp = (pos[0]-24,pos[1]-22) + s.nbp = (pos[0]-24, pos[1]-22) s.nb = iw( parent=p, texture=gt('nub'), - size=(50,50), + size=(50, 50), position=s.nbp, opacity=0.4, color=s.COL9 @@ -492,37 +525,37 @@ class Player: # timestamp s.ct = otw( parent=p, - position=(155,40), + position=(155, 40), color=s.COL7, text=FOR(s.rn-s.st) ) f(s.ct) f(otw( parent=p, - position=(155,11), + position=(155, 11), text=FOR(s.ds), color=s.COL6 )) # sensor - sx,sy = (285,15) + sx, sy = (285, 15) n = 100 tp = s.px/n for _ in range(n): f(obw( label='', parent=p, - position=(sx+tp*_,sy), - size=(tp,50), + position=(sx+tp*_, sy), + size=(tp, 50), texture=gt('empty'), enable_sound=False, - on_activate_call=Call(s.jump,_/n), + on_activate_call=Call(s.jump, _/n), selectable=False )) # camera f(s.bw( p=s.p, - pos=(85,15), - size=(50,50), + pos=(85, 15), + size=(50, 50), color=s.COL14, oac=s.cam )) @@ -531,22 +564,22 @@ class Player: f(iw( parent=s.p, texture=gt('achievementOutline'), - position=(88,18), - color=(c[0]*sk,c[1]*sk,c[2]*sk), - size=(45,45) + position=(88, 18), + color=(c[0]*sk, c[1]*sk, c[2]*sk), + size=(45, 45) )) # info - ix,iy = (443,98) + ix, iy = (443, 98) s.ok = iw( texture=gt('white'), - position=(x-456,100), + position=(x-456, 100), parent=p, - size=(ix,iy), + size=(ix, iy), opacity=0 ) f(s.ok) s.ok2 = otw( - position=(x-ix+182.5,iy+64), + position=(x-ix+182.5, iy+64), h_align='center', scale=1.2, parent=p, @@ -554,19 +587,20 @@ class Player: ) f(s.ok2) s.ok3 = otw( - position=(x-ix+182.5,iy+10), + position=(x-ix+182.5, iy+10), h_align='center', parent=p, maxwidth=ix-20 ) f(s.ok3) + def mkcamui(s): f = s.camkids.append - x,y = (19,100) + x, y = (19, 100) s.cambg = iw( parent=s.p, - size=(235,260), - position=(x,y), + size=(235, 260), + position=(x, y), texture=gt('white'), color=s.COL14, opacity=0.05 @@ -575,9 +609,9 @@ class Player: # tip s.cambg2 = iw( parent=s.p, - size=(235,100), + size=(235, 100), opacity=0.05, - position=(x,y+267), + position=(x, y+267), color=s.COL14, texture=gt('white') ) @@ -590,7 +624,7 @@ class Player: text='To maintain animated\nsmooth camera, keep\nzoom at auto.', maxwidth=205, max_height=190, - position=(x+92,y+300), + position=(x+92, y+300), color=s.COL15 )) # reset @@ -599,15 +633,15 @@ class Player: label='Reset', color=s.COL14, textcolor=s.COL15, - size=(205,30), - pos=(x+15,y+7), + size=(205, 30), + pos=(x+15, y+7), oac=s.camr )) # seperator f(iw( parent=s.p, - size=(219,2), - position=(x+8,y+44), + size=(219, 2), + position=(x+8, y+44), texture=gt('white'), color=s.COL15, opacity=0.6 @@ -616,10 +650,10 @@ class Player: f(s.bw( p=s.p, label='Look', - pos=(x+15,y+53), + pos=(x+15, y+53), color=s.COL14, textcolor=s.COL15, - size=(205,30), + size=(205, 30), oac=s.look )) s.ltw = otw( @@ -627,7 +661,7 @@ class Player: text=str(RND(s.caml) if s.caml else 'players'), v_align='center', h_align='center', - position=(x+92,y+90), + position=(x+92, y+90), color=s.COL14, maxwidth=205, max_height=40 @@ -638,7 +672,7 @@ class Player: text='Currently looking at:', v_align='center', h_align='center', - position=(x+92,y+120), + position=(x+92, y+120), color=s.COL15, maxwidth=205, max_height=40 @@ -646,8 +680,8 @@ class Player: # seperator f(iw( parent=s.p, - size=(219,2), - position=(x+8,y+154), + size=(219, 2), + position=(x+8, y+154), texture=gt('white'), color=s.COL15, opacity=0.6 @@ -655,20 +689,20 @@ class Player: # zoom [f(s.bw( p=s.p, - label=['-','+'][_], - pos=(x+13+113*_,y+163), + label=['-', '+'][_], + pos=(x+13+113*_, y+163), color=s.COL14, textcolor=s.COL15, - size=(98,30), + size=(98, 30), repeat=True, - oac=Call(s.zoom,[1,-1][_]) - )) for _ in [0,1]] + oac=Call(s.zoom, [1, -1][_]) + )) for _ in [0, 1]] s.ztw = otw( parent=s.p, - text=f'x{round(0.5**(s.camz-1),2)}' if s.camz != 1 else 'x1.0' if s.gay else 'auto', + text=f'x{round(0.5**(s.camz-1), 2)}' if s.camz != 1 else 'x1.0' if s.gay else 'auto', v_align='center', h_align='center', - position=(x+92,y+200), + position=(x+92, y+200), color=s.COL14, maxwidth=205, max_height=40 @@ -679,29 +713,31 @@ class Player: text='Current zoom:', v_align='center', h_align='center', - position=(x+92,y+227), + position=(x+92, y+227), color=s.COL15, maxwidth=205, max_height=40 )) - def zoom(s,i): - n = round(s.camz+i*0.05,2) + + def zoom(s, i): + n = round(s.camz+i*0.05, 2) if s.camz == 1 and not s.gay: SCM(True) s.camp = GCP() s.caml = GCT() - otw(s.ltw,text=str(RND(s.caml))) + otw(s.ltw, text=str(RND(s.caml))) if n == 1 and not s.gay: SCM(False) s.caml = None - otw(s.ltw,text='players') + otw(s.ltw, text='players') s.camz = n - otw(s.ztw,text=f'x{round(0.5**(n-1),2)}' if n != 1 else 'x1.0' if s.gay else 'auto') + otw(s.ztw, text=f'x{round(0.5**(n-1), 2)}' if n != 1 else 'x1.0' if s.gay else 'auto') s.zom() + def look(s): s.killui() s.killhd() - s.fkek(0.4,-0.1) + s.fkek(0.4, -0.1) s.camlo = s.caml s.campo = GCP() s.gayo = s.gay @@ -709,39 +745,49 @@ class Player: s.mksnui() s.mksnb() s.mksni() - def _look(s,x,y): + + def _look(s, x, y): o = s.caml or GCT() sk = 0.7*s.camz - s.caml = n = (o[0]+x*sk,o[1]+y*sk,o[2]) - 0 if s.snma else otw(s.snt,text=str(RND(n))) + s.caml = n = (o[0]+x*sk, o[1]+y*sk, o[2]) + 0 if s.snma else otw(s.snt, text=str(RND(n))) s.camp = GCP() - if s.camz != 1: s.gay = True + if s.camz != 1: + s.gay = True s.camz = 1 + def foc(s): - s.tfoc = tock(0.01,s.focus,repeat=True) + s.tfoc = tock(0.01, s.focus, repeat=True) + def focus(s): SCT(*s.caml) if s.caml else 0 + def zom(s): - if s.camz == 1 and not s.gay: return + if s.camz == 1 and not s.gay: + return z = s.camz - tx,ty,tz = GCT() - px,py,pz = s.camp + tx, ty, tz = GCT() + px, py, pz = s.camp npx = tx+(px-tx)*z npy = ty+(py-ty)*z npz = tz+(pz-tz)*z - SCP(npx,npy,npz) + SCP(npx, npy, npz) + def fockill(s): s.tfoc = None + def snsave(s): s.snbye() + def snbye(s): s.killsn() s.mkui() s.mkhd() - s.fkek(0,0.1) + s.fkek(0, 0.1) s.pro() + def mksns(s): - x,y = res() + x, y = res() sz = 50 a = int(x/sz) b = int(y/sz) @@ -749,31 +795,32 @@ class Player: hb = b/2 [s.snkids.append(obw( parent=s.p, - size=(sz,sz), - position=(i*sz,j*sz), + size=(sz, sz), + position=(i*sz, j*sz), texture=gt('empty'), enable_sound=False, - on_activate_call=Call(s._look,i-ha,j-hb), + on_activate_call=Call(s._look, i-ha, j-hb), label='', repeat=True )) - for i in range(a) - for j in range(b)] + for i in range(a) + for j in range(b)] + def mksnui(s): f = s.snuikids.append f(iw( parent=s.p, - position=(0,3), + position=(0, 3), color=s.COL14, opacity=0.4, texture=gt('white'), - size=(232,190) + size=(232, 190) )) # buttons f(s.bw( p=s.p, - pos=(14,50), - size=(204,30), + pos=(14, 50), + size=(204, 30), label='Target Players', color=s.COL14, textcolor=s.COL15, @@ -781,26 +828,26 @@ class Player: )) f(s.bw( p=s.p, - pos=(10,90), + pos=(10, 90), color=s.COL14, label='Cancel', - size=(99,30), + size=(99, 30), textcolor=s.COL15, oac=s.sncancel )) f(s.bw( p=s.p, - pos=(123,90), + pos=(123, 90), color=s.COL14, label='Save', - size=(99,30), + size=(99, 30), textcolor=s.COL15, oac=s.snsave )) # info f(otw( parent=s.p, - position=(90,160), + position=(90, 160), color=s.COL15, text='Currently looking at:', h_align='center', @@ -808,7 +855,7 @@ class Player: )) s.snt = otw( parent=s.p, - position=(90,130), + position=(90, 130), color=s.COL14, h_align='center', text=str(RND(s.caml) if s.caml else 'players') @@ -817,15 +864,15 @@ class Player: # tip f(iw( parent=s.p, - position=(0,200), + position=(0, 200), color=s.COL14, opacity=0.4, texture=gt('white'), - size=(232,110) + size=(232, 110) )) f(otw( parent=s.p, - position=(90,240), + position=(90, 240), text='Longpress anywhere\nto look around. Tap on \nsomething to look at it.\nPause for calmer control!', h_align='center', v_align='center', @@ -833,15 +880,15 @@ class Player: max_height=105 )) # crosshair - x,y = res() + x, y = res() h = 20 [f(iw( parent=s.p, - position=(x/2,y/2-h/2+h*0.1) if _ else (x/2-h/2,y/2+h*0.1), - size=(3,h*1.15) if _ else (h*1.15,3), + position=(x/2, y/2-h/2+h*0.1) if _ else (x/2-h/2, y/2+h*0.1), + size=(3, h*1.15) if _ else (h*1.15, 3), color=s.COL1, texture=gt('white') - )) for _ in [0,1]] + )) for _ in [0, 1]] # top k = 60 for j in range(2): @@ -849,8 +896,8 @@ class Player: parent=s.p, texture=gt('white'), color=s.COL1, - position=(x/2+[-k,k-h][j],y/2+k), - size=(h*1.1,3) + position=(x/2+[-k, k-h][j], y/2+k), + size=(h*1.1, 3) )) # right for j in range(2): @@ -858,8 +905,8 @@ class Player: parent=s.p, texture=gt('white'), color=s.COL1, - position=(x/2+k,y/2+[k-h,-k+h*0.3][j]), - size=(3,h*+1.1) + position=(x/2+k, y/2+[k-h, -k+h*0.3][j]), + size=(3, h*+1.1) )) # bottom for j in range(2): @@ -867,8 +914,8 @@ class Player: parent=s.p, texture=gt('white'), color=s.COL1, - position=(x/2+[-k,k-h][j],y/2-h/2-k+h*0.8), - size=(h*1.1,3) + position=(x/2+[-k, k-h][j], y/2-h/2-k+h*0.8), + size=(h*1.1, 3) )) # left for j in range(2): @@ -876,72 +923,82 @@ class Player: parent=s.p, texture=gt('white'), color=s.COL1, - position=(x/2-k,y/2+[k-h,-k+h*0.3][j]), - size=(3,h*1.1) + position=(x/2-k, y/2+[k-h, -k+h*0.3][j]), + size=(3, h*1.1) )) + def killsnui(s): [_.delete() for _ in s.snuikids] + def snhide(s): - if getattr(s,'snbusy',0): return + if getattr(s, 'snbusy', 0): + return s.snma = not s.snma s.snbusy = True if s.snma: - s.snanim(204,14,-1) - obw(s.snbtn,label=cs(sc.UP_ARROW)) + s.snanim(204, 14, -1) + obw(s.snbtn, label=cs(sc.UP_ARROW)) s.killsnui() else: - obw(s.snbtn,texture=gt('white')) - s.snanim(36,7,1) - iw(s.sni,opacity=0) + obw(s.snbtn, texture=gt('white')) + s.snanim(36, 7, 1) + iw(s.sni, opacity=0) + def mksni(s): s.sni = iw( parent=s.p, - position=(7,8), + position=(7, 8), color=s.COL14, opacity=0, - size=(36,33), + size=(36, 33), texture=gt('white') ) s.snkids.append(s.sni) + def mksnb(s): s.snbtn = s.bw( p=s.p, - pos=(14,10), + pos=(14, 10), color=s.COL14, label='Cinema Mode', - size=(204,30), + size=(204, 30), textcolor=s.COL15, oac=s.snhide ) s.snkids.append(s.snbtn) - def snanim(s,a,b,i): + + def snanim(s, a, b, i): a += (163/35)*i b += 0.2*i - obw(s.snbtn,size=(a,30),position=(b,10)) - if not (14>=b>=7): + obw(s.snbtn, size=(a, 30), position=(b, 10)) + if not (14 >= b >= 7): s.snbusy = False if s.snma: - obw(s.snbtn,texture=gt('empty')) - iw(s.sni,opacity=0.4) + obw(s.snbtn, texture=gt('empty')) + iw(s.sni, opacity=0.4) else: s.mksnui() s.snbtn.delete() s.mksnb() - obw(s.snbtn,label='Cinema Mode') + obw(s.snbtn, label='Cinema Mode') return - teck(0.004,Call(s.snanim,a,b,i)) + teck(0.004, Call(s.snanim, a, b, i)) + def killsn(s): s.killsnui() [_.delete() for _ in s.snkids] + def all(s): return s.trash()+s.hdkids+s.snkids + def sntar(s): s.caml = None - otw(s.snt,text='players') + otw(s.snt, text='players') if s.camz != 1 or s.gay: s.camz = 1 s.gay = False SCM(False) + def sncancel(s): s.caml = s.camlo s.camp = s.campo @@ -950,122 +1007,153 @@ class Player: SCM(True) SCP(*s.camp) s.snbye() + def cam(s): if s.camon: s.camon = False [_.delete() for _ in s.camkids] s.camkids.clear() - s.fcam(0.4,-0.1) + s.fcam(0.4, -0.1) else: s.camon = True s.mkcamui() + def camr(s): SCM(False) s.caml = None s.gay = False s.camz = 1 - otw(s.ltw,text='players') - otw(s.ztw,text='auto') - def fcam(s,i=0,a=0.1): + otw(s.ltw, text='players') + otw(s.ztw, text='auto') + + def fcam(s, i=0, a=0.1): if i > 0.4 or i < 0: - if a < 0: s.cambg.delete() + if a < 0: + s.cambg.delete() return - if not s.cambg.exists(): return - iw(s.cambg,opacity=i) - iw(s.cambg2,opacity=i) - teck(0.02,Call(s.fcam,i+a,a)) + if not s.cambg.exists(): + return + iw(s.cambg, opacity=i) + iw(s.cambg2, opacity=i) + teck(0.02, Call(s.fcam, i+a, a)) + def rloop(s): s.loop() s.fixps() - s.hm('Replay',f'Version {Replay.VER} BETA',s.COL12,s.COL13) + s.hm('Replay', f'Version {Replay.VER} BETA', s.COL12, s.COL13) + def killui(s): s.up = s.camon = False [_.delete() for _ in s.trash()] s.kids.clear() s.camkids.clear() + def trash(s): return s.kids+s.camkids + def kek(s): - if getattr(s,'kekbusy',0): return + if getattr(s, 'kekbusy', 0): + return s.kekbusy = True - if getattr(s,'tbye',0) and getattr(s,'frbro',0): + if getattr(s, 'tbye', 0) and getattr(s, 'frbro', 0): s.frbro = s.tbye = False s.okt = None s.nah = b = not s.nah - otw(s.kekt,text=s.tex[b]) + otw(s.kekt, text=s.tex[b]) if b: - teck(0.2,lambda:obw(s.kekb,texture=gt('empty'))) - s.fkek(0.4,-0.05) + teck(0.2, lambda: obw(s.kekb, texture=gt('empty'))) + s.fkek(0.4, -0.05) s.killui() else: - obw(s.kekb,texture=gt('white')) - s.fkek(0,0.05) + obw(s.kekb, texture=gt('white')) + s.fkek(0, 0.05) s.mkui() s.pro() - teck(0.21,Call(setattr,s,'kekbusy',0)) - def fkek(s,i=0,a=0.1): - if i > 0.4 or i < 0: return - if not s.bg.exists(): return - iw(s.bg,opacity=i) - teck(0.02,Call(s.fkek,i+a,a)) - def hm(s,t1,t2,c1,c2): - if getattr(s,'tbye',0) and getattr(s,'frbro',0): + teck(0.21, Call(setattr, s, 'kekbusy', 0)) + + def fkek(s, i=0, a=0.1): + if i > 0.4 or i < 0: + return + if not s.bg.exists(): + return + iw(s.bg, opacity=i) + teck(0.02, Call(s.fkek, i+a, a)) + + def hm(s, t1, t2, c1, c2): + if getattr(s, 'tbye', 0) and getattr(s, 'frbro', 0): s.frbro = s.tbye = False s.okt = None - iw(s.ok,color=c1) - otw(s.ok2,text=t1,color=c2) - otw(s.ok3,text=t2,color=c2) + iw(s.ok, color=c1) + otw(s.ok2, text=t1, color=c2) + otw(s.ok3, text=t2, color=c2) s.fok() - s.okt = tock(1.5,s.unhm) + s.okt = tock(1.5, s.unhm) + def unhm(s): - s.fok(0.7,-0.1) - [otw(_,text='') for _ in [s.ok2,s.ok3] if _.exists()] - def fok(s,i=0,a=0.1): - if i > 0.7 or i < 0: return - if not s.ok.exists(): return - iw(s.ok,opacity=i) - teck(0.02,Call(s.fok,i+a,a)) - def toggle(s,dry=False,shut=False): - if not dry: s.ps = not s.ps - t = cs(getattr(sc,['PAUSE','PLAY'][s.ps]+'_BUTTON')) - otw(s.tt,text=t) + s.fok(0.7, -0.1) + [otw(_, text='') for _ in [s.ok2, s.ok3] if _.exists()] + + def fok(s, i=0, a=0.1): + if i > 0.7 or i < 0: + return + if not s.ok.exists(): + return + iw(s.ok, opacity=i) + teck(0.02, Call(s.fok, i+a, a)) + + def toggle(s, dry=False, shut=False): if not dry: - if not shut: s.hm(['Resume','Pause'][s.ps],basename(s.path)+f' of {getsize(s.path)} bytes',s.COL6,s.COL7) + s.ps = not s.ps + t = cs(getattr(sc, ['PAUSE', 'PLAY'][s.ps]+'_BUTTON')) + otw(s.tt, text=t) + if not dry: + if not shut: + s.hm(['Resume', 'Pause'][s.ps], basename(s.path) + + f' of {getsize(s.path)} bytes', s.COL6, s.COL7) if s.ps: s.stop() PAUSE() else: s.play() RESUME() + def fixps(s): - if not s.ps: return + if not s.ps: + return s.toggle(shut=True) - teck(0.02,Call(s.toggle,shut=True)) + teck(0.02, Call(s.toggle, shut=True)) + def clock(s): t = time() r = t - s.rt s.rt = t s.rn += r * s.sp - def boost(s,i): + + def boost(s, i): n = GET()+i SET(n) s.sp = 2**n - h = 'Snail Mode' if s.sp == 0.0625 else 'Slow Motion' if s.sp<1 else 'Quake Pro' if s.sp==16 else 'Fast Motion' if s.sp>1 else 'Normal Speed' - s.hm(h,f'Current exponent: x{s.sp}',s.COL2,s.COL3) + h = 'Snail Mode' if s.sp == 0.0625 else 'Slow Motion' if s.sp < 1 else 'Quake Pro' if s.sp == 16 else 'Fast Motion' if s.sp > 1 else 'Normal Speed' + s.hm(h, f'Current exponent: x{s.sp}', s.COL2, s.COL3) + def play(s): s.rt = time() s.clock() s.ptplay() - s.clt = tock(s.TICK,s.clock,repeat=True) + s.clt = tock(s.TICK, s.clock, repeat=True) + def stop(s): s.clt = None s.ptkill() + def ptkill(s): s.pt = None + def ptplay(s): - s.pt = tock(s.TICK,s.pro,repeat=True) - def seek(s,i): - h = ['Forward by','Rewind by'][i==-1] + s.pt = tock(s.TICK, s.pro, repeat=True) + + def seek(s, i): + h = ['Forward by', 'Rewind by'][i == -1] i = i * s.sp i = (s.ds/20)*i t = (s.rn-s.st)+i @@ -1077,43 +1165,53 @@ class Player: SEEK(t) s.rt = time() s.fixps() - i = abs(round(i,2)) - s.hm('Seek',h+f" {i} second{['s',''][i==1]}",s.COL4,s.COL5) - def jump(s,p): + i = abs(round(i, 2)) + s.hm('Seek', h+f" {i} second{['s', ''][i == 1]}", s.COL4, s.COL5) + + def jump(s, p): t = s.ds * p s.st = s.rn-t s.replay() SEEK(t) s.rt = time() s.fixps() + def bye(s): - if getattr(s,'frbro',0): s._bye(); return - s.hm('Exit','Press again to confirm',s.COL0,s.COL1) + if getattr(s, 'frbro', 0): + s._bye() + return + s.hm('Exit', 'Press again to confirm', s.COL0, s.COL1) s.frbro = True - s.tbye = tock(1.5,Call(setattr,s,'frbro',False)) + s.tbye = tock(1.5, Call(setattr, s, 'frbro', False)) + def _bye(s): - fade(0,time=0.75,endcall=Call(fade,1,time=0.75)) + fade(0, time=0.75, endcall=Call(fade, 1, time=0.75)) gs('deek').play() BYE() s.stop() s.fockill() s.tbye = None SCM(False) + def pro(s): t = s.rn-s.st - if s.rn-s.st >= s.ds: s.loop() - x,y = s.nbp + if s.rn-s.st >= s.ds: + s.loop() + x, y = s.nbp p = (t/s.ds)*s.px try: - iw(s.nb,position=(x+p,y)) - otw(s.ct,text=FOR(t)) - except ReferenceError: pass + iw(s.nb, position=(x+p, y)) + otw(s.ct, text=FOR(t)) + except ReferenceError: + pass + def replay(s): SEEK(-10**10) + def loop(s): s.st = s.rn = 0 s.replay() - bw = lambda s,label='',p=None,oac=None,pos=None,texture='white',**k: obw( + bw = lambda s, label='', p=None, oac=None, pos=None, texture='white', **k: obw( parent=p, on_activate_call=oac, position=pos, @@ -1123,76 +1221,113 @@ class Player: **k ) + # Tools -BYE = lambda: app.classic.return_to_main_menu_session_gracefully(reset_ui=False) -BTW = lambda t: (gs('block').play() or 1) and push(t,color=(1,1,0)) -GOS = lambda: gsw('overlay_stack') -FOR = lambda t: strftime('%H:%M:%S',gmtime(t)) -SCL = lambda a,b,c=None: ((s:=app.ui_v1.uiscale), a if s is UIS.SMALL else b if s is UIS.MEDIUM else (c or b))[1] -RND = lambda t: type(t)([round(_,1) for _ in t]) +def BYE(): return app.classic.return_to_main_menu_session_gracefully(reset_ui=False) + + +def BTW(t): return (gs('block').play() or 1) and push(t, color=(1, 1, 0)) +def GOS(): return gsw('overlay_stack') + + +def FOR(t): return strftime('%H:%M:%S', gmtime(t)) +def SCL(a, b, c=None): return ((s := app.ui_v1.uiscale), + a if s is UIS.SMALL else b if s is UIS.MEDIUM else (c or b))[1] + + +def RND(t): return type(t)([round(_, 1) for _ in t]) # pybrp -Z = lambda _:[0]*_ -G_FREQS = lambda:[ - 101342,9667,3497,1072,0,3793,*Z(2),2815,5235,*Z(3),3570,*Z(3), - 1383,*Z(3),2970,*Z(2),2857,*Z(8),1199,*Z(30), - 1494,1974,*Z(12),1351,*Z(122),1475,*Z(65) + + +def Z(_): return [0]*_ + + +def G_FREQS(): return [ + 101342, 9667, 3497, 1072, 0, 3793, *Z(2), 2815, 5235, *Z(3), 3570, *Z(3), + 1383, *Z(3), 2970, *Z(2), 2857, *Z(8), 1199, *Z(30), + 1494, 1974, *Z(12), 1351, *Z(122), 1475, *Z(65) ] -CMD_NAMES=lambda:{0:'BaseTimeStep',1:'StepSceneGraph',2:'AddSceneGraph',3:'RemoveSceneGraph',4:'AddNode',5:'NodeOnCreate',6:'SetForegroundScene',7:'RemoveNode',8:'AddMaterial',9:'RemoveMaterial',10:'AddMaterialComponent',11:'AddTexture',12:'RemoveTexture',13:'AddMesh',14:'RemoveMesh',15:'AddSound',16:'RemoveSound',17:'AddCollisionMesh',18:'RemoveCollisionMesh',19:'ConnectNodeAttribute',20:'NodeMessage',21:'SetNodeAttrFloat',22:'SetNodeAttrInt32',23:'SetNodeAttrBool',24:'SetNodeAttrFloats',25:'SetNodeAttrInt32s',26:'SetNodeAttrString',27:'SetNodeAttrNode',28:'SetNodeAttrNodeNull',29:'SetNodeAttrNodes',30:'SetNodeAttrPlayer',31:'SetNodeAttrPlayerNull',32:'SetNodeAttrMaterials',33:'SetNodeAttrTexture',34:'SetNodeAttrTextureNull',35:'SetNodeAttrTextures',36:'SetNodeAttrSound',37:'SetNodeAttrSoundNull',38:'SetNodeAttrSounds',39:'SetNodeAttrMesh',40:'SetNodeAttrMeshNull',41:'SetNodeAttrMeshes',42:'SetNodeAttrCollisionMesh',43:'SetNodeAttrCollisionMeshNull',44:'SetNodeAttrCollisionMeshes',45:'PlaySoundAtPosition',46:'PlaySound',47:'EmitBGDynamics',48:'EndOfFile',49:'DynamicsCorrection',50:'ScreenMessageBottom',51:'ScreenMessageTop',52:'AddData',53:'RemoveData',54:'CameraShake'} + + +def CMD_NAMES(): return {0: 'BaseTimeStep', 1: 'StepSceneGraph', 2: 'AddSceneGraph', 3: 'RemoveSceneGraph', 4: 'AddNode', 5: 'NodeOnCreate', 6: 'SetForegroundScene', 7: 'RemoveNode', 8: 'AddMaterial', 9: 'RemoveMaterial', 10: 'AddMaterialComponent', 11: 'AddTexture', 12: 'RemoveTexture', 13: 'AddMesh', 14: 'RemoveMesh', 15: 'AddSound', 16: 'RemoveSound', 17: 'AddCollisionMesh', 18: 'RemoveCollisionMesh', 19: 'ConnectNodeAttribute', 20: 'NodeMessage', 21: 'SetNodeAttrFloat', 22: 'SetNodeAttrInt32', 23: 'SetNodeAttrBool', 24: 'SetNodeAttrFloats', 25: 'SetNodeAttrInt32s', 26: 'SetNodeAttrString', 27: 'SetNodeAttrNode', 28: 'SetNodeAttrNodeNull', + 29: 'SetNodeAttrNodes', 30: 'SetNodeAttrPlayer', 31: 'SetNodeAttrPlayerNull', 32: 'SetNodeAttrMaterials', 33: 'SetNodeAttrTexture', 34: 'SetNodeAttrTextureNull', 35: 'SetNodeAttrTextures', 36: 'SetNodeAttrSound', 37: 'SetNodeAttrSoundNull', 38: 'SetNodeAttrSounds', 39: 'SetNodeAttrMesh', 40: 'SetNodeAttrMeshNull', 41: 'SetNodeAttrMeshes', 42: 'SetNodeAttrCollisionMesh', 43: 'SetNodeAttrCollisionMeshNull', 44: 'SetNodeAttrCollisionMeshes', 45: 'PlaySoundAtPosition', 46: 'PlaySound', 47: 'EmitBGDynamics', 48: 'EndOfFile', 49: 'DynamicsCorrection', 50: 'ScreenMessageBottom', 51: 'ScreenMessageTop', 52: 'AddData', 53: 'RemoveData', 54: 'CameraShake'} + + class _H: class _N: def __init__(self): - self.l,self.r,self.p,self.f=-1,-1,0,0 + self.l, self.r, self.p, self.f = -1, -1, 0, 0 + def __init__(self): - gf,self.nodes=G_FREQS(),[self._N()for _ in range(511)] - for i in range(256):self.nodes[i].f=gf[i] - nc=256 - while nc<511: - s1,s2=-1,-1 - i=0 - while self.nodes[i].p!=0:i+=1 - s1=i;i+=1 - while self.nodes[i].p!=0:i+=1 - s2=i;i+=1 - while iself.nodes[s2].f: - if self.nodes[i].f>7 - if not comp:return src - out,ptr,l=bytearray(),src[1:],len(src) - bl=((l-1)*8)-rem;bit=0 - while bit>3]>>(bit&7))&1;bit+=1 + gf, self.nodes = G_FREQS(), [self._N()for _ in range(511)] + for i in range(256): + self.nodes[i].f = gf[i] + nc = 256 + while nc < 511: + s1, s2 = -1, -1 + i = 0 + while self.nodes[i].p != 0: + i += 1 + s1 = i + i += 1 + while self.nodes[i].p != 0: + i += 1 + s2 = i + i += 1 + while i < nc: + if self.nodes[i].p == 0: + if self.nodes[s1].f > self.nodes[s2].f: + if self.nodes[i].f < self.nodes[s1].f: + s1 = i + elif self.nodes[i].f < self.nodes[s2].f: + s2 = i + i += 1 + self.nodes[nc].f = self.nodes[s1].f+self.nodes[s2].f + self.nodes[s1].p = self.nodes[s2].p = nc-255 + self.nodes[nc].r, self.nodes[nc].l = s1, s2 + nc += 1 + + def decompress(self, src): + if not src: + return b'' + rem, comp = src[0] & 15, src[0] >> 7 + if not comp: + return src + out, ptr, l = bytearray(), src[1:], len(src) + bl = ((l-1)*8)-rem + bit = 0 + while bit < bl: + m_bit = (ptr[bit >> 3] >> (bit & 7)) & 1 + bit += 1 if m_bit: - n=510 - while n>=256: - if bit>=bl:raise ValueError("Incomplete Huffman code") - p_bit=(ptr[bit>>3]>>(bit&7))&1;bit+=1 - n=self.nodes[n].l if p_bit==0 else self.nodes[n].r + n = 510 + while n >= 256: + if bit >= bl: + raise ValueError("Incomplete Huffman code") + p_bit = (ptr[bit >> 3] >> (bit & 7)) & 1 + bit += 1 + n = self.nodes[n].l if p_bit == 0 else self.nodes[n].r out.append(n) else: - if bit+8>bl:break - bi,b_in_b=bit>>3,bit&7 - val=ptr[bi]if b_in_b==0 else(ptr[bi]>>b_in_b)|(ptr[bi+1]<<(8-b_in_b)) - out.append(val&255);bit+=8 + if bit+8 > bl: + break + bi, b_in_b = bit >> 3, bit & 7 + val = ptr[bi]if b_in_b == 0 else (ptr[bi] >> b_in_b) | (ptr[bi+1] << (8-b_in_b)) + out.append(val & 255) + bit += 8 return bytes(out) + + def GMS(_h, brp_path, par): total_ms = 0 with open(brp_path, 'rb') as f: - f.seek(0,2) + f.seek(0, 2) par[1] = f.tell() f.seek(6) while True: - if par: par[0] = f.tell() + if par: + par[0] = f.tell() b_data = f.read(1) if not b_data: break @@ -1201,7 +1336,7 @@ def GMS(_h, brp_path, par): comp_len = b1 elif b1 == 254: comp_len = int.from_bytes(f.read(2), 'little') - else: # 255 + else: # 255 comp_len = int.from_bytes(f.read(4), 'little') if comp_len == 0: continue @@ -1220,32 +1355,37 @@ def GMS(_h, brp_path, par): if sub_data and sub_data[0] == 0: total_ms += sub_data[1] sub_off += 2 + sub_size - if par: par[0] = par[1] + if par: + par[0] = par[1] return total_ms # brobord collide grass # ba_meta require api 9 # ba_meta export babase.Plugin + + class byBordd(Plugin): def __init__(s): from bauiv1lib.ingamemenu import InGameMenuWindow as m - a = '_refresh_in_game'; o = getattr(m,a) - setattr(m,a,lambda v,*a,**k:(s.mk(v),o(v,*a,**k))[1]) + a = '_refresh_in_game' + o = getattr(m, a) + setattr(m, a, lambda v, *a, **k: (s.mk(v), o(v, *a, **k))[1]) from bauiv1lib.watch import WatchWindow as n - b = '__init__'; p = getattr(n,b) - setattr(n,b,lambda v,*a,**k:(p(v,*a,**k),s.mk(v,1))[0]) - def mk(s,v,i=0): + b = '__init__' + p = getattr(n, b) + setattr(n, b, lambda v, *a, **k: (p(v, *a, **k), s.mk(v, 1))[0]) + + def mk(s, v, i=0): if i: - x = v._width/2+SCL(v._scroll_width*-0.5+93,0)+100 - y = v.yoffs-SCL(63,10)-25 + x = v._width/2+SCL(v._scroll_width*-0.5+93, 0)+100 + y = v.yoffs-SCL(63, 10)-25 s.b = Replay.bw( Replay, p=v._root_widget, label='Replay', - pos=(x,y) if i else (-70,0), + pos=(x, y) if i else (-70, 0), icon=gt('replayIcon'), iconscale=1.6 if i else 0.8, - size=(140,50) if i else (90,35), - oac=lambda:Replay(source=s.b) + size=(140, 50) if i else (90, 35), + oac=lambda: Replay(source=s.b) ) - diff --git a/plugins/utilities/topmsg.py b/plugins/utilities/topmsg.py index f5bcae0..13cdea3 100755 --- a/plugins/utilities/topmsg.py +++ b/plugins/utilities/topmsg.py @@ -19,13 +19,15 @@ from bascenev1 import ( # ba_meta require api 9 # ba_meta export babase.Plugin + + class byBordd(Plugin): - __init__ = lambda s: (setattr(s,'la',None),z(5,s.ear))[1] + def __init__(s): return (setattr(s, 'la', None), z(5, s.ear))[1] + def ear(s): a = gcm() if a and s.la != a[-1]: if app.config.resolve('Chat Muted'): - push(a[-1],(1,1,1),True) + push(a[-1], (1, 1, 1), True) s.la = a[-1] z(0.1, s.ear) -