|
@@ -8,11 +8,11 @@ class DirectScrolledList(DirectFrame):
|
|
|
self.index = 0
|
|
self.index = 0
|
|
|
self.forceHeight = None
|
|
self.forceHeight = None
|
|
|
|
|
|
|
|
- # If one were to want a scrolledList that makes and adds its items
|
|
|
|
|
- # as needed, simply pass in an items list of strings (type 'str')
|
|
|
|
|
- # and when that item is needed, itemMakeFunction will be called
|
|
|
|
|
- # with the text, the index, and itemMakeExtraArgs. If itemMakeFunction
|
|
|
|
|
- # is not specified, it will create a DirectFrame with the text.
|
|
|
|
|
|
|
+ """ If one were to want a scrolledList that makes and adds its items
|
|
|
|
|
+ as needed, simply pass in an items list of strings (type 'str')
|
|
|
|
|
+ and when that item is needed, itemMakeFunction will be called
|
|
|
|
|
+ with the text, the index, and itemMakeExtraArgs. If itemMakeFunction
|
|
|
|
|
+ is not specified, it will create a DirectFrame with the text."""
|
|
|
|
|
|
|
|
# if 'items' is a list of strings, make a copy for our use
|
|
# if 'items' is a list of strings, make a copy for our use
|
|
|
# so we can modify it without mangling the user's list
|
|
# so we can modify it without mangling the user's list
|
|
@@ -24,6 +24,8 @@ class DirectScrolledList(DirectFrame):
|
|
|
# we get here if every item in 'items' is a string
|
|
# we get here if every item in 'items' is a string
|
|
|
# make a copy
|
|
# make a copy
|
|
|
kw['items'] = kw['items'][:]
|
|
kw['items'] = kw['items'][:]
|
|
|
|
|
+
|
|
|
|
|
+ self.nextItemID = 10
|
|
|
|
|
|
|
|
# Inherits from DirectFrame
|
|
# Inherits from DirectFrame
|
|
|
optiondefs = (
|
|
optiondefs = (
|
|
@@ -95,14 +97,36 @@ class DirectScrolledList(DirectFrame):
|
|
|
DirectFrame.destroy(self)
|
|
DirectFrame.destroy(self)
|
|
|
|
|
|
|
|
def scrollBy(self, delta):
|
|
def scrollBy(self, delta):
|
|
|
|
|
+ # print "scrollBy[",delta,"]"
|
|
|
return self.scrollTo(self.index + delta)
|
|
return self.scrollTo(self.index + delta)
|
|
|
|
|
|
|
|
- def scrollTo(self, index):
|
|
|
|
|
- self.index = index
|
|
|
|
|
|
|
+ def getItemIndexForItemID(self, itemID):
|
|
|
|
|
+ #for i in range(len(self["items"])):
|
|
|
|
|
+ # print "buttontext[",i,"]",self["items"][i]["text"]
|
|
|
|
|
+
|
|
|
|
|
+ for i in range(len(self["items"])):
|
|
|
|
|
+ if(self["items"][i].itemID == itemID):
|
|
|
|
|
+ return i
|
|
|
|
|
+ print "warning: getItemIndexForItemID: item not found!"
|
|
|
|
|
+ return 0
|
|
|
|
|
+
|
|
|
|
|
+ def scrollToItemID(self, itemID, centered=0):
|
|
|
|
|
+ self.scrollTo(self.getItemIndexForItemID(itemID), centered)
|
|
|
|
|
+
|
|
|
|
|
+ """ scrolls list so selected index is at top, or centered in box"""
|
|
|
|
|
+ def scrollTo(self, index, centered=0):
|
|
|
|
|
+ # print "scrollTo[",index,"] called, len(self[items])=",len(self["items"])," self[numItemsVisible]=",self["numItemsVisible"]
|
|
|
|
|
+
|
|
|
|
|
+ numItemsVisible=self["numItemsVisible"]
|
|
|
|
|
+ numItemsTotal = len(self["items"])
|
|
|
|
|
+ if(centered):
|
|
|
|
|
+ self.index = index - (numItemsVisible/2)
|
|
|
|
|
+ else:
|
|
|
|
|
+ self.index = index
|
|
|
|
|
|
|
|
# Not enough items to even worry about scrolling,
|
|
# Not enough items to even worry about scrolling,
|
|
|
# just disable the buttons and do nothing
|
|
# just disable the buttons and do nothing
|
|
|
- if (len(self["items"]) <= self["numItemsVisible"]):
|
|
|
|
|
|
|
+ if (len(self["items"]) <= numItemsVisible):
|
|
|
self.incButton['state'] = DISABLED
|
|
self.incButton['state'] = DISABLED
|
|
|
self.decButton['state'] = DISABLED
|
|
self.decButton['state'] = DISABLED
|
|
|
# Hmm.. just reset self.index to 0 and bail out
|
|
# Hmm.. just reset self.index to 0 and bail out
|
|
@@ -114,8 +138,9 @@ class DirectScrolledList(DirectFrame):
|
|
|
self.decButton['state'] = DISABLED
|
|
self.decButton['state'] = DISABLED
|
|
|
self.incButton['state'] = NORMAL
|
|
self.incButton['state'] = NORMAL
|
|
|
ret = 0
|
|
ret = 0
|
|
|
- elif (self.index >= ( len(self["items"]) - self["numItemsVisible"])):
|
|
|
|
|
- self.index = len(self["items"]) - self["numItemsVisible"]
|
|
|
|
|
|
|
+ elif (self.index >= (numItemsTotal - numItemsVisible)):
|
|
|
|
|
+ self.index = numItemsTotal - numItemsVisible
|
|
|
|
|
+ # print "at list end, ",len(self["items"])," ",self["numItemsVisible"]
|
|
|
self.incButton['state'] = DISABLED
|
|
self.incButton['state'] = DISABLED
|
|
|
self.decButton['state'] = NORMAL
|
|
self.decButton['state'] = NORMAL
|
|
|
ret = 0
|
|
ret = 0
|
|
@@ -124,15 +149,18 @@ class DirectScrolledList(DirectFrame):
|
|
|
self.decButton['state'] = NORMAL
|
|
self.decButton['state'] = NORMAL
|
|
|
ret = 1
|
|
ret = 1
|
|
|
|
|
|
|
|
|
|
+ # print "self.index set to ",self.index
|
|
|
|
|
+
|
|
|
# Hide them all
|
|
# Hide them all
|
|
|
for item in self["items"]:
|
|
for item in self["items"]:
|
|
|
if item.__class__.__name__ != 'str':
|
|
if item.__class__.__name__ != 'str':
|
|
|
item.hide()
|
|
item.hide()
|
|
|
|
|
|
|
|
# Then show the ones in range, and stack their positions
|
|
# Then show the ones in range, and stack their positions
|
|
|
- upperRange = min(len(self["items"]), self["numItemsVisible"])
|
|
|
|
|
|
|
+ upperRange = min(numItemsTotal, numItemsVisible)
|
|
|
for i in range(self.index, self.index + upperRange):
|
|
for i in range(self.index, self.index + upperRange):
|
|
|
item = self["items"][i]
|
|
item = self["items"][i]
|
|
|
|
|
+ #print "stacking buttontext[",i,"]",self["items"][i]["text"]
|
|
|
# If the item is a 'str', then it has not been created (scrolled list is 'as needed')
|
|
# If the item is a 'str', then it has not been created (scrolled list is 'as needed')
|
|
|
# Therefore, use the the function given to make it or just make it a frame
|
|
# Therefore, use the the function given to make it or just make it a frame
|
|
|
if item.__class__.__name__ == 'str':
|
|
if item.__class__.__name__ == 'str':
|
|
@@ -141,13 +169,14 @@ class DirectScrolledList(DirectFrame):
|
|
|
item = apply(self['itemMakeFunction'], (item, i, self['itemMakeExtraArgs']))
|
|
item = apply(self['itemMakeFunction'], (item, i, self['itemMakeExtraArgs']))
|
|
|
else:
|
|
else:
|
|
|
item = DirectFrame(text = item, relief = None)
|
|
item = DirectFrame(text = item, relief = None)
|
|
|
|
|
+ #print "str stacking buttontext[",i,"]",self["items"][i]["text"]
|
|
|
# Then add the newly formed item back into the normal item list
|
|
# Then add the newly formed item back into the normal item list
|
|
|
self["items"][i] = item
|
|
self["items"][i] = item
|
|
|
item.reparentTo(self.itemFrame)
|
|
item.reparentTo(self.itemFrame)
|
|
|
self.recordMaxHeight()
|
|
self.recordMaxHeight()
|
|
|
|
|
|
|
|
item.show()
|
|
item.show()
|
|
|
- item.setPos(0,0, - (i - self.index) * self.maxHeight)
|
|
|
|
|
|
|
+ item.setPos(0,0, -(i-self.index) * self.maxHeight)
|
|
|
|
|
|
|
|
if self['command']:
|
|
if self['command']:
|
|
|
# Pass any extra args to command
|
|
# Pass any extra args to command
|
|
@@ -189,18 +218,23 @@ class DirectScrolledList(DirectFrame):
|
|
|
"""
|
|
"""
|
|
|
Add this string and extraArg to the list
|
|
Add this string and extraArg to the list
|
|
|
"""
|
|
"""
|
|
|
|
|
+ item.itemID = self.nextItemID
|
|
|
|
|
+ self.nextItemID += 1
|
|
|
self['items'].append(item)
|
|
self['items'].append(item)
|
|
|
if type(item) != type(''):
|
|
if type(item) != type(''):
|
|
|
item.reparentTo(self.itemFrame)
|
|
item.reparentTo(self.itemFrame)
|
|
|
if refresh:
|
|
if refresh:
|
|
|
self.refresh()
|
|
self.refresh()
|
|
|
-
|
|
|
|
|
|
|
+ return item.itemID # to pass to scrollToItemID
|
|
|
|
|
|
|
|
def removeItem(self, item, refresh=1):
|
|
def removeItem(self, item, refresh=1):
|
|
|
"""
|
|
"""
|
|
|
Remove this item from the panel
|
|
Remove this item from the panel
|
|
|
"""
|
|
"""
|
|
|
|
|
+ #print "remove item called", item
|
|
|
|
|
+ #print "items list", self['items']
|
|
|
if item in self["items"]:
|
|
if item in self["items"]:
|
|
|
|
|
+ #print "removing item", item
|
|
|
self["items"].remove(item)
|
|
self["items"].remove(item)
|
|
|
if type(item) != type(''):
|
|
if type(item) != type(''):
|
|
|
item.reparentTo(hidden)
|
|
item.reparentTo(hidden)
|
|
@@ -215,6 +249,7 @@ class DirectScrolledList(DirectFrame):
|
|
|
or changing properties that would effect the scrolling
|
|
or changing properties that would effect the scrolling
|
|
|
"""
|
|
"""
|
|
|
self.recordMaxHeight()
|
|
self.recordMaxHeight()
|
|
|
|
|
+ #print "refresh called"
|
|
|
self.scrollTo(self.index)
|
|
self.scrollTo(self.index)
|
|
|
|
|
|
|
|
def getSelectedIndex(self):
|
|
def getSelectedIndex(self):
|