def get_comments(file): ext = get_file_ext(file) if ext in MUSIC_TYPES: return MUSIC_TYPES[ext](file) else: pymt_logger.warning('File "%s" is not recognized by FlipSide', file) return None
def append(category, key, obj, timeout=None): '''Add a new object in the cache. :Parameters: `category` : str Identifier of the category `key` : str Uniq identifier of the object to store `obj` : object Object to store in cache `timeout` : double (optionnal) Custom time to delete the object if it's not used. ''' try: cat = Cache._categories[category] except KeyError: pymt_logger.warning('Cache: category <%s> not exist' % category) return timeout = timeout or cat['timeout'] # FIXME: activate purge when limit is hit #limit = cat['limit'] #if limit is not None and len(Cache._objects[category]) >= limit: # Cache._purge_oldest(category) Cache._objects[category][key] = { 'object': obj, 'timeout': timeout, 'lastaccess': getClock().get_time(), 'timestamp': getClock().get_time() }
def probe(self): inputs = get_inputs(self.input_path) inputs = [x for x in inputs if x.has_capability(ABS_MT_POSITION_X)] for device in inputs: pymt_logger.info('ProbeSysfs: found device: %s at %s' % ( device.name, device.device)) # must ignore ? if self.match: if not re.match(self.match, device.name, re.IGNORECASE): pymt_logger.warning('ProbeSysfs: device not match the' ' rule in config, ignoring.') continue devicename = self.device % dict(name=device.device.split(os.path.sep)[-1]) provider = TouchFactory.get(self.provider) if provider is None: pymt_logger.info('ProbeSysfs: unable to found provider %s' % self.provider) pymt_logger.info('ProbeSysfs: fallback on hidinput') provider = TouchFactory.get('hidinput') if provider is None: pymt_logger.critical('ProbeSysfs: no input provider found' ' to handle this device !') continue instance = provider(devicename, '%s,%s' % (device.device, ','.join(self.args))) if instance: pymt.pymt_providers.append(instance)
def _set_id(self, id): ref = weakref.ref(self) if ref in _id_2_widget: del _id_2_widget[self._id] self._id = id if self._id: if ref in _id_2_widget: pymt_logger.warning("Widget: ID <%s> is already used ! Replacing with new one." % id) _id_2_widget[self._id] = ref
def load(filename): '''Load a sound, and return a Sound() instance''' ext = filename.split('.')[-1].lower() for classobj in SoundLoader._classes: if ext in classobj.extensions(): return classobj(filename=filename) pymt_logger.warning('Audio: Unable to found a loader for <%s>' % filename) return None
def _set_id(self, id): ref = weakref.ref(self) if ref in _id_2_widget: del _id_2_widget[self._id] self._id = id if self._id: if ref in _id_2_widget: pymt_logger.warning( 'Widget: ID <%s> is already used ! Replacing with new one.' % id) _id_2_widget[self._id] = ref
def _window_on_key_down(self, key, scancode=None, unicode=None): try: # XXX Experimental, and work only with pygame. modifiers = getWindow().modifiers if scancode == 55 and 'ctrl' in modifiers: from pygame import SCRAP_TEXT from pygame import scrap scrap.init() text = scrap.get(SCRAP_TEXT) if text: self.keyboard.text += text return True except Exception, e: pymt_logger.warning('Unable to use scrap module: %s' % str(e))
def _set_filename(self, filename): global squirtle if squirtle is None: import squirtle # TODO remove this ugly code, improve loader for this try: pymt_logger.debug('SVGButton: loading %s' % filename) self.svg = squirtle.SVG(filename) except Exception, e: try: svgpath = os.path.join(pymt_data_dir, 'icons/svg') pymt_logger.exception('SVGButton: unable to load %s' % filename) pymt_logger.warning('SVGButton: trying %s' % ( svgpath + filename)) self.svg = squirtle.SVG(os.path.join(svgpath, filename)) except Exception, e: pymt_logger.exception('SVGButton: unable to load file %s' % filename)
def _set_filename(self, filename): global squirtle if squirtle is None: import squirtle # TODO remove this ugly code, improve loader for this try: pymt_logger.debug('SVGButton: loading %s' % filename) self.svg = squirtle.SVG(filename) except Exception, e: try: svgpath = os.path.join(pymt_data_dir, 'icons/svg') pymt_logger.exception('SVGButton: unable to load %s' % filename) pymt_logger.warning('SVGButton: trying %s' % (svgpath + filename)) self.svg = squirtle.SVG(os.path.join(svgpath, filename)) except Exception, e: pymt_logger.exception('SVGButton: unable to load file %s' % filename)
def endCallback(): if self.tess_style == GL_TRIANGLE_FAN: c = self.curr_shape.pop(0) p1 = self.curr_shape.pop(0) while self.curr_shape: p2 = self.curr_shape.pop(0) tlist.extend([c, p1, p2]) p1 = p2 elif self.tess_style == GL_TRIANGLE_STRIP: p1 = self.curr_shape.pop(0) p2 = self.curr_shape.pop(0) while self.curr_shape: p3 = self.curr_shape.pop(0) tlist.extend([p1, p2, p3]) p1 = p2 p2 = p3 elif self.tess_style == GL_TRIANGLES: tlist.extend(self.curr_shape) else: pymt_logger.warning('Squirtle: Unrecognised tesselation style: %d' % (self.tess_style,)) self.tess_style = None self.curr_shape = []
def _set_filename(self, filename): global squirtle if squirtle is None: import squirtle # TODO remove this ugly code, improve loader for this try: if self.rawdata is None: pymt_logger.debug('SVG: loading %s' % filename) self.svg = squirtle.SVG(filename) else: pymt_logger.debug('SVG: loading %s from rawdata' % filename) self.svg = squirtle.SVG(filename=filename, rawdata=self.rawdata) except Exception: try: svgpath = os.path.join(pymt_data_dir, 'icons/svg') pymt_logger.exception('SVG: unable to load %s' % filename) pymt_logger.warning('SVG: trying %s' % (svgpath + filename)) self.svg = squirtle.SVG(os.path.join(svgpath, filename)) except Exception: pymt_logger.exception('SVG: unable to load file %s' % filename) self._filename = filename self.size = (self.svg.width, self.svg.height)
def _screenshot(): import os import pygame from OpenGL.GL import glReadBuffer, glReadPixels, GL_RGB, GL_UNSIGNED_BYTE, GL_FRONT win = getWindow() glReadBuffer(GL_FRONT) data = glReadPixels(0, 0, win.width, win.height, GL_RGB, GL_UNSIGNED_BYTE) surface = pygame.image.fromstring(str(buffer(data)), win.size, 'RGB', True) filename = None for i in xrange(9999): path = os.path.join(os.getcwd(), 'screenshot%04d.jpg' % i) if not os.path.exists(path): filename = path break if filename: try: pygame.image.save(surface, filename) pymt_logger.info('KeyBinding: Screenshot saved at %s' % filename) except: pymt_logger.exception('KeyBinding: Unable to take a screenshot') else: pymt_logger.warning('KeyBinding: Unable to take screenshot, no more slot available')
def _screenshot(): import os import pygame from OpenGL.GL import glReadBuffer, glReadPixels, GL_RGB, GL_UNSIGNED_BYTE, GL_FRONT win = getWindow() glReadBuffer(GL_FRONT) data = glReadPixels(0, 0, win.width, win.height, GL_RGB, GL_UNSIGNED_BYTE) surface = pygame.image.fromstring(str(buffer(data)), win.size, 'RGB', True) filename = None for i in xrange(9999): path = os.path.join(os.getcwd(), 'screenshot%04d.jpg' % i) if not os.path.exists(path): filename = path break if filename: try: pygame.image.save(surface, filename) pymt_logger.info('KeyBinding: Screenshot saved at %s' % filename) except: pymt_logger.exception('KeyBinding: Unable to take a screenshot') else: pymt_logger.warning( 'KeyBinding: Unable to take screenshot, no more slot available')
def endCallback(): if self.tess_style == GL_TRIANGLE_FAN: c = self.curr_shape.pop(0) p1 = self.curr_shape.pop(0) while self.curr_shape: p2 = self.curr_shape.pop(0) tlist.extend([c, p1, p2]) p1 = p2 elif self.tess_style == GL_TRIANGLE_STRIP: p1 = self.curr_shape.pop(0) p2 = self.curr_shape.pop(0) while self.curr_shape: p3 = self.curr_shape.pop(0) tlist.extend([p1, p2, p3]) p1 = p2 p2 = p3 elif self.tess_style == GL_TRIANGLES: tlist.extend(self.curr_shape) else: pymt_logger.warning( 'Squirtle: Unrecognised tesselation style: %d' % (self.tess_style, )) self.tess_style = None self.curr_shape = []
def load_material_library(self, filename): material = None file = self.open_material_file(filename) for line in file: if line.startswith('#'): continue values = line.split() if not values: continue if values[0] == 'newmtl': material = Material(values[1]) self.materials[material.name] = material elif material is None: pymt_logger.warning('OBJ: Expected "newmtl" in %s' % filename) continue try: if values[0] == 'Kd': material.diffuse = map(float, values[1:]) elif values[0] == 'Ka': material.ambient = map(float, values[1:]) elif values[0] == 'Ks': material.specular = map(float, values[1:]) elif values[0] == 'Ke': material.emission = map(float, values[1:]) elif values[0] == 'Ns': material.shininess = float(values[1]) elif values[0] == 'd': material.opacity = float(values[1]) elif values[0] == 'map_Kd': try: filename = ' '.join(values[1:]) material.texture = Image(filename).texture material.texture.wrap = GL_REPEAT except: pymt_logger.warning('OBJ: Could not load texture %s' % values[1]) raise except: pymt_logger.warning('OBJ: Parse error in %s.' % filename) raise
def tess_error(code): err = gluErrorString(code) pymt_logger.warning('BezierPath: GLU Tesselation Error: %s' % str(err))
return True size = property(EventDispatcher._get_size, _set_size) def _set_width(self, x): if super(MTWidget, self)._set_width(x): self.dispatch_event("on_resize", *self._size) return True width = property(EventDispatcher._get_width, _set_width) def _set_height(self, x): if super(MTWidget, self)._set_height(x): self.dispatch_event("on_resize", *self._size) return True height = property(EventDispatcher._get_height, _set_height) # install acceleration try: import types from pymt.accelerate import accelerate if accelerate is not None: MTWidget.on_update = types.MethodType(accelerate.widget_on_update, None, MTWidget) MTWidget.on_draw = types.MethodType(accelerate.widget_on_draw, None, MTWidget) MTWidget.collide_point = types.MethodType(accelerate.widget_collide_point, None, MTWidget) except ImportError, e: pymt_logger.warning("Widget: Unable to use accelerate module <%s>" % e)
def __init__(self, filename, file=None, path=None, compat=True): self.materials = {} self.meshes = {} # Name mapping self.mesh_list = [] # Also includes anonymous meshes self.compat = compat if file is None: file = open(filename, 'r') if path is None: path = os.path.dirname(filename) self.path = path mesh = None group = None material = None vertices = [[0., 0., 0.]] normals = [[0., 0., 0.]] tex_coords = [[0., 0.]] for line in open(filename, 'r'): if line.startswith('#'): continue values = line.split() if not values: continue if values[0] == 'v': vertices.append(map(float, values[1:4])) elif values[0] == 'vn': normals.append(map(float, values[1:4])) elif values[0] == 'vt': tex_coords.append(map(float, values[1:3])) elif values[0] == 'mtllib': self.load_material_library(values[1]) elif values[0] in ('usemtl', 'usemat'): material = self.materials.get(values[1], None) if material is None: pymt_logger.warning('OBJ: Unknown material: %s' % values[1]) if mesh is not None: group = MaterialGroup(material) mesh.groups.append(group) elif values[0] == 'o': mesh = Mesh(values[1]) self.meshes[mesh.name] = mesh self.mesh_list.append(mesh) group = None elif values[0] == 'f': if mesh is None: mesh = Mesh('') self.mesh_list.append(mesh) if material is None: material = Material('') if group is None: group = MaterialGroup(material) mesh.groups.append(group) # For fan triangulation, remember first and latest vertices v1 = None vlast = None for i, v in enumerate(values[1:]): v_index, t_index, n_index = \ (map(int, [j or 0 for j in v.split('/')]) + [0, 0])[:3] if v_index < 0: v_index += len(vertices) - 1 if t_index < 0: t_index += len(tex_coords) - 1 if n_index < 0: n_index += len(normals) - 1 vertex = tex_coords[t_index] + \ normals[n_index] + \ vertices[v_index] if i >= 3: # Triangulate group.vertices += v1 + vlast group.vertices += vertex if i == 0: v1 = vertex vlast = vertex
size = property(EventDispatcher._get_size, _set_size) def _set_width(self, x): if super(MTWidget, self)._set_width(x): self.dispatch_event('on_resize', *self._size) return True width = property(EventDispatcher._get_width, _set_width) def _set_height(self, x): if super(MTWidget, self)._set_height(x): self.dispatch_event('on_resize', *self._size) return True height = property(EventDispatcher._get_height, _set_height) # install acceleration try: import types from pymt.accelerate import accelerate if accelerate is not None: MTWidget.on_update = types.MethodType(accelerate.widget_on_update, None, MTWidget) MTWidget.on_draw = types.MethodType(accelerate.widget_on_draw, None, MTWidget) MTWidget.collide_point = types.MethodType( accelerate.widget_collide_point, None, MTWidget) except ImportError, e: pymt_logger.warning('Widget: Unable to use accelerate module <%s>' % e)
def _pop_style(self, k): if len(self._style_stack[k]) == 0: pymt_logger.warning('Label: pop style stack without push') return v = self._style_stack[k].pop() self.options[k] = v
def errorCallback(code): err = gluErrorString(code) pymt_logger.warning('Squirtle: GLU Tesselation Error: ' + err)
''' __all__ = ['Vector', 'matrix_inv_mult', 'matrix_trans_mult', 'matrix_mult'] import math from pymt.logger import pymt_logger _use_numpy = False try: import numpy _use_numpy = True except: pymt_logger.warning('you do not have numpy installed. Computing ' 'transformations for MTScatterWidget can get painfully ' 'slow without numpy. You should install numpy: ' 'http://numpy.scipy.org/') from matrix import Matrix, RowVector class Vector(list): '''Represents a 2D vector.''' def __init__(self, *largs): if len(largs) == 1: super(Vector, self).__init__(largs[0]) elif len(largs) == 2: super(Vector, self).__init__(largs) else: raise Exception('Invalid vector') def _get_x(self):
def warn(self, message): pymt_logger.warning('Squirtle: svg parser on %s: %s' % (self.filename, message))
def main(): # Parse command line options parser = OptionParser() parser.add_option('-d', '--directory', action='store', type='string', default='~/Music', dest='directory', help="The directory to search for Music Files") parser.add_option('-s', '--scan', action='store_true', dest='scan', help='Scan for music files and load them into the library') #parser.add_option('-r', '--reset' opts, args = parser.parse_args() if args: pymt_logger.warning("FlipSide doesn't know what to do with: %s") if opts.scan and not os.path.exists(opts.directory): pymt_logger.warning("Your specified music directory %s does not exist") sys.exit() w = MTWindow() k = MTKinetic() w.add_widget(k) p = MTScatterPlane() k.add_widget(p) player = PlayManager() p.add_widget(player) #SQL Stuff if not os.path.exists('library.sql'): #There is no library, lets generate one pymt_logger.warning("You don't have a music library! To generate one, flipside.py -d /path/to/music -s") sys.exit() engine = sql.create_engine('sqlite:///library.sql', echo=False, echo_pool=False) metadata = MetaData() songs_table = Table('songs', metadata, Column('id', Integer, primary_key=True), Column('title', String), Column('path', String), Column('album', String), Column('artist', String), Column('date', String), Column('tracknumber', Integer), Column('albumart', String) ) metadata.create_all(engine) mapper(SQLSongMeta, songs_table) session = sessionmaker(bind=engine, echo_uow=False)() ## NEW METHOD## #Find all the music in MUSIC_DIR and put it in our SQL DB if opts.scan: music_tree = os.walk(os.path.expanduser(opts.directory)) for branch in music_tree: try: cover = os.path.join(branch[0], filter(lambda x: get_file_ext(x) in IMAGE_TYPES, branch[2]).pop()) except: cover = 'cover_default.jpg' for file in branch[2]: path = os.path.join(branch[0], file) comments = parse_comments(path) if comments: comments['albumart'] = cover song = SQLSongMeta(**comments) session.add(song) session.commit() #Create a list of every album in the database #We use list(set()) so each album only appears once #The list comprehension is to get it out of the list tuple and out of unicode albums = [str(e[0]) for e in set(session.query(SQLSongMeta.album).all())] for album in albums: #Get a list of every song in the album "album" in the order that they appear on the CD songs = session.query(SQLSongMeta).filter(SQLSongMeta.album==album).order_by(SQLSongMeta.tracknumber) f = AlbumFloater(filename=songs[0].albumart, player=player, album=album, artist=songs[0].artist) for song in songs: #Add all the songs on the album to the floater f.list.add(KineticSong(meta=song)) p.add_widget(f) runTouchApp()
def create_window(self, params): # force display to show (available only for fullscreen) displayidx = pymt.pymt_config.getint('graphics', 'display') if not 'SDL_VIDEO_FULLSCREEN_HEAD' in os.environ and displayidx != -1: os.environ['SDL_VIDEO_FULLSCREEN_HEAD'] = '%d' % displayidx # init some opengl, same as before. self.flags = pygame.HWSURFACE | pygame.OPENGL | pygame.DOUBLEBUF pygame.display.init() multisamples = pymt.pymt_config.getint('graphics', 'multisamples') if multisamples > 0: pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLEBUFFERS, 1) pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLESAMPLES, multisamples) pygame.display.gl_set_attribute(pygame.GL_DEPTH_SIZE, 16) pygame.display.gl_set_attribute(pygame.GL_STENCIL_SIZE, 1) pygame.display.gl_set_attribute(pygame.GL_ALPHA_SIZE, 8) pygame.display.set_caption('pymt') if params['position'] == 'auto': self._pos = None elif params['position'] == 'custom': self._pos = params['left'], params['top'] else: raise ValueError('position token in configuration accept only ' '"auto" or "custom"') self._fullscreenmode = params['fullscreen'] if self._fullscreenmode == 'fake': pymt_logger.debug('WinPygame: Set window to fake fullscreen mode') self.flags |= pygame.NOFRAME # if no position set, in fake mode, we always need to set the # position. so replace 0, 0. if self._pos is None: self._pos = (0, 0) os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % self._pos elif self._fullscreenmode: pymt_logger.debug('WinPygame: Set window to fullscreen mode') self.flags |= pygame.FULLSCREEN elif self._pos is not None: os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % self._pos # never stay with a None pos, application using w.center will be fired. self._pos = (0, 0) # prepare keyboard repeat_delay = int(pymt.pymt_config.get('keyboard', 'repeat_delay')) repeat_rate = float(pymt.pymt_config.get('keyboard', 'repeat_rate')) pygame.key.set_repeat(repeat_delay, int(1000. / repeat_rate)) # set window icon before calling set_mode icon = pygame.image.load( pymt.pymt_config.get('graphics', 'window_icon')) pygame.display.set_icon(icon) # init ourself size + setmode # before calling on_resize self._size = params['width'], params['height'] self._vsync = params['vsync'] self._fps = float(params['fps']) # ensure the default fps will be 60 if vsync is actived # and if user didn't set any maximum fps. if self._vsync and self._fps <= 0: self._fps = 60. # try to use mode with multisamples try: self._pygame_set_mode() except pygame.error: if multisamples: pymt_logger.warning( 'WinPygame: Video: failed (multisamples=%d)' % multisamples) pymt_logger.warning('Video: trying without antialiasing') pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLEBUFFERS, 0) pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLESAMPLES, 0) multisamples = 0 self._pygame_set_mode() else: pymt_logger.warning('WinPygame: Video setup failed :-(') raise if multisamples: try: glEnable(GL_MULTISAMPLE_ARB) except Exception: pass super(MTWindowPygame, self).create_window(params) # set mouse visibility pygame.mouse.set_visible( pymt.pymt_config.getboolean('graphics', 'show_cursor')) # set rotation self.rotation = params['rotation']
'spelling': ('enchant', 'osxappkit',), 'clipboard': ('pygame', 'dummy'), } # Read environment for option in pymt_options: key = 'PYMT_%s' % option.upper() if key in os.environ: try: if type(pymt_options[option]) in (list, tuple): pymt_options[option] = (str(os.environ[key]),) else: pymt_options[option] = os.environ[key].lower() in \ ('true', '1', 'yes', 'yup') except Exception: pymt_logger.warning('Core: Wrong value for %s' 'environment key' % key) pymt_logger.exception('') # Extract all needed path in pymt #: PyMT directory pymt_base_dir = os.path.dirname(sys.modules[__name__].__file__) #: PyMT external libraries directory pymt_libs_dir = os.path.join(pymt_base_dir, 'lib') #: PyMT modules directory pymt_modules_dir = os.path.join(pymt_base_dir, 'modules') #: PyMT data directory pymt_data_dir = os.path.join(pymt_base_dir, 'data') #: PyMT input provider directory pymt_providers_dir = os.path.join(pymt_base_dir, 'input', 'providers') #: PyMT icons config path (don't remove last '') pymt_icons_dir = os.path.join(pymt_data_dir, 'icons', '')
def runTouchApp(widget=None, slave=False): '''Static main function that starts the application loop. You got some magic things, if you are using argument like this : :Parameters: `<empty>` To make dispatching work, you need at least one input listener. If not, application will leave. (MTWindow act as an input listener) `widget` If you pass only a widget, a MTWindow will be created, and your widget will be added on the window as the root widget. `slave` No event dispatching are done. This will be your job. `widget + slave` No event dispatching are done. This will be your job, but we are trying to get the window (must be created by you before), and add the widget on it. Very usefull for embedding PyMT in another toolkit. (like Qt, check pymt-designed) ''' global pymt_evloop # Ok, we got one widget, and we are not in slave mode # so, user don't create the window, let's create it for him ! ### Not needed, since we always create window ?! #if not slave and widget: # global pymt_window # from ui.window import MTWindow # pymt_window = MTWindow() # Instance all configured input for key, value in pymt.pymt_config.items('input'): pymt_logger.debug('Base: Create provider from %s' % (str(value))) # split value args = str(value).split(',', 1) if len(args) == 1: args.append('') provider_id, args = args provider = TouchFactory.get(provider_id) if provider is None: pymt_logger.warning('Base: Unknown <%s> provider' % \ str(provider_id)) continue # create provider p = provider(key, args) if p: pymt_providers.append(p) pymt_evloop = TouchEventLoop() # add postproc modules for mod in pymt_postproc_modules.values(): pymt_evloop.add_postproc_module(mod) # add main widget if widget and getWindow(): getWindow().add_widget(widget) # start event loop pymt_logger.info('Base: Start application main loop') pymt_evloop.start() # we are in a slave mode, don't do dispatching. if slave: return # in non-slave mode, they are 2 issues # # 1. if user created a window, call the mainloop from window. # This is due to glut, it need to be called with # glutMainLoop(). Only FreeGLUT got a gluMainLoopEvent(). # So, we are executing the dispatching function inside # a redisplay event. # # 2. if no window is created, we are dispatching event lopp # ourself (previous behavior.) # try: if pymt_window is None: _run_mainloop() else: pymt_window.mainloop() finally: stopTouchApp()
def create_window(self, params): # force display to show (available only for fullscreen) displayidx = pymt.pymt_config.getint('graphics', 'display') if not 'SDL_VIDEO_FULLSCREEN_HEAD' in os.environ and displayidx != -1: os.environ['SDL_VIDEO_FULLSCREEN_HEAD'] = '%d' % displayidx # init some opengl, same as before. self.flags = pygame.HWSURFACE | pygame.OPENGL | pygame.DOUBLEBUF pygame.display.init() multisamples = pymt.pymt_config.getint('graphics', 'multisamples') if multisamples > 0: pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLEBUFFERS, 1) pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLESAMPLES, multisamples) pygame.display.gl_set_attribute(pygame.GL_DEPTH_SIZE, 16) pygame.display.gl_set_attribute(pygame.GL_STENCIL_SIZE, 1) pygame.display.gl_set_attribute(pygame.GL_ALPHA_SIZE, 8) pygame.display.set_caption('pymt') if params['position'] == 'auto': self._pos = None elif params['position'] == 'custom': self._pos = params['left'], params['top'] else: raise ValueError('position token in configuration accept only ' '"auto" or "custom"') self._fullscreenmode = params['fullscreen'] if self._fullscreenmode == 'fake': pymt_logger.debug('WinPygame: Set window to fake fullscreen mode') self.flags |= pygame.NOFRAME # if no position set, in fake mode, we always need to set the # position. so replace 0, 0. if self._pos is None: self._pos = (0, 0) os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % self._pos elif self._fullscreenmode: pymt_logger.debug('WinPygame: Set window to fullscreen mode') self.flags |= pygame.FULLSCREEN elif self._pos is not None: os.environ['SDL_VIDEO_WINDOW_POS'] = '%d,%d' % self._pos # never stay with a None pos, application using w.center will be fired. self._pos = (0, 0) # prepare keyboard repeat_delay = int(pymt.pymt_config.get('keyboard', 'repeat_delay')) repeat_rate = float(pymt.pymt_config.get('keyboard', 'repeat_rate')) pygame.key.set_repeat(repeat_delay, int(1000. / repeat_rate)) # set window icon before calling set_mode icon = pygame.image.load(pymt.pymt_config.get('graphics', 'window_icon')) pygame.display.set_icon(icon) # init ourself size + setmode # before calling on_resize self._size = params['width'], params['height'] self._vsync = params['vsync'] self._fps = float(params['fps']) # ensure the default fps will be 60 if vsync is actived # and if user didn't set any maximum fps. if self._vsync and self._fps <= 0: self._fps = 60. # try to use mode with multisamples try: self._pygame_set_mode() except pygame.error: if multisamples: pymt_logger.warning('WinPygame: Video: failed (multisamples=%d)' % multisamples) pymt_logger.warning('Video: trying without antialiasing') pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLEBUFFERS, 0) pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLESAMPLES, 0) multisamples = 0 self._pygame_set_mode() else: pymt_logger.warning('WinPygame: Video setup failed :-(') raise if multisamples: try: glEnable(GL_MULTISAMPLE_ARB) except Exception: pass super(MTWindowPygame, self).create_window(params) # set mouse visibility pygame.mouse.set_visible( pymt.pymt_config.getboolean('graphics', 'show_cursor')) # set rotation self.rotation = params['rotation']
def create_window(self, params): # force display to show (available only for fullscreen) displayidx = pymt.pymt_config.getint('graphics', 'display') if not 'SDL_VIDEO_FULLSCREEN_HEAD' in os.environ and displayidx != -1: os.environ['SDL_VIDEO_FULLSCREEN_HEAD'] = '%d' % displayidx # init some opengl, same as before. self.flags = pygame.HWSURFACE | pygame.OPENGL | pygame.DOUBLEBUF pygame.display.init() multisamples = pymt.pymt_config.getint('graphics', 'multisamples') if multisamples > 0: pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLEBUFFERS, 1) pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLESAMPLES, multisamples) pygame.display.gl_set_attribute(pygame.GL_DEPTH_SIZE, 16) pygame.display.gl_set_attribute(pygame.GL_STENCIL_SIZE, 1) pygame.display.gl_set_attribute(pygame.GL_ALPHA_SIZE, 8) pygame.display.set_caption('pymt') self._fullscreenmode = params['fullscreen'] if self._fullscreenmode == 'fake': pymt_logger.debug('WinPygame: Set window to fake fullscreen mode') self.flags |= pygame.NOFRAME os.environ['SDL_VIDEO_WINDOW_POS'] = '0,0' elif self._fullscreenmode: pymt_logger.debug('WinPygame: Set window to fullscreen mode') self.flags |= pygame.FULLSCREEN # init ourself size + setmode # before calling on_resize self._size = params['width'], params['height'] self._vsync = params['vsync'] # try to use mode with multisamples try: self._pygame_set_mode() except pygame.error: if multisamples: pymt_logger.warning('WinPygame: Video: failed (multisamples=%d)' % multisamples) pymt_logger.warning('Video: trying without antialiasing') pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLEBUFFERS, 0) pygame.display.gl_set_attribute(pygame.GL_MULTISAMPLESAMPLES, 0) multisamples = 0 self._pygame_set_mode() else: pymt_logger.warning('WinPygame: Video setup failed :-(') raise if multisamples: try: glEnable(GL_MULTISAMPLE_ARB) except Exception: pass super(MTWindowPygame, self).create_window(params) # set mouse visibility pygame.mouse.set_visible( pymt.pymt_config.getboolean('graphics', 'show_cursor'))
pymt_config_version = pymt_config.getdefault('pymt', 'config_version', 0) # Add defaults section pymt_config.adddefaultsection('pymt') pymt_config.adddefaultsection('keyboard') pymt_config.adddefaultsection('graphics') pymt_config.adddefaultsection('input') pymt_config.adddefaultsection('dump') pymt_config.adddefaultsection('modules') pymt_config.adddefaultsection('widgets') # Upgrade default configuration until having the current version need_save = False if pymt_config_version != PYMT_CONFIG_VERSION: pymt_logger.warning('Config: Older configuration version detected' '(%d instead of %d)' % ( pymt_config_version, PYMT_CONFIG_VERSION)) pymt_logger.warning('Config: Upgrading configuration in progress.') need_save = True while pymt_config_version < PYMT_CONFIG_VERSION: pymt_logger.debug('Config: Upgrading from %d' % pymt_config_version) # Versionning introduced in version 0.4. if pymt_config_version == 0: pymt_config.setdefault('pymt', 'show_fps', '0') pymt_config.setdefault('pymt', 'log_level', 'info') pymt_config.setdefault('pymt', 'double_tap_time', '250') pymt_config.setdefault('pymt', 'double_tap_distance', '20') pymt_config.setdefault('pymt', 'enable_simulator', '1')
import os import pymt from time import sleep, time from pymt.clock import getClock from pymt.ui.window import BaseWindow from pymt.exceptions import pymt_exception_manager, ExceptionManager from pymt.logger import pymt_logger from pymt.base import stopTouchApp, getEventLoop from OpenGL.GL import glEnable from OpenGL.GL.ARB.multisample import GL_MULTISAMPLE_ARB try: import pygame except: pymt_logger.warning('WinPygame: Pygame is not installed !') raise class MTWindowPygame(BaseWindow): def create_window(self, params): # force display to show (available only for fullscreen) displayidx = pymt.pymt_config.getint('graphics', 'display') if not 'SDL_VIDEO_FULLSCREEN_HEAD' in os.environ and displayidx != -1: os.environ['SDL_VIDEO_FULLSCREEN_HEAD'] = '%d' % displayidx # init some opengl, same as before. self.flags = pygame.HWSURFACE | pygame.OPENGL | pygame.DOUBLEBUF pygame.display.init()
__all__ = ('MTWindowPygame', ) import os import pymt from pymt.ui.window import BaseWindow from pymt.exceptions import pymt_exception_manager, ExceptionManager from pymt.logger import pymt_logger from pymt.base import stopTouchApp, getEventLoop from OpenGL.GL import glEnable from OpenGL.GL.ARB.multisample import GL_MULTISAMPLE_ARB try: import pygame except: pymt_logger.warning('WinPygame: Pygame is not installed !') raise class MTWindowPygame(BaseWindow): def create_window(self, params): # force display to show (available only for fullscreen) displayidx = pymt.pymt_config.getint('graphics', 'display') if not 'SDL_VIDEO_FULLSCREEN_HEAD' in os.environ and displayidx != -1: os.environ['SDL_VIDEO_FULLSCREEN_HEAD'] = '%d' % displayidx # init some opengl, same as before. self.flags = pygame.HWSURFACE | pygame.OPENGL | pygame.DOUBLEBUF pygame.display.init() multisamples = pymt.pymt_config.getint('graphics', 'multisamples')
def add_widget(self, widget): pymt_logger.warning( 'MTContainer: cannot add MTWidget, only take BaseObject')
raise for p in p2: if p is None: continue w2.__setattr__(p, type(w2.__getattribute__(p))( func(largs[p2.index(p)]))) else: dtype = type(w2.__getattribute__(p2)) try: if len(largs) == 1: w2.__setattr__(p2, dtype(func(*largs))) else: w2.__setattr__(p2, dtype(func(largs))) except Exception: pymt_logger.exception('Widget: cannot connect with' 'different size') raise if p2 is None: self.push_handlers(**{p1: w2}) else: self.push_handlers(**{p1: lambda_connect}) # install acceleration try: from pymt.accelerate import accelerate if accelerate is not None: EventDispatcher.dispatch_event = types.MethodType( accelerate.eventdispatcher_dispatch_event, None, EventDispatcher) except ImportError, e: pymt_logger.warning('Event: Unable to use accelerate module <%s>' % e)
), 'clipboard': ('pygame', 'dummy'), } # Read environment for option in pymt_options: key = 'PYMT_%s' % option.upper() if key in os.environ: try: if type(pymt_options[option]) in (list, tuple): pymt_options[option] = (str(os.environ[key]), ) else: pymt_options[option] = os.environ[key].lower() in \ ('true', '1', 'yes', 'yup') except Exception: pymt_logger.warning('Core: Wrong value for %s' 'environment key' % key) pymt_logger.exception('') # Extract all needed path in pymt #: PyMT directory pymt_base_dir = os.path.dirname(sys.modules[__name__].__file__) #: PyMT external libraries directory pymt_libs_dir = os.path.join(pymt_base_dir, 'lib') #: PyMT modules directory pymt_modules_dir = os.path.join(pymt_base_dir, 'modules') #: PyMT data directory pymt_data_dir = os.path.join(pymt_base_dir, 'data') #: PyMT input provider directory pymt_providers_dir = os.path.join(pymt_base_dir, 'input', 'providers') #: PyMT icons config path (don't remove last '') pymt_icons_dir = os.path.join(pymt_data_dir, 'icons', '')
''' Scatter package: provide lot of widgets based on scatter (base, svg, plane, image...) ''' __all__ = ('MTScatterWidget', 'MTScatterSvg', 'MTScatterPlane', 'MTScatterImage') import pymt from pymt.logger import pymt_logger from numpy import array, dot, float64 try: from pymt.c_ext._transformations import * except ImportError: pymt_logger.warning('Unable to import accelerated transformation, falling back to plain python.'); from pymt.lib.transformations import * from math import atan,cos, radians, degrees from OpenGL.GL import * from pymt.graphx import drawRectangle, drawCSSRectangle, gx_matrix, gx_matrix_identity, set_color, \ drawTexturedRectangle, gx_blending, drawTriangle from pymt.vector import Vector, matrix_mult, matrix_inv_mult from pymt.utils import deprecated, serialize_numpy, deserialize_numpy from pymt.ui.animation import Animation, AnimationAlpha from pymt.ui.factory import MTWidgetFactory from pymt.ui.widgets.widget import MTWidget from pymt.ui.widgets.svg import MTSvg class MTScatter(MTWidget):
def add_widget(self, widget): pymt_logger.warning('MTContainer: cannot add MTWidget, only take BaseObject')