Compare commits
25 Commits
master
...
avec_class
Author | SHA1 | Date |
---|---|---|
Le_dahut | 03a24430d0 | |
Le_dahut | dd55a1cfd8 | |
Le_dahut | 14a654d791 | |
Le_dahut | 7f8b8236a0 | |
Le_dahut | 0636650edd | |
Le_dahut | 9c9ad68a88 | |
Le_dahut | 4306452b89 | |
Le_dahut | 9c86d9ace9 | |
Le_dahut | 1a0b6f9987 | |
Le_dahut | eee0cd6aab | |
Le_dahut | e082379433 | |
Le_dahut | 4613faa566 | |
Le_dahut | e192e4ebd1 | |
Le_dahut | cab2e45517 | |
Le_dahut | 7b0656de07 | |
Le_dahut | b9a993bb99 | |
Le_dahut | 7684f46b39 | |
Le_dahut | f3238217c7 | |
Le_dahut | 49d19509bc | |
Le_dahut | 87aa26a1c2 | |
Le_dahut | 473764306e | |
Le_dahut | eb6494300b | |
Le_dahut | cd70c0f236 | |
Le_dahut | 21d978f459 | |
Le_dahut | 107ab3ca56 |
|
@ -0,0 +1,466 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
'''
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
Microlinux
|
||||||
|
|
||||||
|
Classes OpenGl
|
||||||
|
|
||||||
|
(C) Copyright 2013-2014 Nicolas Hordé
|
||||||
|
|
||||||
|
------------------------------------------
|
||||||
|
'''
|
||||||
|
import datetime
|
||||||
|
import math
|
||||||
|
import copy
|
||||||
|
import random
|
||||||
|
import time
|
||||||
|
import operator
|
||||||
|
|
||||||
|
import pyglet
|
||||||
|
from GLclass import *
|
||||||
|
from pyglet.gl import *
|
||||||
|
from pyglet.window import mouse
|
||||||
|
from pyglet.window import key
|
||||||
|
from pyglet import clock
|
||||||
|
from pyglet import image
|
||||||
|
|
||||||
|
''' *********************************************************************************************** '''
|
||||||
|
''' Classes graphiques '''
|
||||||
|
|
||||||
|
#Classe comme un label avec l'attribut visible
|
||||||
|
class alabel(pyglet.text.Label):
|
||||||
|
def __init__(self, window, xx, yy, visible=True, text="", font="Deja vu sans", size=16, group=None):
|
||||||
|
self.window = window
|
||||||
|
self.font=font
|
||||||
|
self.size=size
|
||||||
|
self.visible = visible
|
||||||
|
super(alabel, self).__init__(text,x=xx,y=yy,font_name=self.font,font_size=self.size,group=group,batch=self.window.batch)
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def update(self,dt):
|
||||||
|
if not self.visible:
|
||||||
|
if self.x!=10000:
|
||||||
|
self.xx=self.x
|
||||||
|
self.x=10000
|
||||||
|
else:
|
||||||
|
if self.x==10000:
|
||||||
|
self.x=self.xx
|
||||||
|
self.font_size=self.size
|
||||||
|
self.font_name=self.font
|
||||||
|
|
||||||
|
# Classe d'un rectangle
|
||||||
|
class arect(object):
|
||||||
|
def __init__(self, window, x, y, width, height, visible=True, typeof=0, color=(180, 180, 180, 255), group=None):
|
||||||
|
self.window = window
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.width = width
|
||||||
|
self.height = height
|
||||||
|
self.typeof = typeof
|
||||||
|
self.color = color
|
||||||
|
self.group = group
|
||||||
|
self.visible = visible
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def update(self,dt):
|
||||||
|
try:
|
||||||
|
self.vertex_list.delete()
|
||||||
|
except:
|
||||||
|
foo = 0
|
||||||
|
try:
|
||||||
|
self.vertex_list2.delete()
|
||||||
|
except:
|
||||||
|
foo = 0
|
||||||
|
if self.visible and (self.typeof == "face" or self.typeof == "both"):
|
||||||
|
self.vertex_list = self.window.batch.add(4, pyglet.gl.GL_QUADS, self.group, (
|
||||||
|
'v2i', [self.x, self.y, self.x+self.width, self.y, self.x+self.width, self.y+self.height, self.x, self.y+self.height]),
|
||||||
|
('c4B', self.color * 4))
|
||||||
|
if self.visible and self.typeof == "line" or self.typeof == "both":
|
||||||
|
self.vertex_list2 = self.window.batch.add(4, pyglet.gl.GL_LINE_LOOP, self.group,
|
||||||
|
('v2i',
|
||||||
|
[self.x, self.y, self.x+self.width, self.y, self.x+self.width, self.y+self.height, self.x, self.y+self.height]),
|
||||||
|
('c3B', [self.color[0], self.color[1], self.color[2]] * 4))
|
||||||
|
|
||||||
|
#Classe d'un texte editable
|
||||||
|
class atext(object):
|
||||||
|
def __init__(self, window, x, y, width, height, visible=True, text="", font="Deja vu sans", size=10, align="center", color=(180, 180, 180, 255)):
|
||||||
|
self.evalx = x
|
||||||
|
self.evaly = y
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.window = window
|
||||||
|
if type(self.evalx) is str:
|
||||||
|
self.x = eval(self.evalx)
|
||||||
|
if type(self.evaly) is str:
|
||||||
|
self.y = eval(self.evaly)
|
||||||
|
self.loaded = ''
|
||||||
|
self.align = align
|
||||||
|
self.font = font
|
||||||
|
self.size = size
|
||||||
|
self.text = text
|
||||||
|
self.color = color
|
||||||
|
self.height = height
|
||||||
|
self.visible = visible
|
||||||
|
self.document = pyglet.text.document.FormattedDocument(text.decode("utf8"))
|
||||||
|
self.document.set_style(0, len(self.document.text),dict(font_name=self.font, font_size=self.size, color=self.color, align=self.align,
|
||||||
|
background_color=(200, 200, 200, 0)))
|
||||||
|
if height == 0:
|
||||||
|
font = self.document.get_font(0)
|
||||||
|
height = font.ascent - font.descent
|
||||||
|
self.layout = pyglet.text.layout.IncrementalTextLayout(self.document, width, height, multiline=True,
|
||||||
|
batch=self.window.batch, group=self.window.p3)
|
||||||
|
self.layout.document.register_event_type('self.on_insert_text')
|
||||||
|
self.layout.on_layout_update = self.on_layout_update
|
||||||
|
self.caret = pyglet.text.caret.Caret(self.layout)
|
||||||
|
self.caret.visible = False
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def update(self,dt):
|
||||||
|
self.layout.begin_update()
|
||||||
|
if type(self.evalx) is str:
|
||||||
|
self.x = eval(self.evalx)
|
||||||
|
if type(self.evaly) is str:
|
||||||
|
self.y = eval(self.evaly)
|
||||||
|
if self.visible:
|
||||||
|
self.layout.x = self.x
|
||||||
|
else:
|
||||||
|
self.layout.x = 10000
|
||||||
|
self.layout.y = self.y
|
||||||
|
#self.layout.document.text = self.text.decode('utf8')
|
||||||
|
if len(self.layout.document.text) > 0:
|
||||||
|
self.layout.document.set_style(0, len(self.layout.document.text),
|
||||||
|
dict(font_name=self.font, font_size=self.size, color=self.color, align=self.align,
|
||||||
|
background_color=(200, 200, 200, 0)))
|
||||||
|
self.layout.end_update()
|
||||||
|
|
||||||
|
def on_layout_update(self):
|
||||||
|
if self.loaded != '':
|
||||||
|
#exec (self.loaded + '="' + self.layout.document.text + '"')
|
||||||
|
self.text = self.layout.document.text
|
||||||
|
|
||||||
|
def hit_test(self, x, y):
|
||||||
|
return (0 < x - self.layout.x < self.layout.width and 0 < y - self.layout.y < self.layout.height)
|
||||||
|
|
||||||
|
|
||||||
|
#Bouton sensible a plusieurs évènements, types: function, multicon, icon, color,
|
||||||
|
# et text in,left,top,bottom,right
|
||||||
|
class abutton(object):
|
||||||
|
def update(self, dt):
|
||||||
|
if not self.hilite and dt>0:
|
||||||
|
return
|
||||||
|
try:
|
||||||
|
self.vertex_list.delete()
|
||||||
|
except:
|
||||||
|
foo = 0
|
||||||
|
try:
|
||||||
|
self.vertex_list2.delete()
|
||||||
|
except:
|
||||||
|
foo = 0
|
||||||
|
try:
|
||||||
|
self.vertex_list3.delete()
|
||||||
|
except:
|
||||||
|
foo = 0
|
||||||
|
if type(self.evalx) is str:
|
||||||
|
self.x = eval(self.evalx)
|
||||||
|
if type(self.evaly) is str:
|
||||||
|
self.y = eval(self.evaly)
|
||||||
|
|
||||||
|
if self.typeof == 'color':
|
||||||
|
if self.isvisible():
|
||||||
|
if not self.isactive():
|
||||||
|
color = (self.content[0], self.content[1], self.content[2], 127)
|
||||||
|
else:
|
||||||
|
color = (self.content[0], self.content[1], self.content[2], 255)
|
||||||
|
self.vertex_list = self.window.batch.add(4, pyglet.gl.GL_QUADS, self.window.p1,
|
||||||
|
('v2i', (self.x, self.y, self.x + self.width, self.y,
|
||||||
|
self.x + self.width, self.y + self.height, self.x,
|
||||||
|
self.y + self.height)),
|
||||||
|
('c4B', color * 4))
|
||||||
|
elif self.typeof == 'function':
|
||||||
|
self.vertex_list = eval(self.content)
|
||||||
|
else:
|
||||||
|
if self.typeof == 'multicon':
|
||||||
|
self.sprite.image = self.content[self.index]
|
||||||
|
else:
|
||||||
|
self.sprite.image = self.content
|
||||||
|
self.sprite.visible=self.isvisible()
|
||||||
|
if self.width == 0:
|
||||||
|
self.width = self.sprite.image.width
|
||||||
|
if self.height == 0:
|
||||||
|
self.height = self.sprite.image.height
|
||||||
|
if self.text!='':
|
||||||
|
self.layout.begin_update()
|
||||||
|
self.layout.document.text=self.text
|
||||||
|
self.layout.document.set_style(0, len(self.layout.document.text),dict(font_name=self.font, font_size=self.size))
|
||||||
|
self.layout.end_update()
|
||||||
|
if self.align=="top" or self.align=="bottom":
|
||||||
|
font = self.layout.document.get_font(0)
|
||||||
|
self.height+= font.ascent - font.descent
|
||||||
|
elif self.align=="left" or self.align=="right":
|
||||||
|
self.width+=self.layout.content_width
|
||||||
|
if self.width / float(self.height) < self.sprite.image.width / float(self.sprite.image.height):
|
||||||
|
self.sprite.scale = float(self.width) / self.sprite.image.width
|
||||||
|
else:
|
||||||
|
self.sprite.scale = float(self.height) / self.sprite.image.height
|
||||||
|
self.sprite.x=self.x
|
||||||
|
self.sprite.y=self.y
|
||||||
|
if not self.isactive():
|
||||||
|
self.sprite.color = (60, 60, 60)
|
||||||
|
else:
|
||||||
|
self.sprite.color = (255, 255, 255)
|
||||||
|
if self.text != '':
|
||||||
|
self.layout.begin_update()
|
||||||
|
if not self.scale:
|
||||||
|
self.sprite.scale=1
|
||||||
|
picalign="center"
|
||||||
|
if not self.isvisible():
|
||||||
|
self.layout.x=10000
|
||||||
|
elif self.align=="right":
|
||||||
|
self.sprite.x=self.x
|
||||||
|
self.sprite.y=self.y+(self.height-self.sprite.height)/2
|
||||||
|
self.layout.x=self.sprite.x+self.sprite.width
|
||||||
|
self.layout.width=self.width-self.sprite.width
|
||||||
|
self.layout.y=self.y
|
||||||
|
self.layout.height=self.height
|
||||||
|
self.layout.content_valign='center'
|
||||||
|
picalign="left"
|
||||||
|
elif self.align=="left":
|
||||||
|
self.sprite.x=self.x+self.width-self.sprite.width
|
||||||
|
self.sprite.y=self.y+(self.height-self.sprite.height)/2
|
||||||
|
self.layout.x=self.x
|
||||||
|
self.layout.width=self.width-self.sprite.width
|
||||||
|
self.layout.y=self.y
|
||||||
|
self.layout.height=self.height
|
||||||
|
self.layout.content_valign='center'
|
||||||
|
picalign="right"
|
||||||
|
elif self.align=="bottom":
|
||||||
|
self.sprite.x=self.x+(self.width-self.sprite.width)/2
|
||||||
|
self.sprite.y=self.y+self.height-self.sprite.height
|
||||||
|
self.layout.x=self.x
|
||||||
|
self.layout.width=self.width
|
||||||
|
self.layout.y=self.y
|
||||||
|
self.layout.height=self.height-self.sprite.height
|
||||||
|
self.layout.content_valign='top'
|
||||||
|
elif self.align=="in":
|
||||||
|
self.sprite.x=self.x+(self.width-self.sprite.width)/2
|
||||||
|
self.sprite.y=self.y+(self.height-self.sprite.height)/2
|
||||||
|
self.layout.x=self.x
|
||||||
|
self.layout.y=self.y
|
||||||
|
self.layout.width=self.width
|
||||||
|
self.layout.height=self.height
|
||||||
|
self.layout.content_valign='center'
|
||||||
|
else:
|
||||||
|
self.sprite.x=self.x+(self.width-self.sprite.width)/2
|
||||||
|
self.sprite.y=self.y
|
||||||
|
self.layout.x=self.x
|
||||||
|
self.layout.width=self.width
|
||||||
|
self.layout.y=self.y+self.sprite.height
|
||||||
|
self.layout.height=self.height-self.sprite.height
|
||||||
|
self.layout.content_valign='bottom'
|
||||||
|
if len(self.layout.document.text)>0:
|
||||||
|
if type(self.selected) is not list:
|
||||||
|
if self.active:
|
||||||
|
piccolor=(90, 90, 90,255)
|
||||||
|
else:
|
||||||
|
piccolor=(180, 180, 180,255)
|
||||||
|
else:
|
||||||
|
piccolor=(self.selected[0], self.selected[1], self.selected[2], 255)
|
||||||
|
self.layout.document.set_style(0, len(self.layout.document.text),
|
||||||
|
dict(font_name=self.font, font_size=self.size, color=piccolor, align=picalign,
|
||||||
|
background_color=(200, 200, 200, 0)))
|
||||||
|
self.layout.end_update()
|
||||||
|
if type(self.selected) is tuple:
|
||||||
|
color = (self.selected[0], self.selected[1], self.selected[2], 255)
|
||||||
|
self.vertex_list2 = self.window.batch.add(4, pyglet.gl.GL_LINE_LOOP, self.window.p2,
|
||||||
|
('v2i', (
|
||||||
|
self.x, self.y, self.x + self.width, self.y, self.x + self.width,
|
||||||
|
self.y + self.height, self.x, self.y + self.height)),
|
||||||
|
('c4B', color * 4))
|
||||||
|
elif type(self.selected) is list and self.isactive():
|
||||||
|
self.sprite.color = (self.selected[0], self.selected[1], self.selected[2])
|
||||||
|
if self.hilite and int(time.time()) % 2 == 0:
|
||||||
|
color = (255, 0, 0, 128)
|
||||||
|
self.vertex_list3 = self.window.batch.add(4, pyglet.gl.GL_QUADS, self.window.p2,
|
||||||
|
('v2i', (
|
||||||
|
self.x, self.y, self.x + self.width, self.y, self.x + self.width,
|
||||||
|
self.y + self.height, self.x, self.y + self.height)),
|
||||||
|
('c4B', color * 4))
|
||||||
|
|
||||||
|
def __init__(self, window, x, y, width, height, name, active=True, hilite=False, visible=True, selected=False, content=None, hint="", typeof="icon",
|
||||||
|
text="", align="left", font="Deja vu sans", size=16, scale=False):
|
||||||
|
self.name = name
|
||||||
|
self.time = 0
|
||||||
|
self.index = 0
|
||||||
|
self.enter = 0
|
||||||
|
self.window = window
|
||||||
|
self.evalx = x
|
||||||
|
self.evaly = y
|
||||||
|
self.x = x
|
||||||
|
self.y = y
|
||||||
|
self.scale=scale
|
||||||
|
self.align=align
|
||||||
|
self.font=font
|
||||||
|
self.size=size
|
||||||
|
self.width = width
|
||||||
|
self.height = height
|
||||||
|
self.active = active
|
||||||
|
self.hilite = hilite
|
||||||
|
self.visible = visible
|
||||||
|
self.content = content
|
||||||
|
self.typeof = typeof
|
||||||
|
self.hint = hint
|
||||||
|
self.text = text
|
||||||
|
self.selected = selected
|
||||||
|
self.window.push_handlers(self.on_mouse_press)
|
||||||
|
self.window.push_handlers(self.on_mouse_motion)
|
||||||
|
self.window.push_handlers(self.on_mouse_drag)
|
||||||
|
self.window.push_handlers(self.on_mouse_release)
|
||||||
|
self.window.push_handlers(self.on_mouse_scroll)
|
||||||
|
self.updateclock = clock.schedule_interval(self.update, 1)
|
||||||
|
if self.typeof=='multicon' or self.typeof=='icon':
|
||||||
|
self.sprite = pyglet.sprite.Sprite(pyglet.image.Texture.create(1,1),x=-300,y=-300, batch=self.window.batch, group=self.window.p1)
|
||||||
|
if self.text!='' or self.typeof=="text":
|
||||||
|
self.layout = pyglet.text.layout.IncrementalTextLayout(pyglet.text.document.FormattedDocument(text), 10, 10, multiline=True, batch=self.window.batch, group=self.window.p2)
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def delete(self):
|
||||||
|
try:
|
||||||
|
self.vertex_list.delete()
|
||||||
|
except:
|
||||||
|
foo = 0
|
||||||
|
try:
|
||||||
|
self.vertex_list2.delete()
|
||||||
|
except:
|
||||||
|
foo = 0
|
||||||
|
try:
|
||||||
|
self.vertex_list3.delete()
|
||||||
|
except:
|
||||||
|
foo = 0
|
||||||
|
try:
|
||||||
|
self.sprite.delete()
|
||||||
|
except:
|
||||||
|
foo = 0
|
||||||
|
|
||||||
|
def launch(self, state):
|
||||||
|
name = self.name.split('_')
|
||||||
|
if len(name) > 1 and hasattr(self.window, "on_mouse_" + state['event'] + "_" + name[0]) and callable(
|
||||||
|
eval("self.window.on_mouse_" + state['event'] + "_" + name[0])):
|
||||||
|
eval("self.window.on_mouse_" + state['event'] + "_" + name[0] + "(" + str(name[1]) + "," + str(state) + ")")
|
||||||
|
#print state,self.name
|
||||||
|
if hasattr(self.window, "on_mouse_" + state['event'] + "_" + self.name) and callable(
|
||||||
|
eval("self.window.on_mouse_" + state['event'] + "_" + self.name)):
|
||||||
|
if self.typeof == 'multicon':
|
||||||
|
self.index += 1
|
||||||
|
if self.index >= len(self.content):
|
||||||
|
self.index = 0
|
||||||
|
self.update(0)
|
||||||
|
eval("self.window.on_mouse_" + state['event'] + "_" + self.name + "(" + str(state) + ")")
|
||||||
|
#print state,self.name
|
||||||
|
|
||||||
|
def on_mouse_press(self, x, y, button, modifiers):
|
||||||
|
if x > self.x and y > self.y and x < self.x + self.width and y < self.y + self.height and self.isactive() and self.isvisible():
|
||||||
|
if time.time() - self.time < 0.30:
|
||||||
|
state = {'x': x, 'y': y, 'dx': 0, 'dy': 0, 'buttons': button, 'modifiers': modifiers, 'event': 'double'}
|
||||||
|
self.launch(state)
|
||||||
|
self.time = time.time()
|
||||||
|
state = {'x': x, 'y': y, 'dx': 0, 'dy': 0, 'buttons': button, 'modifiers': modifiers, 'event': 'press'}
|
||||||
|
self.launch(state)
|
||||||
|
|
||||||
|
def on_mouse_release(self, x, y, button, modifiers):
|
||||||
|
if x > self.x and y > self.y and x < self.x + self.width and y < self.y + self.height and self.isactive() and self.isvisible():
|
||||||
|
state = {'x': x, 'y': y, 'dx': 0, 'dy': 0, 'buttons': button, 'modifiers': modifiers, 'event': 'release'}
|
||||||
|
self.launch(state)
|
||||||
|
|
||||||
|
def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
|
||||||
|
if x > self.x and y > self.y and x < self.x + self.width and y < self.y + self.height and self.isactive() and self.isvisible():
|
||||||
|
state = {'x': x, 'y': y, 'dx': dx, 'dy': dy, 'buttons': buttons, 'modifiers': modifiers, 'event': 'drag'}
|
||||||
|
self.launch(state)
|
||||||
|
|
||||||
|
def on_mouse_scroll(self, x, y, scroll_x, scroll_y):
|
||||||
|
if x > self.x and y > self.y and x < self.x + self.width and y < self.y + self.height and self.isactive() and self.isvisible():
|
||||||
|
state = {'x': x, 'y': y, 'dx': scroll_x, 'dy': scroll_y, 'buttons': 0, 'modifiers': 0, 'event': 'scroll'}
|
||||||
|
self.launch(state)
|
||||||
|
|
||||||
|
def on_mouse_motion(self, x, y, dx, dy):
|
||||||
|
if x > self.x and y > self.y and x < self.x + self.width and y < self.y + self.height:
|
||||||
|
if self.isvisible() and self.isactive():
|
||||||
|
if self.enter == 0:
|
||||||
|
self.enter = 1
|
||||||
|
state = {'x': x, 'y': y, 'dx': dx, 'dy': dy, 'buttons': 0, 'modifiers': 0, 'event': 'enter'}
|
||||||
|
self.launch(state)
|
||||||
|
state = {'x': x, 'y': y, 'dx': dx, 'dy': dy, 'buttons': 0, 'modifiers': 0, 'event': 'motion'}
|
||||||
|
self.launch(state)
|
||||||
|
else:
|
||||||
|
if self.enter == 1:
|
||||||
|
self.enter = 0
|
||||||
|
state = {'x': x, 'y': y, 'dx': dx, 'dy': dy, 'buttons': 0, 'modifiers': 0, 'event': 'leave'}
|
||||||
|
self.launch(state)
|
||||||
|
|
||||||
|
def setselected(self, select):
|
||||||
|
self.selected = select
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def isvisible(self):
|
||||||
|
if type(self.visible) is bool:
|
||||||
|
return self.visible
|
||||||
|
else:
|
||||||
|
return eval(self.visible)
|
||||||
|
|
||||||
|
def isactive(self):
|
||||||
|
if type(self.active) is bool:
|
||||||
|
return self.active
|
||||||
|
else:
|
||||||
|
return eval(self.active)
|
||||||
|
|
||||||
|
def ishilite(self):
|
||||||
|
if type(self.hilite) is bool:
|
||||||
|
return self.hilite
|
||||||
|
else:
|
||||||
|
return eval(self.hilite)
|
||||||
|
|
||||||
|
def hide(self):
|
||||||
|
if type(self.visible) is bool:
|
||||||
|
self.visible = False
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def show(self):
|
||||||
|
if type(self.visible) is bool:
|
||||||
|
self.visible = True
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def activate(self):
|
||||||
|
if type(self.active) is bool:
|
||||||
|
self.active = True
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def unactivate(self):
|
||||||
|
if type(self.active) is bool:
|
||||||
|
self.active = False
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def hilitate(self):
|
||||||
|
if type(self.hilite) is bool:
|
||||||
|
self.hilite = True
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def unhilitate(self):
|
||||||
|
if type(self.hilite) is bool:
|
||||||
|
self.hilite = False
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
# Classe interface
|
||||||
|
class ainter(abutton):
|
||||||
|
def __init__(self, window, x, y, icon, comment="", text="", cmd="", font="Deja vu"):
|
||||||
|
if window.width>1800:
|
||||||
|
super(ainter,self).__init__(window, x, y, 0, 0, "item_"+str(window.count), content=icon, hint=comment, typeof="icon", text=text, align="bottom", size=16, font=font, scale=False)
|
||||||
|
elif window.width>1600:
|
||||||
|
super(ainter,self).__init__(window, x, y, 96, 0, "item_"+str(window.count), content=icon, hint=comment, typeof="icon", text=text, align="bottom", size=14, font=font, scale=True)
|
||||||
|
elif window.width>1280:
|
||||||
|
super(ainter,self).__init__(window, x, y, 64, 0, "item_"+str(window.count), content=icon, hint=comment, typeof="icon", text=text, align="bottom", size=12, font=font, scale=True)
|
||||||
|
else:
|
||||||
|
super(ainter,self).__init__(window, x, y, 48, 0, "item_"+str(window.count), content=icon, hint=comment, typeof="icon", text=text, align="bottom", size=10, font=font, scale=True)
|
||||||
|
self.cmd=cmd
|
||||||
|
window.count+=1
|
20
TODO.md
|
@ -37,15 +37,10 @@ achats et récapituler la situation.
|
||||||
en évidence avec un icone biohazard. Il est impossible d'enregistrer et
|
en évidence avec un icone biohazard. Il est impossible d'enregistrer et
|
||||||
le temps est limité.
|
le temps est limité.
|
||||||
|
|
||||||
#### STRUCTURE/PROGRAMMATION
|
#### DEVELOPPEMENT
|
||||||
|
|
||||||
* Modifier la méthode d'accès aux variables "dat" & "art".
|
* Finir la version avec_class qui comporte les batchs, des classes, et
|
||||||
* Optimiser le code pour rendre l'usage d'OpenGL plus efficient en
|
la gestion objet. Modifier le tutoriel en l'orientant objet.
|
||||||
utilisant les vertex list et les batch graphic.
|
|
||||||
* Repenser le mode simulation de façon orienté objet.
|
|
||||||
* Ajouter un makefile pour automatiser la construction du programme.
|
|
||||||
* Creer un gestionnaire de zones sensibles pour gérer le menu de
|
|
||||||
selection des labos et les bulles d'aide.
|
|
||||||
|
|
||||||
#### STATISTIQUES
|
#### STATISTIQUES
|
||||||
|
|
||||||
|
@ -60,15 +55,10 @@ selection des labos et les bulles d'aide.
|
||||||
#### CONCEPTION
|
#### CONCEPTION
|
||||||
|
|
||||||
* Finir la conception du labo N°2.
|
* Finir la conception du labo N°2.
|
||||||
* Créer le tutoriel pour chaque niveau du monde hydrogène.
|
|
||||||
|
|
||||||
#### FONCTIONNALITES
|
#### FONCTIONNALITES
|
||||||
|
|
||||||
* Ajouter un mode création de niveau qui faciliterait l'ajout
|
|
||||||
et la configuration.
|
|
||||||
* Finir la fenêtre des préférences du jeu.
|
* Finir la fenêtre des préférences du jeu.
|
||||||
* Changer la forme du curseur lors de certaines actions.
|
|
||||||
* Utiliser la molette de la souris dans le jeu.
|
|
||||||
* Mettre en évidence les raccourcis clavier dans les bulles d'aide.
|
* Mettre en évidence les raccourcis clavier dans les bulles d'aide.
|
||||||
|
|
||||||
#### BOGUES
|
#### BOGUES
|
||||||
|
@ -87,7 +77,3 @@ selection des labos et les bulles d'aide.
|
||||||
* Ajouter des bruitages de jeu pour rendre les simulations plus immers-
|
* Ajouter des bruitages de jeu pour rendre les simulations plus immers-
|
||||||
ives.
|
ives.
|
||||||
|
|
||||||
#### DOCUMENTATION/COMMUNICATION
|
|
||||||
|
|
||||||
* Améliorer les textes des documentations.
|
|
||||||
|
|
||||||
|
|
2653
WireChem.py
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 1.4 KiB |
337
dbsrc
|
@ -77,7 +77,7 @@ del
|
||||||
select 0,5,2
|
select 0,5,2
|
||||||
select 0,6,3
|
select 0,6,3
|
||||||
select 0,7,1
|
select 0,7,1
|
||||||
msg Bienvenu(e) dans le tutoriel du premier niveau de WireChem; nous allons vous expliquer pas à pas le fonctionnement du jeu. <Cliquez ou appuyez sur une touche pour continuer>
|
msg Bienvenu(e) dans le tutoriel du premier niveau de WireChem; nous allons vous expliquer pas à pas le fonctionnement du jeu. <cliquez ou appuyez sur une touche pour continuer>
|
||||||
wait
|
wait
|
||||||
msg L'interface du jeu est séparée en 3 grandes zones distinctes; chaque zone verra ses particularités évoluer au fur et à mesure de l'avancée du jeu.
|
msg L'interface du jeu est séparée en 3 grandes zones distinctes; chaque zone verra ses particularités évoluer au fur et à mesure de l'avancée du jeu.
|
||||||
wait 5
|
wait 5
|
||||||
|
@ -119,7 +119,7 @@ wait 4
|
||||||
unset 0,14
|
unset 0,14
|
||||||
del
|
del
|
||||||
center
|
center
|
||||||
msg Passons maintenant à l'objectif du niveau : obtenir un électron neutre sur le senseur. <Cliquez ou appuyez sur une touche pour continuer>
|
msg Passons maintenant à l'objectif du niveau : obtenir un électron neutre sur le senseur. <cliquez ou appuyez sur une touche pour continuer>
|
||||||
wait
|
wait
|
||||||
arrow 144,260,145,370
|
arrow 144,260,145,370
|
||||||
msg Un électron neutre est représenté en gris et possède une tête plus foncée précédant une queue plus claire.
|
msg Un électron neutre est représenté en gris et possède une tête plus foncée précédant une queue plus claire.
|
||||||
|
@ -143,7 +143,7 @@ next
|
||||||
wait 2
|
wait 2
|
||||||
arrow 635,145,30,50
|
arrow 635,145,30,50
|
||||||
set 0,1
|
set 0,1
|
||||||
msg "Le bouton play permet de passer en mode simulation. Alors la limite de la zone de jeu devient rouge et l'interface s'anime. Passons à la pratique !! <Cliquez sur le bouton play>
|
msg "Le bouton play permet de passer en mode simulation. Alors la limite de la zone de jeu devient rouge et l'interface s'anime. Passons à la pratique !! <cliquez sur le bouton play>
|
||||||
'''},
|
'''},
|
||||||
|
|
||||||
{'nom': 'Trajectoires',
|
{'nom': 'Trajectoires',
|
||||||
|
@ -204,7 +204,7 @@ msg "Le bouton play permet de passer en mode simulation. Alors la limite de la z
|
||||||
|
|
||||||
'tuto':'''
|
'tuto':'''
|
||||||
del
|
del
|
||||||
msg Nous allons voir comment se déplace un électron; ici neutre; mais les règles de déplacements seront valables pour tous les types d'électrons. <Cliquez ou appuyez sur une touche pour continuer>
|
msg Nous allons voir comment se déplace un électron; ici neutre; mais les règles de déplacements seront valables pour tous les types d'électrons. <cliquez ou appuyez sur une touche pour continuer>
|
||||||
wait
|
wait
|
||||||
msg Les positionnements de la tête et de la queue de l'électron indiquent son sens; ici de la gauche vers la droite. L'électron se trouve face à deux pistes allant en diagonale par rapport à son emplacement initial. Que fera-t-il?
|
msg Les positionnements de la tête et de la queue de l'électron indiquent son sens; ici de la gauche vers la droite. L'électron se trouve face à deux pistes allant en diagonale par rapport à son emplacement initial. Que fera-t-il?
|
||||||
arrow 30,510,110,510
|
arrow 30,510,110,510
|
||||||
|
@ -385,17 +385,7 @@ msg Vous progressez dans l'apprentissage des bases de Wirechem; vous êtes maint
|
||||||
|
|
||||||
'tuto':'''
|
'tuto':'''
|
||||||
del
|
del
|
||||||
arrow 54,255,55,340
|
|
||||||
msg Ce niveau vous fait découvrir d'autres éléments de jeu : tout d'abord un canon à électrons; représenté ici par un carré violet. Il délivrera un électron tous les 40 cycles.
|
|
||||||
wait 8
|
|
||||||
arrow 514,255,515,340
|
|
||||||
msg Ce + rouge est un positiveur. Lorsqu'un électron passera dessus; il deviendra positif et prendra alors la couleur rouge.
|
|
||||||
wait 8
|
|
||||||
arrow 969,255,970,340
|
|
||||||
msg Vous connaissez déjà le senseur gris acceptant les électrons neutres; voici le senseur rouge pour les électrons positifs.
|
|
||||||
wait 8
|
|
||||||
rect 830,765,870,720
|
|
||||||
msg A vous maintenant d'atteindre les conditions de victoire !!
|
|
||||||
'''},
|
'''},
|
||||||
|
|
||||||
{'nom': 'Super-électrons',
|
{'nom': 'Super-électrons',
|
||||||
|
@ -442,50 +432,7 @@ msg A vous maintenant d'atteindre les conditions de victoire !!
|
||||||
[0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0],
|
||||||
[0, 0, 1, 0, 0],
|
[0, 0, 1, 0, 0],
|
||||||
[0, 0, 0, 0, 0]],
|
[0, 0, 0, 0, 0]]},
|
||||||
|
|
||||||
'tuto':'''
|
|
||||||
del
|
|
||||||
arrow 635,145,165,50
|
|
||||||
set 0,4
|
|
||||||
msg De nouveaux icônes font leur apparition : à partir de ce niveau; vous pourrez enregistrer votre modèle de simulation en cliquant sur la disquette.
|
|
||||||
wait 10
|
|
||||||
unset 0,4
|
|
||||||
arrow 635,145,120,50
|
|
||||||
set 0,3
|
|
||||||
msg Les modèles enregistrés seront stockés dans le dossier de sauvegarde. <Cliquez dessus pour dérouler le menu de sauvegarde>
|
|
||||||
wait menu,0,3
|
|
||||||
unset 0,3
|
|
||||||
rect 2,40,1022,90
|
|
||||||
wait 2
|
|
||||||
arrow 635,145,30,90
|
|
||||||
msg Le signe dièse représente la version originale du niveau; vos sauvegardes seront ensuite classées à côté en suivant l'alphabet grec. <Essayer pour tester en cliquant sur la disquette>
|
|
||||||
wait menu,0,4
|
|
||||||
del
|
|
||||||
msg La lettre alpha constituera toujours la sauvegarde la plus récente. <Cliquez à nouveau sur le dossier de sauvegarde pour refermer ce menu>
|
|
||||||
wait menu,0,3
|
|
||||||
set 0,23
|
|
||||||
msg L'icône représentant un microscope vous indiquera le degré technologique du niveau. Plus vous progresserez dans Wirechem; plus ce degré augmentera ce qui vous octroiera de nouveaux éléments de jeu.
|
|
||||||
wait 12
|
|
||||||
unset 0,23
|
|
||||||
set 0,18
|
|
||||||
msg Ici vous trouverez le menu contenant les transmuteurs qui sont les éléments de jeu auxquels vous avez accès en étant au degré technologique 1 !! <Cliquez pour les découvrir>
|
|
||||||
wait menu,0,18
|
|
||||||
unset 0,18
|
|
||||||
rect 2,40,1022,90
|
|
||||||
wait 2
|
|
||||||
msg Vous connaissez déjà le canon à électrons; l'inverseur (+/-) vous permettra de faire varier la charge d'un électron de positive (rouge) en négative (bleu) et vice et versailles.
|
|
||||||
arrow 580,150,579,90
|
|
||||||
wait 4
|
|
||||||
arrow 125,150,124,90
|
|
||||||
wait 8
|
|
||||||
del
|
|
||||||
msg Vous avez tous les éléments en mains pour atteindre l'objectif de ce niveau : obtenir 2 super-électrons négatifs. Qu'est-ce que cette bête là ???
|
|
||||||
wait 8
|
|
||||||
msg Un super-électron est créé lorsque deux électrons positifs ou négatifs vont entrer en collision. Sa queue sera alors rallongée d'un élément et sa tête prendra une couleur plus vive !!
|
|
||||||
wait 12
|
|
||||||
msg Assez d'explications; à vous de travailler un peu !!
|
|
||||||
'''},
|
|
||||||
|
|
||||||
{'nom': 'Activation',
|
{'nom': 'Activation',
|
||||||
'description': "L'objectif est de générer 6 électrons neutres et de découvrir les liaisons de fibres par lesquelles transitent les photons. Certains modifieurs nécessitent désormais l'activation par des photons.",
|
'description': "L'objectif est de générer 6 électrons neutres et de découvrir les liaisons de fibres par lesquelles transitent les photons. Certains modifieurs nécessitent désormais l'activation par des photons.",
|
||||||
|
@ -525,27 +472,7 @@ msg Assez d'explications; à vous de travailler un peu !!
|
||||||
[0, 2, 0, 0, 0],
|
[0, 2, 0, 0, 0],
|
||||||
[0, 2, 0, 0, 0],
|
[0, 2, 0, 0, 0],
|
||||||
[0, 2, 2, 1, 0],
|
[0, 2, 2, 1, 0],
|
||||||
[0, 2, 0, 4096, 0]],
|
[0, 2, 0, 4096, 0]]},
|
||||||
|
|
||||||
'tuto':'''
|
|
||||||
del
|
|
||||||
msg Le jeu étant trop simple à notre goût; les règles vont donc se corser un peu avec le principe d'activation. Voyons ensemble en quoi cela consiste ...
|
|
||||||
wait 8
|
|
||||||
arrow 64,270,65,370
|
|
||||||
msg Chaque transmuteur possèdant des triangles blancs dans ses coins; comme ici le canon à électrons; sera un élément dit activable par un nouvel élément mobile : le photon !!
|
|
||||||
wait 10
|
|
||||||
arrow 250,250,251,350
|
|
||||||
msg Comme l'électron; le photon possède deux unités : une tête de couleur vert foncé et une queue plus claire. Les photons se déplaceront uniquement sur des fibres; pistes de couleur verte que vous voyez sur la zone jeu.
|
|
||||||
wait 12
|
|
||||||
arrow 320,370,321,470
|
|
||||||
msg Le photoniseur vous permettra de créer des photons. Lorsqu'un électron passera sur ce dernier; il se transformera en photon puis ira sur la case de fibre placée au contact du photoniseur.
|
|
||||||
wait 10
|
|
||||||
del
|
|
||||||
msg A noter : un transmuteur inactif est blanc. Suite au passage d'un photon à sa proximité; il sera activé et se colorera mais seulement pendant 10 cycles. Il reprendra sa forme inactive jusqu'au prochain passage de photon.
|
|
||||||
wait 12
|
|
||||||
msg Il faudra donc gérer l'activation de certains transmuteurs pour dorénavant remplir les conditions de victoire; à vous de tester maintenant !!
|
|
||||||
wait 8
|
|
||||||
'''},
|
|
||||||
|
|
||||||
{'nom': 'Fibres',
|
{'nom': 'Fibres',
|
||||||
'description': 'A vous de dessiner votre infrastructure à base de fibres et de pistes mais aussi de modifieur activable afin de faire parvenir des éléctrons positifs et neutres sur les senseurs.',
|
'description': 'A vous de dessiner votre infrastructure à base de fibres et de pistes mais aussi de modifieur activable afin de faire parvenir des éléctrons positifs et neutres sur les senseurs.',
|
||||||
|
@ -601,38 +528,7 @@ wait 8
|
||||||
[0, 0, 1, 2, 1, 2, 1, 0, 0],
|
[0, 0, 1, 2, 1, 2, 1, 0, 0],
|
||||||
[0, 0, 1, 2, 1, 2, 1, 0, 0],
|
[0, 0, 1, 2, 1, 2, 1, 0, 0],
|
||||||
[0, 0, 1, 2, 2, 2, 1, 0, 0],
|
[0, 0, 1, 2, 2, 2, 1, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0]]},
|
||||||
|
|
||||||
'tuto':'''
|
|
||||||
del
|
|
||||||
set 0,16
|
|
||||||
arrow 635,145,615,50
|
|
||||||
msg Vous venez de faire connaissance avec les photons; la fibre et le photoniseur. Vous pouvez maintenant avoir accès à la fibre sur le même principe que les pistes de cuivre; et au photoniseur dans le menu des transmuteurs.
|
|
||||||
wait 12
|
|
||||||
unset 0,16
|
|
||||||
arrow 635,145,345,50
|
|
||||||
set 0,8
|
|
||||||
msg L'icone des statistiques est maintenant disponible. <Cliquez une première fois dessus...>
|
|
||||||
wait menu,0,8
|
|
||||||
msg 3 graphiques apparaissent à droite : vous pouvez suivre en temps réel le nombre de photons; de protons/neutrons et d'électrons qui circulent sur votre modèle.
|
|
||||||
wait 8
|
|
||||||
msg Passez au deuxième volet de statistiques en cliquant à nouveau sur cet icône. <Allez-y...>
|
|
||||||
wait menu,0,8
|
|
||||||
msg Vous pouvez suivre ici la quantité de radiations émises par votre modèle ainsi que l'élévation de la température et sa consommation en énergie.
|
|
||||||
wait 8
|
|
||||||
msg Accédez ensuite au troisième et dernier volet de statistiques. <Cliquez encore une fois...>
|
|
||||||
wait menu,0,8
|
|
||||||
msg Ici vous pouvez visualiser la formation des différents types d'électrons nécessaire pour remplir les conditions de victoire propres à chaque niveau. Vous pouvez également suivre celui des neutrons et des protons.
|
|
||||||
wait 11
|
|
||||||
msg Si vous appuyez à nouveau sur l'icône statistiques; la zone dédiée aux statistiques disparaît et la zone de jeu contenant votre modèle reprend la totalité de l'espace de la fenêtre. <Allez-y...>
|
|
||||||
wait menu,0,8
|
|
||||||
unset 0,8
|
|
||||||
rect 720,2,835,48
|
|
||||||
msg Ce rectangle vous permet de voir en temps réel les proportions des différents éléments mobiles présents sur votre modèle (électrons; photons; protons et neutrons) en suivant le code couleur du jeu.
|
|
||||||
wait 11
|
|
||||||
del
|
|
||||||
msg Vous venez de découvrir les nouveaux éléments de ce niveau; à vous maintenant de jouer !!!
|
|
||||||
'''},
|
|
||||||
|
|
||||||
{'nom': 'Protons',
|
{'nom': 'Protons',
|
||||||
'description': "Générer deux protons sur le senseur en utilisant un réacteur et un super-positron. Le réacteur est un élément qui nécessite l'activation.",
|
'description': "Générer deux protons sur le senseur en utilisant un réacteur et un super-positron. Le réacteur est un élément qui nécessite l'activation.",
|
||||||
|
@ -688,24 +584,7 @@ msg Vous venez de découvrir les nouveaux éléments de ce niveau; à vous maint
|
||||||
[0, 0, 2, 2, 1, 1, 2, 1, 0],
|
[0, 0, 2, 2, 1, 1, 2, 1, 0],
|
||||||
[0, 2, 0, 0, 0, 0, 1, 1, 0],
|
[0, 2, 0, 0, 0, 0, 1, 1, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0]]},
|
||||||
|
|
||||||
'tuto':'''
|
|
||||||
del
|
|
||||||
msg Un modèle vous est proposé mais celui-ci ne fonctionne pas. De plus; les dépenses sont bien trop importantes puisqu'elles ont mis votre porte-monnaie dans le rouge !!
|
|
||||||
wait 10
|
|
||||||
msg A vous de corriger ce modèle afin de remplir les conditions de victoire attendues tout en gardant un oeil sur vos dépenses.
|
|
||||||
wait 8
|
|
||||||
arrow 925,400,926,470
|
|
||||||
msg Vous devez créer deux protons : pour cela il faut que deux super-électrons négatifs passent dans le réacteur activé. Un proton n'a pas besoin de piste pour se déplacer; il tombe en suivant les règles de la gravité.
|
|
||||||
wait 12
|
|
||||||
arrow 925,350,926,290
|
|
||||||
msg Le protoniseur va accepter le proton et le décompter dans les conditions de victoire. Attention : rien de doit obstruer le chemin d'un proton; ce sera aussi valable pour un neutron !!!
|
|
||||||
wait 12
|
|
||||||
del
|
|
||||||
msg Passons maintenant au jeu; il faudra commencer par avoir de l'argent ce qui veut dire effacer quelques cases; mais lesquelles ?? Bonne chance...
|
|
||||||
wait 8
|
|
||||||
'''},
|
|
||||||
|
|
||||||
{'nom': 'Hydrogène',
|
{'nom': 'Hydrogène',
|
||||||
'description': "Générer le premier atome complet : l'hydrogène avec un proton et un électron négatif sur la couche K.",
|
'description': "Générer le premier atome complet : l'hydrogène avec un proton et un électron négatif sur la couche K.",
|
||||||
|
@ -762,21 +641,7 @@ wait 8
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0]]}],
|
||||||
|
|
||||||
'tuto':'''
|
|
||||||
del
|
|
||||||
msg _____ Ce nouvel élément "1" est une porte et ne sera disponible que dans des niveaux plus avancés de Wirechem. Cette porte ne laissera passer qu'un seul électron puis se fermera en affichant le nombre "0".
|
|
||||||
wait 12
|
|
||||||
set 0,12
|
|
||||||
msg Enfin un dernier icône; l'icône activant le tutoriel et/ou l'aide : vous avez donc la possibilité de me faire disparaître en cliquant dessus; ainsi que les bulles d'aide en cliquant une seconde fois sur l'icône. <Essayez !!>
|
|
||||||
wait menu,0,12
|
|
||||||
wait menu,0,12
|
|
||||||
unset 0,12
|
|
||||||
msg Voilà; vous arrivez à l'ultime niveau du monde de l'Hydrogène; je pense vous avoir donné toutes les informations nécessaires pour jouer. A vous de découvrir les niveaux et mondes suivants !!
|
|
||||||
wait 12
|
|
||||||
'''}],
|
|
||||||
|
|
||||||
|
|
||||||
[{'nom': 'Deutérium',
|
[{'nom': 'Deutérium',
|
||||||
'description': "Générer le Deutérium, un isostope de l'hydrogène, celui-ci comporte un neutron en plus du proton et de l'électron négatif sur la couche K.",
|
'description': "Générer le Deutérium, un isostope de l'hydrogène, celui-ci comporte un neutron en plus du proton et de l'électron négatif sur la couche K.",
|
||||||
|
@ -1070,15 +935,15 @@ wait 12
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]},
|
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]},
|
||||||
|
|
||||||
{'nom': 'Lithium-7',
|
{'nom': 'Lithium',
|
||||||
'description': "Le Lithium est le métal le plus léger et possède la plus grande chaleur massique d'où sa présence dans les piles et batteries. Un des deux isotopes le plus stable est le Lithium-7 avec quatre neutrons, trois protons et trois électrons : deux sur la couche K et un sur la couche L !!",
|
'description': "Générer un isostope de l'hydrogène qui comporte un proton et un neutron ainsi qu'un électron négatif sur la couche K.",
|
||||||
'element': 'Li',
|
'element': 'Li',
|
||||||
'current': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
'current': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
'victory': [0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0, 4, 3],
|
'victory': [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1],
|
||||||
'cout': 1700,
|
'cout': 1200,
|
||||||
'tech': 6,
|
'tech': 4,
|
||||||
'cycle': 0,
|
'cycle': 0,
|
||||||
'maxcycle': 1400,
|
'maxcycle': 99999,
|
||||||
'nrj': 0,
|
'nrj': 0,
|
||||||
'maxnrj': 99999,
|
'maxnrj': 99999,
|
||||||
'rayon': 0,
|
'rayon': 0,
|
||||||
|
@ -1089,56 +954,52 @@ wait 12
|
||||||
'_yy': 320,
|
'_yy': 320,
|
||||||
'link': [(1, 6)],
|
'link': [(1, 6)],
|
||||||
'video': False,
|
'video': False,
|
||||||
'world_art': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
'world_art': [[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 196619, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 196619, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 196620, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
'world_new': [[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
'world_new': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 1, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 1, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 1, 1, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0]]},
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]},
|
|
||||||
|
|
||||||
{'nom': 'Carbone-12',
|
{'nom': 'Carbone',
|
||||||
'description': "Le carbone-12 est l'isotope le plus abondant sur Terre. Le carbone est à la base d'une multitude de composés organiques; de minéraux et de gaz. Pour le former; il faut associer 6 neutrons, six protons et 6 électrons : 2 sur la couche K et 4 sur la couche L.",
|
'description': "Générer un isostope de l'hydrogène qui comporte un proton et un neutron ainsi qu'un électron négatif sur la couche K.",
|
||||||
'element': 'C',
|
'element': 'C',
|
||||||
'current': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
'current': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
'victory': [0, 0, 0, 0, 0, 0, 0, 2, 4, 0, 0, 6, 6],
|
'victory': [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1],
|
||||||
'cout': 2200,
|
'cout': 1200,
|
||||||
'tech': 6,
|
'tech': 4,
|
||||||
'cycle': 0,
|
'cycle': 0,
|
||||||
'maxcycle': 1500,
|
'maxcycle': 99999,
|
||||||
'nrj': 0,
|
'nrj': 0,
|
||||||
'maxnrj': 99999,
|
'maxnrj': 99999,
|
||||||
'rayon': 0,
|
'rayon': 0,
|
||||||
|
@ -1149,54 +1010,50 @@ wait 12
|
||||||
'_yy': 320,
|
'_yy': 320,
|
||||||
'link': [(1, 7)],
|
'link': [(1, 7)],
|
||||||
'video': False,
|
'video': False,
|
||||||
'world_art': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
'world_art': [[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 196619, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 196620, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 196620, 0, 0, 196620, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
'world_new': [[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
'world_new': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 1, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 1, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 1, 1, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0]]},
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]},
|
|
||||||
|
|
||||||
{'nom': 'Oxygène',
|
{'nom': 'Oxygène',
|
||||||
'description': "Générer un isostope de l'hydrogène qui comporte un proton et un neutron ainsi qu'un électron négatif sur la couche K.",
|
'description': "Générer un isostope de l'hydrogène qui comporte un proton et un neutron ainsi qu'un électron négatif sur la couche K.",
|
||||||
'element': 'O',
|
'element': 'O',
|
||||||
'current': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
'current': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
'victory': [0, 0, 0, 0, 0, 0, 0, 2, 6, 0, 0, 8, 8],
|
'victory': [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1],
|
||||||
'cout': 1200,
|
'cout': 1200,
|
||||||
'tech': 6,
|
'tech': 4,
|
||||||
'cycle': 0,
|
'cycle': 0,
|
||||||
'maxcycle': 99999,
|
'maxcycle': 99999,
|
||||||
'nrj': 0,
|
'nrj': 0,
|
||||||
|
@ -1301,7 +1158,7 @@ wait 12
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
[0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
[0, 0, 0, 0, 0, 0, 0, 0, 0]]}]]
|
[0, 0, 0, 0, 0, 0, 0, 0, 0]]}],[],[],[]]
|
||||||
art={
|
art={
|
||||||
196608: {'nrj': 0, 'cout': 0, 'temp': 0, 'nom': 'null', 'color': [0, 0, 0], 'text': '', 'value': 196608, 'cat': 0, 'tech': 0, 'activable': False},
|
196608: {'nrj': 0, 'cout': 0, 'temp': 0, 'nom': 'null', 'color': [0, 0, 0], 'text': '', 'value': 196608, 'cat': 0, 'tech': 0, 'activable': False},
|
||||||
196609: {'nrj': 0, 'cout': 60, 'temp': 0.05, 'nom': 'positiver', 'color': [255, 0, 0], 'text': '+', 'value': 196609, 'cat': 1, 'tech': 2, 'activable': True},
|
196609: {'nrj': 0, 'cout': 60, 'temp': 0.05, 'nom': 'positiver', 'color': [255, 0, 0], 'text': '+', 'value': 196609, 'cat': 1, 'tech': 2, 'activable': True},
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<b>Version de Wirechem: V0.2a</b>
|
||||||
|
|
||||||
|
Version de développement alpha.
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/bash
|
||||||
|
export DISPLAY=":0"
|
||||||
|
su -c "startx" wirechem &
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
launch=`ps ax|grep init.py|grep python`
|
||||||
|
if [ "$launch" == "" ]; then
|
||||||
|
su -c "python /srv/init.py" wirechem
|
||||||
|
fi
|
||||||
|
done
|
|
@ -0,0 +1,345 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
'''
|
||||||
|
------------------------------------------
|
||||||
|
|
||||||
|
Microlinux
|
||||||
|
|
||||||
|
Programme principal
|
||||||
|
|
||||||
|
(C) Copyright 2013-2014 Nicolas Hordé
|
||||||
|
|
||||||
|
------------------------------------------
|
||||||
|
'''
|
||||||
|
import subprocess
|
||||||
|
import datetime
|
||||||
|
import math
|
||||||
|
import copy
|
||||||
|
import random
|
||||||
|
import time
|
||||||
|
import operator
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import socket
|
||||||
|
import httplib
|
||||||
|
import urllib
|
||||||
|
|
||||||
|
import pyglet
|
||||||
|
from GLclass import *
|
||||||
|
from pyglet.gl import *
|
||||||
|
from pyglet.window import mouse
|
||||||
|
from pyglet.window import key
|
||||||
|
from pyglet import clock
|
||||||
|
from pyglet import image
|
||||||
|
from git import Git
|
||||||
|
|
||||||
|
''' *********************************************************************************************** '''
|
||||||
|
''' initialisation '''
|
||||||
|
|
||||||
|
global debug,user,hostname
|
||||||
|
hostname=socket.getfqdn()
|
||||||
|
user=""
|
||||||
|
debug = 1
|
||||||
|
animate = 0
|
||||||
|
|
||||||
|
''' *********************************************************************************************** '''
|
||||||
|
''' Gestion du menu principal '''
|
||||||
|
|
||||||
|
#Classe du menu principal
|
||||||
|
class menu(pyglet.window.Window):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
global debug, worlds, world
|
||||||
|
super(menu, self).__init__(resizable=True, fullscreen=True, visible=True,
|
||||||
|
caption="Microlinux - Lancement")
|
||||||
|
|
||||||
|
self.set_mouse_cursor(cursors['cross'])
|
||||||
|
self.batch = pyglet.graphics.Batch()
|
||||||
|
self.p0 = pyglet.graphics.OrderedGroup(0)
|
||||||
|
self.p1 = pyglet.graphics.OrderedGroup(1)
|
||||||
|
self.p2 = pyglet.graphics.OrderedGroup(2)
|
||||||
|
self.p3 = pyglet.graphics.OrderedGroup(3)
|
||||||
|
self.p4 = pyglet.graphics.OrderedGroup(4)
|
||||||
|
self.clocks = [clock.schedule(self.draw)]
|
||||||
|
self.count=0
|
||||||
|
self.focus = None
|
||||||
|
self.icons = [ainter(self, 20, self.height-185, pyglet.resource.image('picture/restart.png'), 'Redemarre la machine instantanement.', 'Redemarrer', 'sudo reboot',font="Mechanihan")]
|
||||||
|
self.icons.extend([ainter(self, 20+self.icons[0].width*1.4, self.height-185, pyglet.resource.image('picture/eteindre.png'), "Eteindre votre ordinateur.", 'Eteindre', 'sudo halt',font="Mechanihan"),
|
||||||
|
ainter(self, 20+2*self.icons[0].width*1.4, self.height-185, pyglet.resource.image('picture/terminal.png'), "Lancement d'un terminal.", 'Terminal', 'xterm',font="Mechanihan"),
|
||||||
|
ainter(self, self.width-20-self.icons[0].width*1.4, 60+self.icons[0].width*0.6, pyglet.resource.image('picture/web.png'), 'Site internet de WireChem...', 'Site WWW', 'netsurf http://evolving.fr',font="Mechanihan"),
|
||||||
|
ainter(self, self.width-20-2*self.icons[0].width*1.4, 60+self.icons[0].width*0.6, pyglet.resource.image('picture/bug.png'), 'Soumettre un bogue ou un rapport de bêta testeur.', 'Beta-test', 'netsurf http://evolving.fr/ecrire/special.php?login=pinon&pass=poppop&where=14',font="Mechanihan"),
|
||||||
|
ainter(self, self.width-20-3*self.icons[0].width*1.4, 60+self.icons[0].width*0.6, pyglet.resource.image('picture/compte.png'), 'Votre compte...', 'Mon compte', 'netsurf http://evolving.fr',font="Mechanihan"),
|
||||||
|
ainter(self, 20, 60+self.icons[0].width*0.6, pyglet.resource.image('picture/wirechem.png'), "Lancer le jeu WireChem", 'WireChem', '/srv/launch',font="Mechanihan"),
|
||||||
|
ainter(self, self.width-400-self.icons[0].width*1.4, self.height-185, pyglet.resource.image('picture/musique.png'), "Réglage du son.", 'Son...', 'gnome-alsamixer',font="Mechanihan"),
|
||||||
|
ainter(self, self.width-400-2*self.icons[0].width*1.4, self.height-185, pyglet.resource.image('picture/net.png'), "Réglage du Réseau.", 'Reseau...', '/srv/network',font="Mechanihan"),
|
||||||
|
ainter(self, self.width-400-3*self.icons[0].width*1.4, self.height-185, pyglet.resource.image('picture/ecran.png'), "Configuration des options vidéo.", 'Video...', 'arandr',font="Mechanihan"),
|
||||||
|
ainter(self, 20, self.height/2-40, pyglet.resource.image('picture/info.png'), "Information sur la version du logiciel WireChem.", 'Informations', 'netsurf file:///srv/infos.html',font="Mechanihan")])
|
||||||
|
self.rects=[arect(self,10, 10, self.width-20,125, typeof="both", color=(100,100,100,200), group=self.p3)]
|
||||||
|
self.hostname=alabel(self,10,self.height-15,text=hostname,font='Deja vu',size=12,group=self.p4)
|
||||||
|
self.dialog=[alabel(self,self.width-380,self.height-60,text='identifiant :',font='Deja vu',size=16,group=self.p4,visible=False),
|
||||||
|
alabel(self,self.width-380,self.height-120,text='mot de passe :',font='Deja vu',size=16,group=self.p4,visible=False),
|
||||||
|
atext(self,self.width-215,self.height-65,170,0,text="",font='Deja vu',align="left",size=16,visible=False),
|
||||||
|
atext(self,self.width-215,self.height-125,170,0,text="",font='password',align="left",size=16,visible=False),
|
||||||
|
abutton(self,self.width-190, self.height-195,0,0,"connect",content=pyglet.resource.image('picture/connexion.png'),typeof="icon",visible=False),
|
||||||
|
arect(self,self.width-400,self.height-230,390,220,typeof="face", color=(100,100,100,200), group=self.p3,visible=False),
|
||||||
|
arect(self,self.width-218,self.height-65,175,25,typeof="face", color=(150,150,150,255), group=self.p2,visible=False),
|
||||||
|
arect(self,self.width-218,self.height-125,175,25,typeof="face", color=(150,150,150,255), group=self.p2,visible=False)]
|
||||||
|
self.dialog[4].sprite.group=self.p4
|
||||||
|
self.dialog2=[alabel(self,0,0,text='',font='Deja vu',size=16,group=self.p4,visible=False),
|
||||||
|
abutton(self, 0, 0,0,0,"deconnect",content=pyglet.resource.image('picture/deconnexion.png'),typeof="icon",visible=False),
|
||||||
|
arect(self,0,0,290,90,typeof="face", color=(100,100,100,200), group=self.p2,visible=False)]
|
||||||
|
self.dialog2[1].sprite.group=self.p4
|
||||||
|
self.infos=[atext(self, 10, 10, self.width-10, 125, font="Mechanihan", size=18, align="left")]
|
||||||
|
self.fond = abutton(self, "(self.window.width-800)/2", "(self.window.height-175+125)/2", 0, 0,"fond",content=pyglet.resource.image('picture/logo3.png'),typeof='icon')
|
||||||
|
self.fond.sprite.group=self.p0
|
||||||
|
self.setfocus(self.dialog[2])
|
||||||
|
self.icons[4].visible=False
|
||||||
|
self.icons[5].visible=False
|
||||||
|
self.icons[4].update(0)
|
||||||
|
self.icons[5].update(0)
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
|
||||||
|
self.geticons()
|
||||||
|
|
||||||
|
def geticons(self):
|
||||||
|
global user
|
||||||
|
ui = Git(".")
|
||||||
|
try:
|
||||||
|
version_temp=ui.ls_remote("git://github.com/dahut87/WireChem.git")
|
||||||
|
version=version_temp.replace('\n','\t').split('\t')
|
||||||
|
add=0
|
||||||
|
for i in range(len(version)):
|
||||||
|
if i%2==1 and version[i]!="HEAD" and '^' not in version[i]:
|
||||||
|
add+=1
|
||||||
|
self.icons.append(ainter(self, 20+add*(self.icons[0].width*1.4), 60+self.icons[0].width*0.6, pyglet.resource.image('picture/git.png'), "Lancer le jeu WireChem dans une version particulière de développement.", os.path.basename(version[i]), 'xterm -e /srv/launch '+os.path.basename(version[i]),font="Mechanihan"))
|
||||||
|
self.icons.append(ainter(self, self.width-20-self.icons[0].width*1.4, self.height/2-40, pyglet.resource.image('picture/connect.png'), "Le système est connecté au réseau et opérationnel, double cliquez pour rafraichir !", "Connecte", 'killall python',font="Mechanihan"))
|
||||||
|
except:
|
||||||
|
self.icons.append(ainter(self, self.width-20-self.icons[0].width*1.4, self.height/2-40, pyglet.resource.image('picture/disconnect.png'), "Le système n'est pas convenablement connecté au réseau, double cliquez pour réessayer !", "Deconnecte", 'killall python',font="Mechanihan"))
|
||||||
|
|
||||||
|
def update(self, what):
|
||||||
|
global user
|
||||||
|
if user!="":
|
||||||
|
self.hidemdp()
|
||||||
|
self.showlog()
|
||||||
|
else:
|
||||||
|
self.hidelog()
|
||||||
|
self.showmdp()
|
||||||
|
|
||||||
|
def connectsite(self, user, password):
|
||||||
|
print user,password
|
||||||
|
params = urllib.urlencode({'login': user, 'pass': password})
|
||||||
|
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
|
||||||
|
conn = httplib.HTTPConnection("wirechem.dahut.fr:80")
|
||||||
|
conn.request("POST", "/ecrire/special.php", params, headers)
|
||||||
|
response = conn.getresponse()
|
||||||
|
state=''
|
||||||
|
if response.status==200:
|
||||||
|
state = response.read()
|
||||||
|
conn.close()
|
||||||
|
if state=="1":
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def draw(self, dt):
|
||||||
|
glClear(GL_COLOR_BUFFER_BIT)
|
||||||
|
self.batch.draw()
|
||||||
|
|
||||||
|
def hidemdp(self):
|
||||||
|
for i in range(len(self.dialog)):
|
||||||
|
self.dialog[i].visible=False
|
||||||
|
self.dialog[i].update(0)
|
||||||
|
|
||||||
|
def showmdp(self):
|
||||||
|
for i in range(len(self.dialog)):
|
||||||
|
self.dialog[i].visible=True
|
||||||
|
self.dialog[i].update(0)
|
||||||
|
self.setfocus(self.dialog[2])
|
||||||
|
|
||||||
|
def showlog(self):
|
||||||
|
global user
|
||||||
|
self.dialog2[0].visible=True
|
||||||
|
self.dialog2[0].text=user
|
||||||
|
self.dialog2[0].x=self.width+(self.dialog2[0].content_width-300)/2-self.dialog2[0].content_width
|
||||||
|
self.dialog2[0].y=self.height-35
|
||||||
|
self.dialog2[1].visible=True
|
||||||
|
self.dialog2[1].x=self.width-self.dialog2[1].width-62
|
||||||
|
self.dialog2[1].y=self.height-85
|
||||||
|
self.dialog2[1].update(0)
|
||||||
|
self.dialog2[2].visible=True
|
||||||
|
self.dialog2[2].x=self.width-300
|
||||||
|
self.dialog2[2].y=self.height-100
|
||||||
|
self.dialog2[2].update(0)
|
||||||
|
|
||||||
|
def hidelog(self):
|
||||||
|
for i in range(len(self.dialog2)):
|
||||||
|
self.dialog2[i].visible=False
|
||||||
|
self.dialog2[i].update(0)
|
||||||
|
|
||||||
|
def anime(self,dt):
|
||||||
|
global animate
|
||||||
|
if animate==0:
|
||||||
|
self.infos[0].text="Mot de passe incorrect !! Veuillez retaper votre mot de passe s'il vous plait."
|
||||||
|
self.infos[0].update(0)
|
||||||
|
animate=16*math.pi
|
||||||
|
animate-=math.pi/4
|
||||||
|
if animate>0:
|
||||||
|
clock.schedule_once(self.anime,0.02)
|
||||||
|
else:
|
||||||
|
animate=0
|
||||||
|
self.infos[0].text=" "
|
||||||
|
self.infos[0].update(0)
|
||||||
|
for i in range(len(self.dialog)):
|
||||||
|
self.dialog[i].x+=int(5*math.sin(animate))
|
||||||
|
if hasattr(self.dialog[i],"update"):
|
||||||
|
self.dialog[i].update(0)
|
||||||
|
|
||||||
|
### Evenements ###
|
||||||
|
|
||||||
|
def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers):
|
||||||
|
if self.focus:
|
||||||
|
self.focus.caret.on_mouse_drag(x, y, dx, dy, buttons, modifiers)
|
||||||
|
|
||||||
|
def on_mouse_press(self, x, y, button, modifiers):
|
||||||
|
for widget in [self.dialog[2],self.dialog[3]]:
|
||||||
|
if widget.hit_test(x, y):
|
||||||
|
self.setfocus(widget)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
self.setfocus(None)
|
||||||
|
|
||||||
|
if self.focus:
|
||||||
|
self.focus.caret.on_mouse_press(x, y, button, modifiers)
|
||||||
|
|
||||||
|
def on_mouse_motion(self, x, y, dx, dy):
|
||||||
|
for widget in [self.dialog[2],self.dialog[3]]:
|
||||||
|
if widget.hit_test(x, y):
|
||||||
|
self.set_mouse_cursor(cursors["text"])
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
self.set_mouse_cursor(cursors["cross"])
|
||||||
|
|
||||||
|
def on_text(self, text):
|
||||||
|
if self.focus:
|
||||||
|
self.focus.caret.on_text(text)
|
||||||
|
|
||||||
|
def on_text_motion(self, motion):
|
||||||
|
if self.focus:
|
||||||
|
self.focus.caret.on_text_motion(motion)
|
||||||
|
|
||||||
|
def on_text_motion_select(self, motion):
|
||||||
|
if self.focus:
|
||||||
|
self.focus.caret.on_text_motion_select(motion)
|
||||||
|
|
||||||
|
def on_key_press(self, symbol, modifiers):
|
||||||
|
global user
|
||||||
|
if symbol == pyglet.window.key.TAB:
|
||||||
|
if modifiers & pyglet.window.key.MOD_SHIFT:
|
||||||
|
dir = -1
|
||||||
|
else:
|
||||||
|
dir = 1
|
||||||
|
all=(self.dialog[2],self.dialog[3])
|
||||||
|
if self.focus in all:
|
||||||
|
i = all.index(self.focus)
|
||||||
|
else:
|
||||||
|
i = 0
|
||||||
|
dir = 0
|
||||||
|
self.setfocus(all[(i + dir) % len(all)])
|
||||||
|
elif symbol == key.ESCAPE:
|
||||||
|
if debug==0:
|
||||||
|
return pyglet.event.EVENT_HANDLED
|
||||||
|
else:
|
||||||
|
pyglet.app.exit()
|
||||||
|
elif symbol == key.F5:
|
||||||
|
self.close()
|
||||||
|
launch()
|
||||||
|
elif symbol == key.ENTER:
|
||||||
|
if user=="":
|
||||||
|
self.on_mouse_press_connect([])
|
||||||
|
|
||||||
|
def setfocus(self, focus):
|
||||||
|
if self.focus:
|
||||||
|
self.focus.caret.visible = False
|
||||||
|
self.focus.caret.mark = self.focus.caret.position = 0
|
||||||
|
self.focus = focus
|
||||||
|
if self.focus:
|
||||||
|
self.focus.caret.visible = True
|
||||||
|
self.focus.caret.mark = 0
|
||||||
|
self.focus.caret.position = len(self.focus.document.text)
|
||||||
|
|
||||||
|
### Evenement générer par classe abutton ###
|
||||||
|
|
||||||
|
def on_mouse_press_deconnect(self, state):
|
||||||
|
global user
|
||||||
|
user=""
|
||||||
|
self.icons[len(self.icons)-1].content=pyglet.resource.image('picture/connect2.png')
|
||||||
|
self.icons[len(self.icons)-1].update(0)
|
||||||
|
self.update(0)
|
||||||
|
|
||||||
|
def on_mouse_press_connect(self, state):
|
||||||
|
global user
|
||||||
|
if animate>0:
|
||||||
|
return
|
||||||
|
if self.connectsite(self.dialog[2].layout.document.text,self.dialog[3].layout.document.text):
|
||||||
|
user=self.dialog[2].layout.document.text
|
||||||
|
self.icons[len(self.icons)-1].content=pyglet.resource.image('picture/connect2.png')
|
||||||
|
self.icons[len(self.icons)-1].update(0)
|
||||||
|
self.update(0)
|
||||||
|
else:
|
||||||
|
user=''
|
||||||
|
self.anime(0.02)
|
||||||
|
|
||||||
|
def on_mouse_enter_item(self, n, state):
|
||||||
|
self.infos[0].text=self.icons[n].hint
|
||||||
|
self.infos[0].update(0)
|
||||||
|
self.set_mouse_cursor(cursors['pointer'])
|
||||||
|
self.icons[n].setselected([255, 120, 120])
|
||||||
|
|
||||||
|
def on_mouse_leave_item(self, n, state):
|
||||||
|
self.infos[0].text=" "
|
||||||
|
self.infos[0].update(0)
|
||||||
|
self.set_mouse_cursor(cursors['cross'])
|
||||||
|
self.icons[n].setselected(False)
|
||||||
|
|
||||||
|
def on_mouse_release_item(self, n, state):
|
||||||
|
self.set_mouse_cursor(cursors['cross'])
|
||||||
|
|
||||||
|
def on_mouse_double_item(self, n, state):
|
||||||
|
process = subprocess.Popen(self.icons[n].cmd.split(" "))
|
||||||
|
self.close()
|
||||||
|
process.wait()
|
||||||
|
launch()
|
||||||
|
|
||||||
|
def on_mouse_drag_item(self, n, state):
|
||||||
|
self.set_mouse_cursor(cursors['move'])
|
||||||
|
self.icons[n].x += state['dx']
|
||||||
|
self.icons[n].y += state['dy']
|
||||||
|
if state['dx']<0 and self.icons[n].x<20 : self.icons[n].x=0
|
||||||
|
if state['dx']>0 and self.icons[n].x>self.width-self.icons[n].width-20 : self.icons[n].x=self.width-self.icons[n].width
|
||||||
|
if state['dy']<0 and self.icons[n].y<20-self.icons[n].height : self.icons[n].y=0
|
||||||
|
if state['dy']>0 and self.icons[n].y>self.height-self.icons[n].height-20 : self.icons[n].y=self.height-self.icons[n].height
|
||||||
|
print str(self.icons[n].y)+","+str(self.icons[n].x)
|
||||||
|
self.icons[n].update(0)
|
||||||
|
|
||||||
|
def launch():
|
||||||
|
menu_principal = menu()
|
||||||
|
menu_principal.set_minimum_size(1024, 768)
|
||||||
|
glEnable(GL_BLEND)
|
||||||
|
#glEnable(GL_LINE_SMOOTH)
|
||||||
|
#glHint(GL_LINE_SMOOTH_HINT, GL_FASTEST)
|
||||||
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
|
||||||
|
pyglet.app.run()
|
||||||
|
|
||||||
|
''' *********************************************************************************************** '''
|
||||||
|
''' Lancement du menu principal
|
||||||
|
'''
|
||||||
|
pyglet.resource.add_font('font/Mecanihan.ttf')
|
||||||
|
pyglet.resource.add_font('font/password.ttf')
|
||||||
|
cursors = {'pointer':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/pointer.png'), 15, 46),
|
||||||
|
'text':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/text.png'), 24, 30),
|
||||||
|
'move':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/move.png'), 24, 24),
|
||||||
|
'create':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/create.png'), 12, 17),
|
||||||
|
'cross':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/cross.png'), 24, 33),
|
||||||
|
'delete':pyglet.window.ImageMouseCursor(pyglet.resource.image('cursor/delete.png'), 24, 32)}
|
||||||
|
launch()
|
|
@ -0,0 +1,9 @@
|
||||||
|
#!/bin/bash
|
||||||
|
if [ "$1" == "" ]; then
|
||||||
|
cd /srv/WireChem
|
||||||
|
python WireChem.py
|
||||||
|
else
|
||||||
|
git clone -b $1 git://github.com/dahut87/WireChem.git /srv/_version_$1
|
||||||
|
cd /srv/_version_$1
|
||||||
|
python WireChem.py
|
||||||
|
fi
|
BIN
logo.png
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 20 KiB |
79
menu.py
|
@ -1,79 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
# -*- coding: utf-8 -*-
|
|
||||||
|
|
||||||
'''
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
WireChem - The new chemistry game
|
|
||||||
|
|
||||||
Programme lancement
|
|
||||||
|
|
||||||
(C) Copyright 2013-2014 Nicolas Hordé
|
|
||||||
Licence GPL V3.0
|
|
||||||
|
|
||||||
------------------------------------------
|
|
||||||
'''
|
|
||||||
import os;
|
|
||||||
while True:
|
|
||||||
os.system("clear")
|
|
||||||
print'''-------------------------------------------
|
|
||||||
|
|
||||||
WireChem - The new chemistry game
|
|
||||||
|
|
||||||
Menu principal
|
|
||||||
|
|
||||||
(C) Copyright 2013-2014 Nicolas Hordé
|
|
||||||
Licence GPL V3.0
|
|
||||||
|
|
||||||
------------------------------------------
|
|
||||||
1) Lancer Wirechem depuis le CD/DVD
|
|
||||||
2) Récupérer une version depuis le réseau
|
|
||||||
3) Lancer une autre version
|
|
||||||
4) Eteindre l'ordinateur
|
|
||||||
5) Redemarrer l'ordinateur
|
|
||||||
'''
|
|
||||||
alocal=raw_input('Que souhaitez vous faire ? : ')
|
|
||||||
if alocal=="1":
|
|
||||||
os.system('python WireChem.py')
|
|
||||||
elif alocal=="2":
|
|
||||||
os.system("clear")
|
|
||||||
print "vérifiez que vous êtes bien connecté à internet..."
|
|
||||||
print "Récupération des version depuis https://github.com/dahut87/WireChem.git..."
|
|
||||||
tag=['master']
|
|
||||||
tags=os.popen('git ls-remote --tags https://github.com/dahut87/WireChem.git').read().split('\n')
|
|
||||||
for i in range(len(tags)):
|
|
||||||
if tags[i][41:51]=='refs/tags/': tag.append(tags[i][51:].replace('^{}',''))
|
|
||||||
tag=sorted(list(set(tag)),None,None,True)
|
|
||||||
for i in range(len(tag)):
|
|
||||||
print str(i)+") "+tag[i]
|
|
||||||
alocal=raw_input(str(len(tag))+" versions trouvées, choisissez celle que vous souhaitez récupérer: ")
|
|
||||||
if alocal=="": continue
|
|
||||||
version=tag[int(alocal)]
|
|
||||||
if os.system('git clone -b '+version+' https://github.com/dahut87/WireChem.git _version_'+version)==0:
|
|
||||||
os.system("cd _version_"+version+" && python WireChem.py")
|
|
||||||
else:
|
|
||||||
alocal=raw_input("Une erreur est apparue, le dossier existe déjà ou vous n'êtes plus connecté ! Appuyer sur O pour essayer de lancer.")
|
|
||||||
if alocal.lower()=="o":
|
|
||||||
os.system("cd _version_"+version+" && python WireChem.py")
|
|
||||||
elif alocal=="3":
|
|
||||||
os.system("clear")
|
|
||||||
print "Recherche des version déjà récupérée..."
|
|
||||||
dir=os.listdir(".")
|
|
||||||
num=0
|
|
||||||
vers=[]
|
|
||||||
for i in range(len(dir)):
|
|
||||||
if dir[i][:9]=="_version_":
|
|
||||||
vers.append(dir[i])
|
|
||||||
print str(num)+") "+dir[i][9:]
|
|
||||||
num+=1
|
|
||||||
if num==0:
|
|
||||||
print "aucune version installée...<appuyez sur une touche>"
|
|
||||||
raw_input()
|
|
||||||
else:
|
|
||||||
alocal=raw_input(str(num)+" versions trouvées, choisissez celle que vous souhaitez récupérer: ")
|
|
||||||
if alocal=="": continue
|
|
||||||
os.system("cd "+vers[int(alocal)]+" && python WireChem.py")
|
|
||||||
elif alocal=="4":
|
|
||||||
os.system("halt")
|
|
||||||
elif alocal=="5":
|
|
||||||
os.system("reboot")
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
export XAUTHORITY="/home/wirechem/.Xauthority"
|
||||||
|
export DISPLAY=":0"
|
||||||
|
sudo network-config
|
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 12 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 20 KiB |
After Width: | Height: | Size: 7.8 KiB |
After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 9.7 KiB After Width: | Height: | Size: 5.1 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 21 KiB |
After Width: | Height: | Size: 7.2 KiB |
After Width: | Height: | Size: 14 KiB |
After Width: | Height: | Size: 9.0 KiB |
After Width: | Height: | Size: 226 KiB |
After Width: | Height: | Size: 24 KiB |
After Width: | Height: | Size: 6.0 KiB |