Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.41 KB | None | 0 0
  1. from __future__ import division
  2. from math import sin,cos,tan,atan2,hypot,pi
  3. import pygame
  4. from time import time
  5. black=(0,0,0)
  6. bgcol=(220,200,160)
  7. size = width, height = 900,640
  8. cl=pygame.time.Clock()
  9. screen = pygame.display.set_mode(size)
  10.  
  11. example={(0,0):["F",[],None,None,"1/44100",1],
  12.         (0,1):["F",[],None,None,"2/44100",None],
  13.         (1,0):["C",[1,1,100],None,None,100,None],
  14.         (2,0):["C",[50,0,2],None,None,1,None],
  15.         (1,1):["C",[1,1,100],None,None,100,None],
  16.         (2,1):["C",[50,0,2],None,None,-1,None],
  17.         (3,0):["F",[],None,None,None,1],
  18.         (3,1):["T",["wave"],None,None,None,None]
  19.         }
  20. glyphs=example
  21. activeglyph=None
  22. selected=False
  23. modifying=False
  24. pos=(0,0)
  25. subpos=(0,0)#centre
  26. scale=64
  27. glyphcols={
  28.     "F":((100,0,100),(255,255,255)),
  29.     "A":((200,200,0),(0,0,128)),
  30.     "M":((255,0,0),(0,96,96)),
  31.     "C":((196,196,196),(0,0,0)),
  32.     "O":((196,196,196),(0,0,0)),
  33.     "T":((0,0,0),(255,255,255))}
  34. pygame.init()
  35. fontLarge1 = pygame.font.Font(None, 32)
  36. glyphtypes={"F":"flowglyph","A":"amplifierglyph","M":"multiplierglyph","C":"capacitorglyph","O":"circleglyph","T":"traceglyph"}
  37. fontSmall1 = pygame.font.Font(None, 16)
  38. fontLarge2 = pygame.font.Font(None, 64)
  39. fontSmall2 = pygame.font.Font(None, 32)
  40. def makeprogram():
  41.     global glyphs
  42.     g={}
  43.     for i in glyphs:
  44.         if glyphs[i][0]!="T":
  45.             g[i]=glyphtypes[glyphs[i][0]]+"("+",".join(map(str,glyphs[i][1]))+("" if len(glyphs[i][1])==0 else ",")+",".join(map(str,glyphs[i][2:6]))+")"            
  46.         else:
  47.             g[i]=glyphtypes[glyphs[i][0]]+"(\""+glyphs[i][1][0]+"\")"
  48.     s="grid({},\n{"
  49.     for i in g:
  50.         s+=str(i)+":"+g[i]+",\n"
  51.     s+="})"
  52.     return s
  53.  
  54.  
  55. def drawgrid(scale=64):
  56.     for i in range(int(640/scale)+1):
  57.         pygame.draw.line(screen, (255,255,255), (i*scale,0), (i*scale,640), 3)
  58.         pygame.draw.line(screen, (255,255,255), (0,i*scale), (640,i*scale), 3)
  59.  
  60. def drawselection():
  61.     global selected,inpos
  62.     if selected:
  63.         pygame.draw.rect(screen,(255,255,255),(pos[0]*scale,pos[1]*scale,scale,scale))
  64.     else:
  65.         pygame.draw.rect(screen,(255,0,0),(pos[0]*scale,pos[1]*scale,scale,scale))
  66.     if inpos!=None:
  67.         pygame.draw.rect(screen,(0,200,255),(inpos[0]*scale,inpos[1]*scale,scale,scale))        
  68.  
  69. def drawsubpos():
  70.     global selected,subpos
  71.     if selected:
  72.         h=[10,100,160,246][subpos[0]+1]
  73.         v=[10,128,246][subpos[1]+1]
  74.         pygame.draw.line(screen,(0,0,0), (760,v+40) if subpos[0]==1 else (640+h,v) ,(764,v+40) if subpos[0]==1 else (644+h,v),9)
  75. def drawsidebar():
  76.         global glyphs,pos
  77.         pygame.draw.rect(screen,(160,140,90),(640,0,900,640))
  78.         if activeglyph==None:
  79.             pygame.draw.rect(screen,(100,100,100),(642,2,256,256))
  80.         else:
  81.             pygame.draw.rect(screen,(255,255,255),(642,2,256,256))
  82.             #Drawpos
  83.         if pos in glyphs:
  84.             global modifying,subpos,inp
  85.             if modifying:
  86.                 Type,vals,left,up,right,down=glyphs[pos]
  87.                 left,up,right,down=[a if a!= None else "_" for a in [left,up,right,down]]
  88.                 if subpos==(0,0):
  89.                     text = fontLarge2.render(inp+"_", True, (0, 0 ,0))
  90.  
  91.                     screen.blit(text,(734, 96))
  92.                 else:
  93.                     text = fontLarge2.render(Type, True, (0, 0 ,0))
  94.                     screen.blit(text,(734, 96))
  95.                 if subpos==(1,0):
  96.                     text = fontSmall2.render(inp+"_" , True, (0, 0 ,0))
  97.                     screen.blit(text,(760, 140))
  98.                 else:
  99.                     text = fontSmall2.render("("+str(vals)[1:-1]+")" if len(vals)>1 else "" if vals==[] else str(vals[0]) , True, (0, 0 ,0))
  100.                     screen.blit(text,(760, 140))
  101.                 if subpos==(-1,0):
  102.                     text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
  103.                     screen.blit(text,(650, 112))
  104.                 else:
  105.                     text = fontSmall2.render(str(left), True, (0, 0 ,0))
  106.                     screen.blit(text,(650, 112))
  107.                 if subpos==(0,-1):
  108.                     text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
  109.                     screen.blit(text,(760, 10))
  110.                 else:
  111.                     text = fontSmall2.render(str(up), True, (0, 0 ,0))
  112.                     screen.blit(text,(760, 10))
  113.                 if subpos==(2,0):
  114.                     text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
  115.                     screen.blit(text,(860-len(str(right))*8, 112))
  116.                 else:
  117.                     text = fontSmall2.render(str(right), True, (0, 0 ,0))
  118.                     screen.blit(text,(860-len(str(right))*8, 112))
  119.                 if subpos==(0,1):
  120.                     text = fontSmall2.render(inp+"_", True, (0, 0 ,0))
  121.                     screen.blit(text,(760, 234))
  122.                 else:
  123.                     text = fontSmall2.render(str(down), True, (0, 0 ,0))
  124.                     screen.blit(text,(760, 234))
  125.             else:                    
  126.                 Type,vals,left,up,right,down=glyphs[pos]
  127.                 left,up,right,down=[a if a!= None else "_" for a in [left,up,right,down]]
  128.                 text = fontLarge2.render(Type, True, (0, 0 ,0))
  129.                 screen.blit(text,(734, 96))
  130.                 text = fontSmall2.render("("+str(vals)[1:-1]+")" if len(vals)>1 else "" if vals==[] else str(vals[0]) , True, (0, 0 ,0))
  131.                 screen.blit(text,(760, 140))
  132.                 text = fontSmall2.render(str(left), True, (0, 0 ,0))
  133.                 screen.blit(text,(650, 112))
  134.                 text = fontSmall2.render(str(up), True, (0, 0 ,0))
  135.                 screen.blit(text,(760, 10))
  136.                 text = fontSmall2.render(str(right), True, (0, 0 ,0))
  137.                 screen.blit(text,(860-len(str(right))*8, 112))
  138.                 text = fontSmall2.render(str(down), True, (0, 0 ,0))
  139.                 screen.blit(text,(760, 234))
  140.  
  141. def drawglyphs():
  142.     global glyphs,glyphcols
  143.     for i in glyphs:
  144.         if glyphs[i][0]!="_":
  145.             if glyphs[i][0] in glyphcols:
  146.                 bgcol,fgcol=glyphcols[glyphs[i][0]]
  147.             else:
  148.                 bgcol,fgcol=((1,1,1),(0,0,0))
  149.             pygame.draw.rect(screen,bgcol,(i[0]*scale+scale/16,i[1]*scale+scale/16,scale*7/8,scale*7/8))
  150.     for i in glyphs:        
  151.         if glyphs[i][0]!="_":
  152.             bgcol,fgcol=glyphcols[glyphs[i][0]]
  153.             Type=glyphs[i][0]
  154.             #DROPSHADOW GLYPHTYPE
  155.             text = fontLarge1.render(Type, True, (32, 32 ,32))
  156.             screen.blit(text,((i[0]+.37)*scale, (i[1]+.25)*scale))
  157.             text = fontLarge1.render(Type, True, (220, 220, 220))
  158.             screen.blit(text,((i[0]+.40)*scale, (i[1]+.28)*scale))
  159.             ######END DROPSHADOW
  160.             vals=glyphs[i][1]
  161.             #vals
  162.             text = fontSmall1.render("("+str(vals)[1:-1]+")" if len(vals)>1 else "" if vals==[] else str(vals[0]) , True, fgcol)
  163.             screen.blit(text,((i[0]+.15)*scale, (i[1]+.52)*scale))
  164.             left,up,right,down=[a if a!=None else "" for a in glyphs[i][2:6]]
  165.             #LEFT
  166.             text = fontSmall1.render(str(left), True, fgcol)
  167.             screen.blit(text,((i[0]+.05)*scale, (i[1]+.42)*scale))
  168.             #UP
  169.             text = fontSmall1.render(str(up), True, fgcol)
  170.             screen.blit(text,((i[0]+.37)*scale, (i[1]+.05)*scale))
  171.             #RIGHT
  172.             text = fontSmall1.render(str(right), True, fgcol)
  173.             screen.blit(text,((i[0]+.8)*scale-4*len(str(right)), (i[1]+.42)*scale))
  174.             #DOWN
  175.             text = fontSmall1.render(str(down), True, fgcol)
  176.             screen.blit(text,((i[0]+.37)*scale, (i[1]+.8)*scale))
  177.            
  178. def movecursor(keys):
  179.     global pos
  180.     if keys[pygame.K_LEFT]:
  181.         pos=(max(0,pos[0]-1),pos[1])
  182.     if keys[pygame.K_RIGHT]:
  183.         pos=(pos[0]+1,pos[1])        
  184.     if keys[pygame.K_UP]:
  185.         pos=(pos[0],max(0,pos[1]-1))
  186.     if keys[pygame.K_DOWN]:
  187.         pos=(pos[0],pos[1]+1)
  188.  
  189. def movesubselection(keys):
  190.     global subpos
  191.     if subpos==(-1,0):
  192.         if keys[pygame.K_UP]:subpos=(0,-1)
  193.         if keys[pygame.K_DOWN]:subpos=(0,1)
  194.         if keys[pygame.K_RIGHT]:subpos=(0,0)
  195.     elif subpos==(0,0):
  196.         if keys[pygame.K_UP]:subpos=(0,-1)
  197.         if keys[pygame.K_DOWN]:subpos=(0,1)
  198.         if keys[pygame.K_LEFT]:subpos=(-1,0)
  199.         if keys[pygame.K_RIGHT]:subpos=(1,0)
  200.     elif subpos==(0,1):
  201.         if keys[pygame.K_UP]:subpos=(0,0)
  202.         if keys[pygame.K_LEFT]:subpos=(-1,0)
  203.         if keys[pygame.K_RIGHT]:subpos=(1,0)
  204.     elif subpos==(0,-1):
  205.         if keys[pygame.K_DOWN]:subpos=(0,0)
  206.         if keys[pygame.K_LEFT]:subpos=(-1,0)
  207.         if keys[pygame.K_RIGHT]:subpos=(1,0)
  208.     elif subpos==(1,0):
  209.         if keys[pygame.K_UP]:subpos=(0,-1)
  210.         if keys[pygame.K_DOWN]:subpos=(0,1)
  211.         if keys[pygame.K_LEFT]:subpos=(0,0)
  212.         if keys[pygame.K_RIGHT]:subpos=(2,0)
  213.     elif subpos==(2,0):
  214.         if keys[pygame.K_UP]:subpos=(0,-1)
  215.         if keys[pygame.K_DOWN]:subpos=(0,1)
  216.         if keys[pygame.K_LEFT]:subpos=(1,0)
  217. def modify(keys):
  218.     global inp,subpos
  219.     if keys[pygame.K_LSHIFT] or subpos==(0,0):
  220.         d={
  221.             pygame.K_1:"1",pygame.K_2:"2",pygame.K_3:"3",pygame.K_4:"4",pygame.K_5:"5",pygame.K_6:"6",pygame.K_7:"7",pygame.K_8:"8",pygame.K_9:"9",pygame.K_0:"0",
  222.             pygame.K_a:"A",pygame.K_b:"B",pygame.K_c:"C",pygame.K_d:"D",pygame.K_e:"E",pygame.K_f:"F",pygame.K_g:"G",pygame.K_h:"H",pygame.K_i:"I",pygame.K_j:"J",
  223.             pygame.K_k:"K",pygame.K_l:"L",pygame.K_m:"M",pygame.K_n:"N",pygame.K_o:"O",pygame.K_p:"P",pygame.K_q:"Q",pygame.K_r:"R",pygame.K_s:"S",pygame.K_t:"T",
  224.             pygame.K_u:"U",pygame.K_v:"V",pygame.K_w:"W",pygame.K_x:"X",pygame.K_y:"Y",pygame.K_z:"Z",pygame.K_LEFTBRACKET:"{",pygame.K_RIGHTBRACKET:"}",pygame.K_COMMA:"<"
  225.             ,pygame.K_PERIOD:">",pygame.K_SLASH:"?"}
  226.     else:
  227.         d={
  228.             pygame.K_1:"1",pygame.K_2:"2",pygame.K_3:"3",pygame.K_4:"4",pygame.K_5:"5",pygame.K_6:"6",pygame.K_7:"7",pygame.K_8:"8",pygame.K_9:"9",pygame.K_0:"0",
  229.             pygame.K_a:"a",pygame.K_b:"b",pygame.K_c:"c",pygame.K_d:"d",pygame.K_e:"e",pygame.K_f:"f",pygame.K_g:"g",pygame.K_h:"h",pygame.K_i:"i",pygame.K_j:"j",
  230.             pygame.K_k:"k",pygame.K_l:"l",pygame.K_m:"m",pygame.K_n:"n",pygame.K_o:"o",pygame.K_p:"p",pygame.K_q:"q",pygame.K_r:"r",pygame.K_s:"s",pygame.K_t:"t",
  231.             pygame.K_u:"k",pygame.K_v:"v",pygame.K_w:"w",pygame.K_x:"x",pygame.K_y:"y",pygame.K_z:"z",pygame.K_LEFTBRACKET:"[",pygame.K_RIGHTBRACKET:"]",pygame.K_COMMA:","
  232.             ,pygame.K_PERIOD:".",pygame.K_SLASH:"/"}
  233.     if keys[pygame.K_SPACE]:
  234.         inp=inp+" "
  235.     if keys[pygame.K_BACKSPACE]:
  236.         inp=inp[:-1]
  237.     for i in d:
  238.         if keys[i]:inp+=d[i]
  239.    
  240. def openglyph(pos):
  241.     global activeglyph,glyphs,selected,subpos
  242.     if not pos in glyphs:
  243.         glyphs[pos]=["_",[],None,None,None,None]
  244.     subpos=(0,0)
  245.     activeglyph=glyphs[pos]
  246.     selected=True
  247.    
  248.    
  249. def closeglyph(pos):
  250.     global activeglyph,selected
  251.     activeglyph=None
  252.     selected=False
  253.  
  254. def menu(keys):
  255.             global modifying,inp,glyphs
  256.             if modifying:
  257.                 modify(keys)
  258.                 if keys[pygame.K_RETURN]:
  259.                     if subpos==(0,0):glyphs[pos][0]="_" if inp=="_" or inp=="" else inp
  260.                     if subpos==(1,0):glyphs[pos][1]=eval("["+inp[1:-1]+"]")
  261.                     if subpos==(-1,0):glyphs[pos][2]=None if inp=="_" or inp=="" else inp
  262.                     if subpos==(0,-1):glyphs[pos][3]=None if inp=="_" or inp=="" else inp
  263.                     if subpos==(2,0):glyphs[pos][4]=None if inp=="_" or inp=="" else inp
  264.                     if subpos==(0,1):glyphs[pos][5]=None if inp=="_" or inp=="" else inp
  265.                        
  266.                     modifying=False
  267.             else:
  268.                 if keys[pygame.K_RETURN]:
  269.                     closeglyph(pos)
  270.                 movesubselection(keys)
  271.                 if keys[pygame.K_SPACE]:
  272.                     modifying=True
  273.                     d={(0,0):glyphs[pos][0],
  274.                        (1,0):glyphs[pos][1],
  275.                        (-1,0):glyphs[pos][2],
  276.                        (0,-1):glyphs[pos][3],
  277.                        (2,0):glyphs[pos][4],
  278.                        (0,1):glyphs[pos][5]
  279.                        }
  280.                     inp=str("" if d[subpos]==None else d[subpos])
  281. inpos=None                          
  282. lastrefresh=0
  283. keys=pygame.key.get_pressed()
  284. offkeys=map(lambda x:0,keys)
  285. name="PROGNAME"
  286. while 1:
  287.     keys=tuple(map(lambda a,b,c:max(a,b) if c==0 else 0,keys,pygame.key.get_pressed(),offkeys))
  288.     t=time()
  289.     if lastrefresh+1/10<t:
  290.         if selected:
  291.             menu(keys)
  292.         else:
  293.             movecursor(keys)
  294.             if keys[pygame.K_SPACE]:
  295.                 openglyph(pos)
  296.             if keys[pygame.K_F5]:
  297.                 prog= makeprogram()
  298.                 print prog
  299.                 from gridlang import *
  300.                 open(name,"w").write(prog)
  301.                 p=eval(prog)
  302.             if keys[pygame.K_i]:
  303.                 inpos=pos
  304.         screen.fill(bgcol)
  305.         drawgrid()
  306.         drawselection()
  307.         drawglyphs()
  308.         drawsidebar()
  309.         drawsubpos()
  310.         pygame.display.flip()
  311.         lastrefresh=t
  312.         offkeys=map(lambda x:x,keys)
  313.         offkeys[pygame.K_LSHIFT]=0
  314.         keys=map(lambda a,b:a if b==0 else 0,pygame.key.get_pressed(),offkeys)
  315.     pygame.event.pump()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement