mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
draft of selection item, DirectScrolledListItem
This commit is contained in:
parent
a76f4015c6
commit
27b7ae6eb8
@ -1,11 +1,47 @@
|
|||||||
|
from direct.directnotify import DirectNotifyGlobal
|
||||||
from DirectFrame import *
|
from DirectFrame import *
|
||||||
from DirectButton import *
|
from DirectButton import *
|
||||||
from direct.task import Task
|
from direct.task import Task
|
||||||
import types
|
import types
|
||||||
|
|
||||||
class DirectScrolledList(DirectFrame):
|
|
||||||
def __init__(self, parent = None, **kw):
|
|
||||||
|
|
||||||
|
class DirectScrolledListItem(DirectButton):
|
||||||
|
"""
|
||||||
|
While you are not required to use a DirectScrolledListItem for a
|
||||||
|
DirectScrolledList, doing so takes care of the highlighting and
|
||||||
|
unhighlighting of the list items.
|
||||||
|
"""
|
||||||
|
notify = DirectNotifyGlobal.directNotify.newCategory("DirectScrolledListItem")
|
||||||
|
|
||||||
|
def __init__(self, parent=None, **kw):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
|
self.parent = parent
|
||||||
|
if kw.has_key("command"):
|
||||||
|
self.nextCommand = kw.get("command")
|
||||||
|
del kw["command"]
|
||||||
|
if kw.has_key("extraArgs"):
|
||||||
|
self.nextCommnadExtraArgs = kw.get("extraArgs")
|
||||||
|
del kw["extraArgs"]
|
||||||
|
optiondefs = (
|
||||||
|
('parent', self.parent, None),
|
||||||
|
('command', self.select, None),
|
||||||
|
)
|
||||||
|
# Merge keyword options with default options
|
||||||
|
self.defineoptions(kw, optiondefs)
|
||||||
|
DirectButton.__init__(self)
|
||||||
|
self.initialiseoptions(DirectScrolledListItem)
|
||||||
|
|
||||||
|
def select(self):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
|
apply(self.nextCommand, self.nextCommnadExtraArgs)
|
||||||
|
self.parent.selectListItem(self)
|
||||||
|
|
||||||
|
|
||||||
|
class DirectScrolledList(DirectFrame):
|
||||||
|
notify = DirectNotifyGlobal.directNotify.newCategory("DirectScrolledList")
|
||||||
|
|
||||||
|
def __init__(self, parent = None, **kw):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
self.index = 0
|
self.index = 0
|
||||||
self.forceHeight = None
|
self.forceHeight = None
|
||||||
|
|
||||||
@ -70,38 +106,52 @@ class DirectScrolledList(DirectFrame):
|
|||||||
self.scrollTo(0)
|
self.scrollTo(0)
|
||||||
|
|
||||||
def setForceHeight(self):
|
def setForceHeight(self):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
self.forceHeight = self["forceHeight"]
|
self.forceHeight = self["forceHeight"]
|
||||||
|
|
||||||
def recordMaxHeight(self):
|
def recordMaxHeight(self):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
if self.forceHeight is not None:
|
if self.forceHeight is not None:
|
||||||
self.maxHeight = self.forceHeight
|
self.maxHeight = self.forceHeight
|
||||||
return
|
else:
|
||||||
|
self.maxHeight = 0.0
|
||||||
self.maxHeight = 0.0
|
for item in self["items"]:
|
||||||
for item in self["items"]:
|
if item.__class__.__name__ != 'str':
|
||||||
if item.__class__.__name__ != 'str':
|
self.maxHeight = max(self.maxHeight, item.getHeight())
|
||||||
self.maxHeight = max(self.maxHeight, item.getHeight())
|
|
||||||
return
|
|
||||||
|
|
||||||
def setScrollSpeed(self):
|
def setScrollSpeed(self):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
# Items per second to move
|
# Items per second to move
|
||||||
self.scrollSpeed = self["scrollSpeed"]
|
self.scrollSpeed = self["scrollSpeed"]
|
||||||
if self.scrollSpeed <= 0:
|
if self.scrollSpeed <= 0:
|
||||||
self.scrollSpeed = 1
|
self.scrollSpeed = 1
|
||||||
|
|
||||||
def setNumItemsVisible(self):
|
def setNumItemsVisible(self):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
# Items per second to move
|
# Items per second to move
|
||||||
self.numItemsVisible = self["numItemsVisible"]
|
self.numItemsVisible = self["numItemsVisible"]
|
||||||
|
|
||||||
def destroy(self):
|
def destroy(self):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
taskMgr.remove(self.taskName("scroll"))
|
taskMgr.remove(self.taskName("scroll"))
|
||||||
|
if hasattr(self, "currentSelected"):
|
||||||
|
del self.currentSelected
|
||||||
DirectFrame.destroy(self)
|
DirectFrame.destroy(self)
|
||||||
|
|
||||||
|
def selectListItem(self, item):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
|
if hasattr(self, "currentSelected"):
|
||||||
|
self.currentSelected['state']=NORMAL
|
||||||
|
item['state']=DISABLED
|
||||||
|
self.currentSelected=item
|
||||||
|
|
||||||
def scrollBy(self, delta):
|
def scrollBy(self, delta):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
# print "scrollBy[",delta,"]"
|
# print "scrollBy[",delta,"]"
|
||||||
return self.scrollTo(self.index + delta)
|
return self.scrollTo(self.index + delta)
|
||||||
|
|
||||||
def getItemIndexForItemID(self, itemID):
|
def getItemIndexForItemID(self, itemID):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
#for i in range(len(self["items"])):
|
#for i in range(len(self["items"])):
|
||||||
# print "buttontext[",i,"]",self["items"][i]["text"]
|
# print "buttontext[",i,"]",self["items"][i]["text"]
|
||||||
|
|
||||||
@ -119,10 +169,12 @@ class DirectScrolledList(DirectFrame):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
def scrollToItemID(self, itemID, centered=0):
|
def scrollToItemID(self, itemID, centered=0):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
self.scrollTo(self.getItemIndexForItemID(itemID), centered)
|
self.scrollTo(self.getItemIndexForItemID(itemID), centered)
|
||||||
|
|
||||||
""" scrolls list so selected index is at top, or centered in box"""
|
|
||||||
def scrollTo(self, index, centered=0):
|
def scrollTo(self, index, centered=0):
|
||||||
|
""" scrolls list so selected index is at top, or centered in box"""
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
# print "scrollTo[",index,"] called, len(self[items])=",len(self["items"])," self[numItemsVisible]=",self["numItemsVisible"]
|
# print "scrollTo[",index,"] called, len(self[items])=",len(self["items"])," self[numItemsVisible]=",self["numItemsVisible"]
|
||||||
|
|
||||||
numItemsVisible=self["numItemsVisible"]
|
numItemsVisible=self["numItemsVisible"]
|
||||||
@ -192,6 +244,7 @@ class DirectScrolledList(DirectFrame):
|
|||||||
return ret
|
return ret
|
||||||
|
|
||||||
def makeAllItems(self):
|
def makeAllItems(self):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
for i in range(len(self['items'])):
|
for i in range(len(self['items'])):
|
||||||
item = self["items"][i]
|
item = self["items"][i]
|
||||||
# If the item is a 'str', then it has not been created
|
# If the item is a 'str', then it has not been created
|
||||||
@ -210,6 +263,7 @@ class DirectScrolledList(DirectFrame):
|
|||||||
self.recordMaxHeight()
|
self.recordMaxHeight()
|
||||||
|
|
||||||
def __scrollByTask(self, task):
|
def __scrollByTask(self, task):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
if ((task.time - task.prevTime) < task.delayTime):
|
if ((task.time - task.prevTime) < task.delayTime):
|
||||||
return Task.cont
|
return Task.cont
|
||||||
else:
|
else:
|
||||||
@ -221,6 +275,7 @@ class DirectScrolledList(DirectFrame):
|
|||||||
return Task.done
|
return Task.done
|
||||||
|
|
||||||
def __incButtonDown(self, event):
|
def __incButtonDown(self, event):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
task = Task.Task(self.__scrollByTask)
|
task = Task.Task(self.__scrollByTask)
|
||||||
task.delayTime = (1.0 / self.scrollSpeed)
|
task.delayTime = (1.0 / self.scrollSpeed)
|
||||||
task.prevTime = 0.0
|
task.prevTime = 0.0
|
||||||
@ -230,6 +285,7 @@ class DirectScrolledList(DirectFrame):
|
|||||||
|
|
||||||
|
|
||||||
def __decButtonDown(self, event):
|
def __decButtonDown(self, event):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
task = Task.Task(self.__scrollByTask)
|
task = Task.Task(self.__scrollByTask)
|
||||||
task.delayTime = (1.0 / self.scrollSpeed)
|
task.delayTime = (1.0 / self.scrollSpeed)
|
||||||
task.prevTime = 0.0
|
task.prevTime = 0.0
|
||||||
@ -238,12 +294,14 @@ class DirectScrolledList(DirectFrame):
|
|||||||
taskMgr.add(task, self.taskName("scroll"))
|
taskMgr.add(task, self.taskName("scroll"))
|
||||||
|
|
||||||
def __buttonUp(self, event):
|
def __buttonUp(self, event):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
taskMgr.remove(self.taskName("scroll"))
|
taskMgr.remove(self.taskName("scroll"))
|
||||||
|
|
||||||
def addItem(self, item, refresh=1):
|
def addItem(self, item, refresh=1):
|
||||||
"""
|
"""
|
||||||
Add this string and extraArg to the list
|
Add this string and extraArg to the list
|
||||||
"""
|
"""
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
if(type(item) == types.InstanceType):
|
if(type(item) == types.InstanceType):
|
||||||
# cant add attribs to non-classes (like strings & ints)
|
# cant add attribs to non-classes (like strings & ints)
|
||||||
item.itemID = self.nextItemID
|
item.itemID = self.nextItemID
|
||||||
@ -261,10 +319,13 @@ class DirectScrolledList(DirectFrame):
|
|||||||
"""
|
"""
|
||||||
Remove this item from the panel
|
Remove this item from the panel
|
||||||
"""
|
"""
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
#print "remove item called", item
|
#print "remove item called", item
|
||||||
#print "items list", self['items']
|
#print "items list", self['items']
|
||||||
if item in self["items"]:
|
if item in self["items"]:
|
||||||
#print "removing item", item
|
#print "removing item", item
|
||||||
|
if hasattr(self, "currentSelected") and self.currentSelected is item:
|
||||||
|
del self.currentSelected
|
||||||
self["items"].remove(item)
|
self["items"].remove(item)
|
||||||
if type(item) != type(''):
|
if type(item) != type(''):
|
||||||
item.reparentTo(hidden)
|
item.reparentTo(hidden)
|
||||||
@ -278,14 +339,17 @@ class DirectScrolledList(DirectFrame):
|
|||||||
Update the list - useful when adding or deleting items
|
Update the list - useful when adding or deleting items
|
||||||
or changing properties that would affect the scrolling
|
or changing properties that would affect the scrolling
|
||||||
"""
|
"""
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
self.recordMaxHeight()
|
self.recordMaxHeight()
|
||||||
#print "refresh called"
|
#print "refresh called"
|
||||||
self.scrollTo(self.index)
|
self.scrollTo(self.index)
|
||||||
|
|
||||||
def getSelectedIndex(self):
|
def getSelectedIndex(self):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
return self.index
|
return self.index
|
||||||
|
|
||||||
def getSelectedText(self):
|
def getSelectedText(self):
|
||||||
|
assert self.notify.debugStateCall(self)
|
||||||
return self['items'][self.index]['text']
|
return self['items'][self.index]['text']
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user