Ralph,

I have done something like this
for the same reasons... it seems
that the draw area bombs at about
32k width, so I made my own virtually
infinite scroll window: a draw area
and a vscroll bar in a table, with
the draw area responding to
"value-changed" signal of the
scrollbars adjustment. It looks
just like the scrolled window.
Code attached (see Graph class).

Ralph Walden wrote:

> List,
> 
> I have a need for a window frame with scrollbars, and am currently
> abusing the GtkScrolledWindow for this purpose, but I
> monitor the scrollbar adjustments myself and do my own scrolling of
> (practically) infinite data.  But of course, when I add a child to 
> the ScrolledWindow with .add instead of .add_with_viewport, I get
> the usual nasty Gtk Warning:
> 
> Gtk-WARNING **: gtk_scrolled_window_add(): cannot add non scrollable
> widget use gtk_scrolled_window_add_with_viewport() instead
> 
> I'd like to eliminate this warning.  I thought about creating my own
> window
> with scrollbars, but haven't thought of a good way of makinging it look
> or work like the GtkScrolledWindow (from python).  
> 
> Any suggestions?
> 
> 
> Thanks,
> 

class Graph(GtkTable):
  def __init__(self,data):
    GtkTable.__init__(self,3,3)
    self.data=data
    self.set_border_width(10)

    self.hrule=GtkHRuler()
    self.attach(self.hrule,1,2,0,1,FILL | EXPAND,0)
    self.hrule.show()

    self.draw=GtkDrawingArea()
    #self.draw.size(min(len(self.data),300),200)
    self.draw.connect("expose_event",self.expose_event)
    self.draw.connect("configure_event",self.configure_event)
    self.attach(self.draw,1,2,1,2)
    self.draw.show()

    #self.hscale=GtkHScale()
    self.hscroll=GtkHScrollbar()
    self.adj=self.hscroll.get_adjustment()
    self.adj.set_all(0,0,0,1,1,1)
    self.adj.connect("value_changed",self.adj_value_changed)
    self.attach(self.hscroll,1,2,2,3,FILL | EXPAND,0)
    self.hscroll.show()

    self.show()
    self.connect("key_release_event",self.key_release)
  def get_data(self):
    self.data.update()
    return self.data[
      int(self.adj.value):int(self.adj.value)+self.get_window().width]
  def expose_event(self,widget,event):
    #print fname()
    area=event.area
    widget=self.draw
    gc=widget.get_style().fg_gc[STATE_NORMAL]
    win=widget.get_window()
    widget.draw_rectangle(widget.get_style().black_gc,TRUE,
      0,0,win.width,win.height)
    x=1
    data=self.get_data()
    _y=data[0]
    for y in data:
      if x >= len(data):
        break
      widget.draw_line(
        widget.get_style().white_gc,
        x-1, widget.get_window().height*(1.0-_y),
        x,   widget.get_window().height*(1.0-y) )
      _y=y
      x=x+1
    #print "expose_event",self,widget,event
    #print "window : ",dir(widget.get_window())
    return FALSE
  def configure_event(self,widget,event):
    width=self.get_window().width
    self.adj.set_all(self.adj.value,0,len(self.data)-width,10,width,width)
    self.hrule.set_range(self.adj.value,self.adj.value+width-1,
      self.adj.value,self.adj.value+width-1)
  def adj_value_changed(self,adj):
    #print adj.value
    self.draw.draw([0,0,200,200])
    width=self.get_window().width
    self.hrule.set_range(self.adj.value,self.adj.value+width-1,
      self.adj.value,self.adj.value+width-1)
  def key_release(self,event,data):
    print "key_release",event,data

class TopWin(GtkWindow):
  def __init__(self):
    GtkWindow.__init__(self)
    self.set_default_size(600,300)
    self.set_uposition(20,20)
    self.connect("destroy",mainquit)
    self.connect("key_release_event",self.key_release)
    self.show()
  def key_release(self,event,data):
    print event,data



Reply via email to