Changeset - 167a61d3cfbf
[Not reviewed]
default
0 4 0
Drew Perttula - 12 years ago 2013-06-06 08:23:17
drewp@bigasterisk.com
subcomposer put local subs into the graph with a type edge.
Ignore-this: a0c1ef69684786e4758b9ecf10927d3b
4 files changed with 20 insertions and 10 deletions:
0 comments (0 inline, 0 general)
bin/run_local.py
Show inline comments
 
@@ -21,12 +21,13 @@ log = logging.getLogger()
 

	
 
class CSH(coloredlogs.ColoredStreamHandler):
 
    def render_timestamp(self, created):
 
        return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(created)) + (
 
            "%.3f" % (created % 1)).lstrip('0')
 

	
 
    def render_name(self, name):
 
        return name
 

	
 
log.addHandler(CSH(show_hostname=False, show_name=True))
 

	
 

	
 

	
bin/subcomposer
Show inline comments
 
@@ -13,34 +13,38 @@ subcomposer
 
        OneLevel widget
 
          UI edits are caught here and go all the way back to currentSub
 

	
 

	
 
"""
 
from __future__ import division, nested_scopes
 
import time, logging
 
from optparse import OptionParser
 
import logging
 
import Tkinter as tk
 
import louie as dispatcher
 
from twisted.internet import reactor, tksupport, task
 
from rdflib import URIRef
 
from rdflib import URIRef, RDF
 

	
 
from run_local import log
 
log.setLevel(logging.DEBUG)
 

	
 
from light9.dmxchanedit import Levelbox
 
from light9 import dmxclient, Patch, Submaster, prof
 
from light9 import dmxclient, Submaster, prof
 
from light9.Patch import get_channel_name
 
from light9.uihelpers import toplevelat
 
from light9.rdfdb.syncedgraph import SyncedGraph
 
from light9.rdfdb import clientsession
 
from light9.tkdnd import initTkdnd
 
from light9.namespaces import L9
 
from light9.rdfdb.patch import Patch
 
from light9.observable import Observable
 
from light9.editchoice import EditChoice, Local
 

	
 

	
 
class Subcomposer(tk.Frame):
 
    """
 
    <session> l9:currentSub ?sub is the URI of the sub we're tied to for displaying and
 
    editing. If we don't have a currentSub, then we're actually
 
    editing a session-local sub called <session> l9:currentSub <sessionLocalSub>
 

	
 
    I'm not sure that Locals should even be PersistentSubmaster with
 
    uri and graph storage, but I think that way is making fewer
 
@@ -71,27 +75,28 @@ class Subcomposer(tk.Frame):
 
        self._currentChoice = Observable(Local)
 

	
 
        # this is a PersistentSubmaster (even for local)
 
        self.currentSub = Observable(Submaster.PersistentSubmaster(
 
                    graph, self.makeLocal()))
 

	
 
        def pc(val):
 
            log.info("change viewed sub to %s", val)
 
        self._currentChoice.subscribe(pc)
 

	
 
        EditChoice(self, self.graph, self._currentChoice).frame.pack(side='top')
 
        self.setupSubChoiceLinks()
 
        self.setupLevelboxUi()
 
        
 
    def setupSubChoiceLinks(self):
 

	
 
        graph = self.graph
 
        def ann():
 
            print "currently: session=%s currentSub=%r _currentChoice=%r" % (
 
                self.session, self.currentSub(), self._currentChoice())
 

	
 
        @graph.addHandler
 
        def graphChanged():
 
            s = graph.value(self.session, L9['currentSub'])
 
            if s is None:
 
                s = self.makeLocal()
 
            self.currentSub(Submaster.PersistentSubmaster(graph, s))
 

	
 
        @self.currentSub.subscribe
 
@@ -120,38 +125,42 @@ class Subcomposer(tk.Frame):
 
            if newChoice is not None:
 
                self.currentSub(Submaster.PersistentSubmaster(
 
                    graph, newChoice))
 

	
 
    def levelsChanged(self, sub):
 
        if sub == self.currentSub():
 
            self.sendupdate()
 
        
 
    def makeLocal(self):
 
        # todo: put a type on this, so subChanged can identify it right
 
        # todo: where will these get stored, or are they local to this
 
        # subcomposer process and don't use PersistentSubmaster at all?
 
        return URIRef("http://local/%s" % time.time())
 

	
 
        new = URIRef("http://local/%s" % time.time())
 
        self.graph.patch(Patch(addQuads=[(new, RDF.type, L9['Submaster'], self.session)]))
 
        
 
        return new
 
        
 
    def setupLevelboxUi(self):
 
        self.levelbox = Levelbox(self, graph, self.currentSub)
 
        self.levelbox = Levelbox(self, self.graph, self.currentSub)
 
        self.levelbox.pack(side='top')
 

	
 
        tk.Button(self, text="All to zero",
 
             command=lambda *args: self.currentSub().clear()).pack(side='top')
 

	
 
    def savenewsub(self, subname):
 
        leveldict={}
 
        for i,lev in zip(range(len(self.levels)),self.levels):
 
            if lev!=0:
 
                leveldict[Patch.get_channel_name(i+1)]=lev
 
                leveldict[get_channel_name(i+1)]=lev
 

	
 
        s=Submaster.Submaster(subname,leveldict=leveldict)
 
        s.save()
 

	
 
    def sendupdate(self):
 
        d = self.currentSub().get_dmx_list()
 
        dmxclient.outputlevels(d, twisted=True)
 

	
 

	
 
def launch(opts, args, root, graph, session):
 
    if not opts.no_geometry:
 
        toplevelat("subcomposer - %s" % opts.session, root, graph, session)
 
@@ -176,26 +185,24 @@ def launch(opts, args, root, graph, sess
 
    task.LoopingCall(sc.sendupdate).start(10)
 

	
 

	
 
#############################
 

	
 
if __name__ == "__main__":
 
    parser = OptionParser(usage="%prog [suburi]")
 
    parser.add_option('--no-geometry', action='store_true',
 
                      help="don't save/restore window geometry")
 
    clientsession.add_option(parser)
 
    opts, args = parser.parse_args()
 

	
 
    logging.basicConfig(level=logging.DEBUG)
 

	
 
    root=tk.Tk()
 
    root.config(bg='black')
 
    root.tk_setPalette("#004633")
 

	
 
    initTkdnd(root.tk, 'tkdnd/trunk/')
 

	
 
    graph = SyncedGraph("subcomposer")
 
    session = clientsession.getUri('subcomposer', opts)
 

	
 
    graph.initiallySynced.addCallback(lambda _: launch(opts, args, root, graph, session))
 

	
 
    root.protocol('WM_DELETE_WINDOW', reactor.stop)
light9/Submaster.py
Show inline comments
 
@@ -124,28 +124,29 @@ class Submaster(object):
 
                                             amount))
 

	
 
        return xfaded_sub
 

	
 
class PersistentSubmaster(Submaster):
 
    def __init__(self, graph, uri):
 
        if uri is None:
 
            raise TypeError("uri must be URIRef")
 
        self.graph, self.uri = graph, uri
 
        self.graph.addHandler(self.setName)
 
        self.graph.addHandler(self.setLevels)
 
        Submaster.__init__(self, self.name, self.levels)
 
        self.graph = graph
 
        self.uri = uri
 
        self.temporary = False
 

	
 
        # error faster if we won't be able to find where to save
 
        self.saveContext()
 

	
 
    def ident(self):
 
        return self.uri
 

	
 
    def _editedLevels(self):
 
        self.save()
 

	
 
    def setName(self):
 
        log.info("sub update name %s %s", self.uri, self.graph.label(self.uri))
 
        self.name = self.graph.label(self.uri)
 

	
 
    def setLevels(self):
 
        log.info("sub update levels")
light9/rdfdb/graphfile.py
Show inline comments
 
@@ -43,24 +43,25 @@ class GraphFile(object):
 
        # bug left is that we'll retry too agressively on a file
 
        # that's being written
 

	
 
        from twisted.internet.inotify import IN_CLOSE_WRITE, IN_MOVED_FROM, IN_MODIFY, IN_DELETE, IN_DELETE_SELF, IN_CHANGED
 

	
 
        notifier.watch(FilePath(path),
 
                       mask=IN_CLOSE_WRITE | IN_MOVED_FROM | IN_DELETE | IN_DELETE_SELF | IN_CHANGED | 16383,
 
                       callbacks=[self.notify])
 
      
 
    def notify(self, notifier, filepath, mask):
 
        maskNames = humanReadableMask(mask)
 
        if maskNames[0] in ['open', 'access', 'close_nowrite', 'attrib', 'delete_self']:
 
            log.debug("file %s changed, ignoring %s" % (filepath, maskNames))
 
            return
 

	
 
        try:
 
            if filepath.getModificationTime() == self.lastWriteTimestamp:
 
                log.debug("file %s changed, but we did this write", filepath)
 
                return
 
        except OSError as e:
 
            log.error("watched file %s: %r" % (filepath, e))
 
            return
 
            
 
        log.info("file %s changed (%s)", filepath, maskNames)
 
        try:
0 comments (0 inline, 0 general)