On 08/09/12 22:18, margrave wrote:
I am displaying a tree, and I need to show which item is selected.

Of course the simplistic solution is to

item.addStyleName("itemhighlighted") in the onTreeItemSelected(self., item):

And that works fine until another item is selected. Then both are highlighted.

Hi, Michael!

Here is my test I used to try pyjs Tree, may be it will help.

Seva

--



# -*- coding: utf-8 -*-

import pyjd # this is dummy in pyjs.
from pyjamas.ui.Tree import Tree
from pyjamas.ui.TreeItem import TreeItem
from pyjamas.ui.CheckBox import CheckBox
from pyjamas.ui.RootPanel import RootPanel
from pyjamas.Timer import Timer


def setStyle( item, selected ):
    item.setStyleName(item.itemTable, "gwt-TreeItemTable-selected", selected)
    #print 'style for', item.getUserObject(), selected

def updateStyles( selectedItem ):
    def updateItem( root ):
        setStyle(root, root is selectedItem)
        if not root.getState(): return  # omit children for closed item
        for idx in range(root.getChildCount()):
            item = root.getChild(idx)
            updateItem(item)
    tree = selectedItem.getTree()
    for idx in range(tree.getItemCount()):
        root = tree.getItem(idx)
        updateItem(root)
            

def closeAllExcept( root ):
    parent = root.getParentItem()
    #print 'closing', root.getUserObject(), root, parent
    if parent:
        for idx in range(parent.getChildCount()):
            item = parent.getChild(idx)
            if item is not root:
                item.setState(False)
        closeAllExcept(parent)
    else:  # root items
        tree = root.getTree()
        for idx in range(tree.getItemCount()):
            item = tree.getItem(idx)
            if item is not root:
                item.setState(False)

        
class Listener:

    def onTreeItemSelected(self, item):
        p = item.getUserObject()
        print 'onTreeItemSelected', p, `item.getHTML()`, `item.getText()`
        item.setState(True)  # open on select
        closeAllExcept(item)
        updateStyles(item)

    def onTreeItemStateChanged( self, item ):
        p = item.getUserObject()
        print 'onTreeItemStateChanged', p, item.getState(), `item.getHTML()`, `item.getText()`
        selected = item.getTree().getSelectedItem()
        if selected:
            updateStyles(selected)


def makeItems( parent, prefix, count, dept ):
    if not dept: return
    for i in range(count):
        name = '%s%d' % (prefix, i)
        item = TreeItem(name)
        item.setUserObject(name)
        parent.addItem(item)
        makeItems(item, name + '-', count, dept - 1)

def main():
    pyjd.setup("public/index.html")
    root = RootPanel()
    tree = Tree()
    makeItems(tree, '', 3, 3)
    root.add(tree)
    tree.addTreeListener(Listener())
    tree.setParent(None)
    tree.setParent(root)
    pyjd.run()

if __name__ == '__main__':
    main()

Reply via email to