hi Alessandro Dentella ,

Sorry for the pain.Now i am two py files one is ex.py and other is
gridset.py.In ex.py i am using gridset.py which is a module for treeview
with easy navigation.And in ex.py i am facing the above mentioned issues.

On Tue, Sep 29, 2009 at 1:13 PM, Alessandro Dentella <[email protected]>wrote:

> > I am attaching the py file in which i used the module in the above url.
>
> that's a long listing. Can you reproduce the problem in a simple example?
> To run your example you need at least 3 modules that are not provided
> (report,
> gnukhata_global, and gridset)
>
> sandro
> *:-)
>
"""
  This file is part of GNUKhata:A modular,robust and Free Accounting System.

  GNUKhata is Free Software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as
  published by the Free Software Foundation; either version 3 of
  the License, or (at your option) any later version.

  GNUKhata is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public
  License along with GNUKhata (COPYING); if not, write to the
  Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  Boston, MA  02110-1301  USA59 Temple Place, Suite 330,


Contributor: "Anusha Kadambala"<[email protected]>"""

import pygtk
pygtk.require('2.0')
import os
import sys
import gtk,gobject
import gtk.glade,gnome,gnome.ui,datetime,time
import gridset
class purchase:
	def __init__(self):
		self.window = gtk.Window (gtk.WINDOW_TOPLEVEL)
		self.scrolledwindow_treeview = gtk.ScrolledWindow()
		self.window.add(self.scrolledwindow_treeview)
		self.window.connect("destroy", self.destroy)
		self.scrolledwindow_treeview.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
		self.taxnames = ['vat','cst']
		self.billList = gtk.ListStore(*(([gobject.TYPE_STRING] * 7)+([gobject.TYPE_BOOLEAN] * 2)+([gobject.TYPE_STRING] * 2)+([gobject.TYPE_BOOLEAN]*len(self.taxnames))+([gobject.TYPE_STRING] * 2)))

		lst=['', '','','','','','',False,False,'','']
		for r in self.taxnames:
			lst.append(False)
		lst.append('')
		lst.append('')

		self.treeview_bill = gridset.Grid(self.billList)
		for i in range(10):
			iter = self.billList.append(tuple(lst))
		self.scrolledwindow_treeview.add(self.treeview_bill)
		self.scrolledwindow_treeview.show_all()
		self.editors = []
		
		column_labels=["Product code","Product name","Manufacturer/Publisher","Stock quantity","Quantity","Price/Product","Amount","Discount percentage/product","Flat discount","Discounted Amount","Total discount amount"]
		
		for i in range(0,7):
			renderer = gtk.CellRendererText()
			column = gtk.TreeViewColumn(column_labels[i], renderer, text=i)
			column.set_resizable(True)
			self.treeview_bill.append_column(column)
			self.editors.append(gridset.GridCellEditorText(self.treeview_bill, i))

		renderer = gtk.CellRendererToggle()
			
		#renderer.connect("toggled",self.discountpercentChanged,self.billList,6)
		column = gtk.TreeViewColumn(column_labels[7], renderer, active=7)
		column.set_resizable(True)
		self.treeview_bill.append_column(column)
		self.editors.append(gridset.GridCellEditorToggle(self.treeview_bill, 7))

		renderer = gtk.CellRendererToggle()
		#renderer.connect("toggled",self.flatdiscountChanged,self.billList,7)
		column = gtk.TreeViewColumn(column_labels[8], renderer, active=8)
		column.set_resizable(True)
		self.treeview_bill.append_column(column)
		self.editors.append(gridset.GridCellEditorToggle(self.treeview_bill, 8))


		renderer = gtk.CellRendererText()
		column = gtk.TreeViewColumn(column_labels[9], renderer, text=9)
		column.set_resizable(True)
		self.treeview_bill.append_column(column)
		self.editors.append(gridset.GridCellEditorText(self.treeview_bill, 9))

		renderer = gtk.CellRendererText()
		column = gtk.TreeViewColumn(column_labels[10], renderer, text=10)
		column.set_resizable(True)
		self.treeview_bill.append_column(column)
		self.editors.append(gridset.GridCellEditorText(self.treeview_bill, 10))

		for r in range(0,len(self.taxnames)):
			renderer = gtk.CellRendererToggle()
			column = gtk.TreeViewColumn(self.taxnames[r][0], renderer, active=11+r)
			column.set_resizable(True)
			self.treeview_bill.append_column(column)
			self.editors.append(gridset.GridCellEditorToggle(self.treeview_bill,11+r))

		
		renderer = gtk.CellRendererText()
		column = gtk.TreeViewColumn("Total Taxed amount", renderer, text=len(column_labels)+len(self.taxnames)+0)
		column.set_resizable(True)
		self.treeview_bill.append_column(column)
		self.editors.append(gridset.GridCellEditorText(self.treeview_bill, len(column_labels)+len(self.taxnames)+0))

		renderer = gtk.CellRendererText()
		column = gtk.TreeViewColumn("Total amount", renderer, text=len(column_labels)+len(self.taxnames)+1)
		column.set_resizable(True)
		self.treeview_bill.append_column(column)
		self.editors.append(gridset.GridCellEditorText(self.treeview_bill, len(column_labels)+len(self.taxnames)+1))
		
		self.treeview_bill.setEditors(self.editors)

		
		self.editors[0].connect("focus-out-event",self.prodcode_lostfocus)
		self.window.resize(500,200)
		self.window.show()

	def prodcode_lostfocus(self,widget,event):
		
		
		result = ['c1','p1',10.00,100,'anusha']
		self.editors[1].setValue(result[1])
		self.editors[2].setValue(result[4])
		print result
		print self.editors[2].getValue()
		print self.editors[3].getValue()
		print self.editors[5].getValue()

	def destroy(self, widget, data=None):
		gtk.main_quit()


if __name__ == '__main__':
	p=purchase()
	gtk.main()
import pygtk
pygtk.require('2.0')
import gtk
import gobject
import pango

class GridCellEditor(gtk.Window):
    def __init__(self, grid, columnIndex):
        gtk.Window.__init__(self)
        self.grid = grid
        self.columnIndex = columnIndex
        self.set_decorated(False)
        self.editor = self.createEditor()
        self.add(self.editor)
        self.editor.grab_focus()
        self.path = None
        self.connect('delete-event', self.deleteEvent)

    def applyChanges(self):
        iter = self.grid.model.get_iter(self.path)
        self.grid.model.set_value(iter, self.columnIndex, self.getValue())
    
    def createEditor(self):
        raise 'this is an abstract method'

    def deleteEvent(self, widget, event, data=None):
        self.grid.get_toplevel().destroy()

    def focusOutEvent(self, widget, data=None):
        self.hide()
        
    def getValue(self):
        raise 'this is an abstract method'

    def keyPressEvent(self, widget, event, data=None):
        if event.keyval in [gtk.keysyms.Tab, gtk.keysyms.Down, gtk.keysyms.Up,
                            gtk.keysyms.Page_Down, gtk.keysyms.Page_Up]:
            self.applyChanges()
            self.grid.keyPressCallback(widget, event)
            return True
        return False
    
    def setValue(self, value):
        raise 'this is an abstract method'
    
    def setEditable(self,value):
        raise 'this is an abstract method'

    def grabFocus(self):
        raise 'this is an abstract method'

    def setVisibility(self,value):
	raise 'this is an abstract method'
    def show(self, x, y, w, h, path):
        self.set_transient_for(self.grid.get_toplevel())
        self.set_destroy_with_parent(True)
	self.set_skip_taskbar_hint(True)
        self.path = path
        iter = self.grid.model.get_iter(self.path)
        value = self.grid.model.get_value(iter, self.columnIndex)
        self.setValue(value)
        self.set_size_request(w, h)
        self.resize(w, h)
        self.show_all()
        self.present()
        self.move(x, y)

    #def buttonchanged(self,widget,data=None):
    #print 'anusja'
   
class GridCellEditorText(GridCellEditor):
    def __init__(self, grid, columnIndex):
        GridCellEditor.__init__(self, grid, columnIndex)

    def createEditor(self):
        editor = gtk.Entry()
        editor.set_has_frame(False)
        editor.connect('key-press-event', self.keyPressEvent)
        editor.connect('focus-out-event', self.focusOutEvent)
        return editor

    def getValue(self):
        return self.editor.get_text()
    
    def setValue(self, value):
        if value == None:
            value = ''
        self.editor.set_text(value)

    def setEditable(self,active=True):
	self.editor.set_editable(active)

    def grabFocus(self):
	self.editor.grab_focus()

    def setVisibity(self,active=True):
	self.editor.set_visibility(active)

class GridCellEditorToggle(GridCellEditor):
    def __init__(self, grid, columnIndex):
        GridCellEditor.__init__(self, grid, columnIndex)

    def createEditor(self):
        editor = gtk.Alignment(xalign=0.5, yalign=0.5)
        button = gtk.CheckButton()
        button.connect('key-press-event', self.keyPressEvent)
        button.connect('focus-out-event', self.focusOutEvent)
	#button.connect('toggled', self.buttonchanged)
        button.show()
        editor.add(button)
        return editor

    def getValue(self):
        return self.editor.get_child().get_active()

    def setValue(self, value):
        self.editor.get_child().set_active(value)

    

class GridCellEditorCombo(GridCellEditor):
    def __init__(self, grid, columnIndex, values):
        self.values = values
        GridCellEditor.__init__(self, grid, columnIndex)

    def buttonPressEvent(self, widget, data=None):
        self.listOpened = True
    
    def createEditor(self):
        combo = gtk.Combo()
        combo.set_popdown_strings(self.values)
        combo.set_use_arrows(False)
        combo.entry.connect('key-press-event', self.keyPressEvent)
        combo.entry.connect('focus-out-event', self.focusOutEvent)
        button = combo.get_children()[-1]
        button.connect('pressed', self.buttonPressEvent)
        self.listOpened = False
        combo.show()
        return combo

    def focusOutEvent(self, widget, data=None):
        if not self.listOpened:
            self.hide()

    def keyPressEvent(self, widget, event, data=None):
        self.listOpened = False
        return GridCellEditor.keyPressEvent(self, widget, event, data)
        
    def getValue(self):
        return self.editor.entry.get_text()
    
    def setValue(self, value):
        self.editor.entry.set_text(value)

class Grid(gtk.TreeView):
    def __init__(self, model):
        gtk.TreeView.__init__(self, model)

        self.model = model

        self.connect('key-press-event', self.keyPressCallback)
        self.connect('button-release-event', self.buttonReleaseCallback)

        self.set_rules_hint(True)

    def cursorChangedCallback(self, widget, data=None):
        path, column = self.get_cursor()
        if path != None and column != None:
            self.updateEditor(path, column)

    def buttonReleaseCallback(self, widget, event, data=None):
        if event.button == 1:
            path, column, x, y = self.get_path_at_pos(int(event.x),int(event.y))
            self.setCursor(path, column)
    
    def keyPressCallback(self, widget, event, data=None):
        if event.keyval == gtk.keysyms.Tab:
            self.onKeyTab(event)
        elif event.keyval == gtk.keysyms.Down:
            self.onKeyDown(event)
        elif event.keyval == gtk.keysyms.Up:
            self.onKeyUp(event)
        elif event.keyval == gtk.keysyms.Page_Down:
            self.onKeyPageDown(event)
        elif event.keyval == gtk.keysyms.Page_Up:
            self.onKeyPageUp(event)
        elif event.keyval == gtk.keysyms.Return:
            self.cursorChangedCallback(None, None)

        return True

    def onKeyDown(self, event):
        path, column = self.get_cursor()
        self.moveCursorToNextRow(path, column)

    def onKeyPageDown(self, event):
        path, column = self.get_cursor()
        self.moveCursorToNextPage(path, column)

    def onKeyPageUp(self, event):
        path, column = self.get_cursor()
        self.moveCursorToPrevPage(path, column)
    
    def onKeyUp(self, event):
        path, column = self.get_cursor()
        self.moveCursorToPrevRow(path, column)
        
    def onKeyTab(self, event):
        path, column = self.get_cursor()
        if event.state == gtk.gdk.SHIFT_MASK:
            self.moveCursorToPrevCell(path, column)
        else:
            self.moveCursorToNextCell(path, column)

    def setCursor(self, path, column):
        self.set_cursor(path, column)
        self.updateEditor(path, column)
        
    def updateEditor(self, path, column):
        cell_area = self.get_cell_area(path, column)
        bin = self.get_bin_window()
        x_bin, y_bin = bin.get_origin()
        columns = self.get_columns()
        index = columns.index(column)
        if self.editors[index] != None:
            self.editors[index].show(x_bin + cell_area.x,
                                     y_bin + cell_area.y,
                                     cell_area.width,
                                     cell_area.height,
                                     path)
        
    def moveCursorToNextCell(self, path, column):
        columns = self.get_columns()
        index = columns.index(column) + 1
        if index == len(columns):
            index = 0                
            path = (path[0]+1,)
            try:
                self.model.get_iter(path)
            except:
                return
            
        column = columns[index]
        self.setCursor(path, column)
        
    def moveCursorToNextPage(self, path, column):
        rowHeight = column.cell_get_size()[4]
        gridHeight = self.allocation[3] - rowHeight
        visibleRows = gridHeight / rowHeight
        valid = 0
        path = (path[0]+visibleRows,)
        while not valid:
            try:
                self.model.get_iter(path)
                valid = 1
            except:
                path = (path[0]-1,)

        self.setCursor(path, column)

    def moveCursorToNextRow(self, path, column):
        path = (path[0]+1,)
        try:
            self.model.get_iter(path)
        except:
            path = (path[0]-1,)
        self.setCursor(path, column)
    
    def moveCursorToPrevCell(self, path, column):
        columns = self.get_columns()
        index = columns.index(column) - 1
        if index == -1:
            index = len(columns) - 1
            if path[0] == 0:
                self.get_toplevel().child_focus(gtk.DIR_TAB_BACKWARD)
                return
            else:
                path = (path[0]-1, )
                
        column = columns[index]
        self.setCursor(path, column)

    def moveCursorToPrevPage(self, path, column):
        rowHeight = column.cell_get_size()[4]
        gridHeight = self.allocation[3] - rowHeight
        visibleRows = gridHeight / rowHeight
        path = (max(0,path[0]-visibleRows),)
        self.setCursor(path, column)
        
    def moveCursorToPrevRow(self, path, column):
        if path[0] > 0:
            path = (path[0]-1,)
            self.setCursor(path, column)

    def createColumns(self):
        self.editors = []

        for i in range(self.model.get_n_columns()):
            title = self.model.getColumnTitle(i)
            type = self.model.get_column_type(i)
            if type == gobject.TYPE_BOOLEAN:
                renderer = gtk.CellRendererToggle()
                
                column = gtk.TreeViewColumn(title, renderer, active=i)
                self.editors.append(GridCellEditorToggle(self, i))
            elif type == gobject.TYPE_PYOBJECT:
                renderer = gtk.CellRendererText()
                xalign = 1.0
                renderer.set_property('xalign', xalign)
                column = gtk.TreeViewColumn(title, renderer, text=i)
                self.editors.append(GridCellEditorCombo(self, i, ['value 1','2','3']))
                
            else:
                renderer = gtk.CellRendererText()
                if type in [gobject.TYPE_INT, gobject.TYPE_FLOAT]:
                    xalign = 1.0
                else:
                    xalign = 0.0
                renderer.set_property('xalign', xalign)
                column = gtk.TreeViewColumn(title, renderer, text=i)
                self.editors.append(GridCellEditorText(self, i))
                
            column.set_alignment(0.5)
            column.set_resizable(True)
            self.append_column(column)

    def setEditors(self, editors):
        self.editors = editors

#this is the example where we can follow        
def test():
    win = gtk.Window(gtk.WINDOW_TOPLEVEL)
    win.connect('destroy', lambda w: gtk.main_quit())

    model = gtk.ListStore(gobject.TYPE_STRING, 
                          gobject.TYPE_STRING,gobject.TYPE_BOOLEAN)
    for i in range(10):
        iter = model.append(('foo', 'option%d'%(i%3),False))

    grid = Grid(model)
    
    editors = [GridCellEditorText(grid, 0),
               
               GridCellEditorCombo(grid, 1, ['option 0','option 1','option 2']),
	       GridCellEditorToggle(grid, 2)
               ]

    grid.setEditors(editors)
    
    renderer = gtk.CellRendererText()
    column = gtk.TreeViewColumn('Column 1', renderer, text=0)
    column.set_resizable(True)
    grid.append_column(column)

    

    renderer = gtk.CellRendererText()
    column = gtk.TreeViewColumn('Column 3', renderer, text=1)
    column.set_resizable(True)
    grid.append_column(column)

    renderer = gtk.CellRendererToggle()
    column = gtk.TreeViewColumn('Column 2', renderer, active=2)
    column.set_resizable(True)
    grid.append_column(column)

    grid.show()

    win.add(grid)
    win.show()
    gtk.main()

if __name__ == '__main__':
    test()

_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to