RANDOM USER PROJECTS
Student Recreation of "Colossus"
Disney Pinball: real physics and cool settings
Plith, a fast-paced puzzle game

Panda3D Manual: DirectScrolledList

DirectScrolledLists create a list of DirectGuiWidgets. Each object is created individually and can then be added to the list. Some useful methods are:

addItem(item, refresh)
getItemIndexForItemID(self, itemID)
getSelectedIndex(self) 
getSelectedText(self)
removeItem(self, item, refresh)
scrollBy(self, delta)  
scrollTo(self, index, centered) 
scrollToItemID(self, itemID, centered)  
selectListItem(self, item)

In the above methods, item is a new item, either a string or a DirectGUI element, and itemID is an arbitrary identification number for each item (but not necessarily a zero-based index number). The itemID for a new item is the return value of addItem(). The centered parameter is a boolean; if true, the list scrolls so that the given index is centered, otherwise it scrolls so that the index is on top of the list.

The items option should either be a list of DirectGUI items or of strings. If strings are used, the itemMakeFunction (and possibly itemMakeExtraArgs) option should be defined to point to a function that will take the supplied string, the index, and the extra args as parameters and return a DirectGUI object to insert into the list. If items is a list of strings and itemMakeFunction is not specified, it will create a list of DirectLabels. itemMakeFunction is redundant if a list of DirectGUI objects is passed into items to begin with.

DirectScrolledLists come with two scroll buttons for navigating through the list. By default, they both start at (0,0,0) relative to the list with size 0, and their positions and size need to be set explicitly. You can set any of the values except relief appearance as you initialize the list:

myScrolledList = DirectScrolledList(incButton_propertyName = value,
decButton_propertyName = value)

incButton scrolls forward through the list; decButton backward. Note that this only works for initialization. To change a property of the scroll buttons later in the program, you must use:

myScrolledList.incButton['propertyName'] = value
myScrolledList.decButton['propertyName'] = value

Unlike the first method, this does not work with NodePath options like position; use setPos(...) for that.

For example, the following creates a scrolled list and resizes and moves the buttons appropriately.

myScrolledList = DirectScrolledList(
   incButton_pos= (.5,0,0), incButton_text = "Inc",
   decButton_pos= (-.5,0,0), decButton_text = "Dec")
myScrolledList.incButton['frameSize'] = (0, 0.2, 0, 0.2)
myScrolledList.decButton['frameSize'] = (0, 0.2, 0, 0.2)
myScrolledList.incButton['text_scale'] = .2
myScrolledList.decButton['text_scale'] = .2
Keyword Definition Value
command Function called when the list is scrolled Function
extraArgs Extra arguments to the function specified in command [Extra Arguments]
text_scale Scale of the displayed text (sx,sz)
items List of the objects to appear in the ScrolledList [DirectGUI items] or [Strings]
numItemsVisible Number of items visible at a time Number
forceHeight Forces the height of the list to be a given number Number
itemMakeFunction Function that makes DirectGUI items out of strings Function
itemMakeExtraArgs Extra arguments to the function in itemMakeFunction [Extra Arguments]


A small example on how to use it:

from direct.directbase import DirectStart
from direct.gui.DirectGui import *
from panda3d.core import *
 
b1 = DirectButton(text = ("Button1", "click!", "roll", "disabled"),
                  text_scale=0.1, borderWidth = (0.01, 0.01),
                  relief=2)
 
b2 = DirectButton(text = ("Button2", "click!", "roll", "disabled"),
                  text_scale=0.1, borderWidth = (0.01, 0.01),
                  relief=2)
 
l1 = DirectLabel(text = "Test1", text_scale=0.1)
l2 = DirectLabel(text = "Test2", text_scale=0.1)
l3 = DirectLabel(text = "Test3", text_scale=0.1)
 
numItemsVisible = 4
itemHeight = 0.11
 
myScrolledList = DirectScrolledList(
    decButton_pos= (0.35, 0, 0.53),
    decButton_text = "Dec",
    decButton_text_scale = 0.04,
    decButton_borderWidth = (0.005, 0.005),
 
    incButton_pos= (0.35, 0, -0.02),
    incButton_text = "Inc",
    incButton_text_scale = 0.04,
    incButton_borderWidth = (0.005, 0.005),
 
    frameSize = (0.0, 0.7, -0.05, 0.59),
    frameColor = (1,0,0,0.5),
    pos = (-1, 0, 0),
    items = [b1, b2],
    numItemsVisible = numItemsVisible,
    forceHeight = itemHeight,
    itemFrame_frameSize = (-0.2, 0.2, -0.37, 0.11),
    itemFrame_pos = (0.35, 0, 0.4),
    )
 
myScrolledList.addItem(l1)
myScrolledList.addItem(l2)
myScrolledList.addItem(l3)
 
for fruit in ['apple', 'pear', 'banana', 'orange']:
    l = DirectLabel(text = fruit, text_scale=0.1)
    myScrolledList.addItem(l) 
 
 
run()