Began creating a signal system so I don't have to store functions in the

settings module
This commit is contained in:
bjschuma 2010-01-20 10:10:27 -05:00
parent a4963c51e6
commit 6fad4ceac1
11 changed files with 197 additions and 61 deletions

View File

@ -1,4 +1,4 @@
# This is the base tools package
# It contains various tools needed by the base layer of ocarina2
__all__ = ["file", "proc", "message", "needle", "xm"]
__all__ = ["file", "map", "message", "needle", "proc", "signal", "xm"]

58
src/base/bt/map.py Normal file
View File

@ -0,0 +1,58 @@
#! /usr/bin/python
# To change this template, choose Tools | Templates
# and open the template in the editor.
__author__="bjschuma"
__date__ ="$Jan 19, 2010 11:10:07 PM$"
from collections import deque
class Map(dict):
def __init__(self):
dict.__init__(self)
def set(self,key,item,right=False):
key = key.upper()
# Make a new deque if the key doesn't exist
if self.has(key) == False:
self[key] = deque()
if right == False:
self[key].appendleft(item)
else:
self[key].append(item)
def get(self,key,all=False):
key = key.upper()
# Return none if the key doesn't exist
if self.has(key) == False:
return None
if all==False:
return self[key][0]
else:
return self[key]
def has(self,key):
return (key.upper() in self.keys())
def remove(self,key,item):
if self.has(key) == False:
return
items = self.get(key,True)
if (item in items) == True:
items.remove(item)
def delete(self,key):
key = key.upper()
if self.has(key) == True:
del self[key]

View File

@ -6,6 +6,7 @@ __date__ ="$Dec 5, 2009 6:46:13 PM$"
import os
import inspect
import settings
import bt.signal
def disp(text):
@ -15,11 +16,12 @@ def disp(text):
# Print general text to the screen
def write(text,verbose=False):
if (verbose==False) or (settings.get("verbose")==True):
w = settings.get("write")
if w == None:
disp(str(text))
else:
w(str(text))
bt.signal.emit("write",str(text))
#w = settings.get("write")
#if w == None:
# disp(str(text))
#else:
# w(str(text))
# Print an error message
@ -30,4 +32,5 @@ def error(text):
write(filename+" ("+lineno+"): "+text)
settings.set("write", disp)
#settings.set("write", disp)
bt.signal.register("write",disp)

48
src/base/bt/signal.py Normal file
View File

@ -0,0 +1,48 @@
#! /usr/bin/python
# To change this template, choose Tools | Templates
# and open the template in the editor.
__author__="bjschuma"
__date__ ="$Jan 20, 2010 12:13:21 AM$"
from map import Map
global signals, status
signals = Map()
status = dict()
def register(signal,func):
if signals.has(signal) == False:
status[signal] = False
signals.set(signal,func)
def remove(signal,func):
signals.remove(signal,func)
def stop(signal):
status[signal] = False
def emit(signal,args=None):
if signals.has(signal) == False:
return
funcs = signals.get(signal,True)
i = 0
status[signal] = True
for func in funcs:
if status[signal] == True:
if not args==None:
func(args)
else:
func()
else:
break
stop(signal)

View File

@ -6,6 +6,7 @@ __date__ ="$Dec 8, 2009 8:40:36 AM$"
import sys
from bt.message import *
from bt.file import *
from bt.signal import *
import loader
import settings
@ -73,10 +74,11 @@ class Manager:
# Disable all plugins
def shutdown(self):
funcs = settings.get("loopquit",True)
if not funcs==None:
for func in funcs:
func()
#funcs = settings.get("loopquit",True)
#if not funcs==None:
# for func in funcs:
# func()
emit("quit")
write("Shutting down manager, disabling all active plugins", True)
session = self.findsession()
self.savesession(session)

View File

@ -13,11 +13,13 @@ from bt.message import write
# We need this next import to set the process name
from bt.proc import setname
from bt.signal import emit
# Import the plugin loader class!
import loader
import manager
def loadPluginPath(path):
loader.load.loaddir(path)
manager.manager.addPlugins(loader.load.getPlugins())
@ -25,7 +27,7 @@ def loadPluginPath(path):
# Begin our main loop
def main():
for path in settings.get("PLUGPATH",True):
for path in settings.get("PLUGPATH"):
loadPluginPath(path)
write("Welcome to "+settings.get("appname")+"!")
@ -33,7 +35,8 @@ def main():
manager.manager.restoresession()
manager.manager.startup()
settings.get("loop")()
emit("run")
#settings.get("loop")()

View File

@ -12,24 +12,31 @@ import getopt
global settings
settings = dict()
#from bt.map import Map
#global settings
#settings = Map()
# Return true if settings contains key
def has(key):
global settings
#return settings.has(key)
return (key.upper() in settings.keys())
# Set key to value
# This must be defined before other imports so bt.message can use it
def set(key,value,end=False):
stack = [value]
def set(key,value):
key = key.upper()
if has(key) == True:
if end == False:
stack += settings[key]
else:
stack = settings[key] + stack
settings[key.upper()] = stack
settings[key] = value
#return settings.set(key,value,end)
#stack = [value]
#key = key.upper()
#if has(key) == True:
# if end == False:
# stack += settings[key]
# else:
# stack = settings[key] + stack
#settings[key.upper()] = stack
from bt.message import write
@ -40,49 +47,52 @@ from bt import xm
# Return the value at key
def get(key, all=False):
def get(key):
key = key.upper()
global settings
if has(key)==False:
return None
if(all == False):
return settings[key][0]
else:
return settings[key]
return settings[key]
#return settings.get(key,all)
#key = key.upper()
#global settings
#if has(key)==False:
# return None
#if(all == False):
# return settings[key][0]
#else:
# return settings[key]
# Set key to value only if it is not set yet
def init(key,value):
if has(key) == False:
set(key,value)
#def init(key,value):
# if settings.has(key) == False:
# settings.set(key,value)
# Replace settings[key] with value
def replace(key,value):
global settings
key = key.upper()
if (key in settings) == True:
del settings[key]
set(key,value)
#def replace(key,value):
# global settings
# key = key.upper()
# if (key in settings) == True:
# del settings[key]
# set(key,value)
def delete(key):
key = key.upper()
global settings
#global settings
if has(key) == True:
del settings[key]
# Pop off the first value at key.upper()
def pop(key):
key = key.upper()
global settings
if (key in settings.keys()) == True:
item = settings[key].pop(0)
if len(settings[key]) == 0:
delete(key)
return item
return None
#def pop(key):
# key = key.upper()
# global settings
# if (key in settings.keys()) == True:
# item = settings[key].pop(0)
# if len(settings[key]) == 0:
# delete(key)
# return item
# return None
# Read settings from file
@ -168,8 +178,10 @@ write("Setting default values...", True)
user = os.path.expanduser("~")
#user = os.path.join(user,".ocarina2")
set("USER", user)
set("PLUGPATH", "../core",True)
set("PLUGPATH", "../extra",True)
set("PLUGPATH", ["../core", "../extra"])
#print get("PLUGPATH")
#get("PLUGPATH")+=["../core"]
#get("PLUGPATH")+=["../extra"]
# Find out what platform we are running on
set("ARCH", sys.platform)

View File

@ -17,6 +17,7 @@ import cline.addch
import cline.message
#import settings
from bt.needle import Needle
from bt.signal import *
@ -25,8 +26,10 @@ def open():
write("Starting CLI", True)
# Tell settings to run this loop
settings.set("loop",cline.loop.loop)
settings.set("loopquit",cline.loop.quit)
#settings.set("loop",cline.loop.loop)
#settings.set("loopquit",cline.loop.quit)
register("run", cline.loop.loop)
register("quit", cline.loop.quit)
# Initialize a dictionary for key press inputs
settings.set("keyinput", dict())

View File

@ -40,6 +40,6 @@ def backspace(input):
# Attempt to run a command
def enter(input):
write(input)
#write(input)
input = run(input)
return input

View File

@ -8,6 +8,7 @@ __date__ ="$Dec 19, 2009 9:39:37 PM$"
from bt.message import write
from bt.signal import *
import manager
import settings
@ -36,7 +37,8 @@ def init():
settings.set("prompt", ">>> ")
settings.set("clinex", 0)
settings.set("cliney", 0)
settings.set("write", insert)
#settings.set("write", insert)
register("write", insert)
#settings.set("everyloop")
@ -62,10 +64,11 @@ def quit():
settings.delete("prompt")
settings.delete("clinex")
settings.delete("cliney")
settings.delete("everyloop")
#settings.delete("everyloop")
# Return to previous write function
settings.pop("write")
remove("write",insert)
#settings.pop("write")
write("Command line loop has ended",True)
@ -83,10 +86,11 @@ def loop():
disp(input)
while halt == False:
list = settings.get("everyloop",True)
if not list == None:
for func in list:
func()
#emit("loop")
#list = settings.get("everyloop",True)
#if not list == None:
# for func in list:
# func()
try:
input = addch(input)
disp(input)

View File

@ -10,6 +10,7 @@ __date__ ="$Dec 19, 2009 11:57:19 PM$"
import curses
import settings
import bt.message
import bt.signal
def advance(y, maxy, stdscr):
@ -44,6 +45,8 @@ def insert(string):
stdscr.addstr(y, 0, string)
advance(y, maxyx[0], stdscr)
bt.signal.stop("write")
# Replace the string on the current line