home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / python2.4 / site-packages / serpentine / gdkpiechart.pyo (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  6.5 KB  |  154 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.4)
  3.  
  4. import gobject
  5. import gtk.gdk as gtk
  6. import gtk
  7. import math
  8. import os
  9. from gtk import DrawingArea
  10. from math import cos, sin
  11. from weakref import ref
  12. from cairopiechart import CairoPieChart
  13. _CIRCLE = 360 * 64
  14.  
  15. class GdkPieChart(DrawingArea):
  16.     
  17.     def __init__(self, values, getter):
  18.         DrawingArea.__init__(self)
  19.         self.gc = None
  20.         self.width = 0
  21.         self.height = 0
  22.         self.selected = []
  23.         self.total = 0
  24.         self.offset = 1
  25.         self.getter = getter
  26.         self.values = values
  27.         self.connect('size-allocate', self._GdkPieChart__on_size_allocate)
  28.         self.connect('expose-event', self._GdkPieChart__on_expose_event)
  29.         self.connect('realize', self._GdkPieChart__on_realize)
  30.  
  31.     
  32.     def __on_realize(self, widget):
  33.         style = self.get_style()
  34.         self.border_gc = style.dark_gc[gtk.STATE_NORMAL]
  35.         self.transparent_gc = style.bg_gc[gtk.STATE_NORMAL]
  36.         self.background_gc = style.mid_gc[gtk.STATE_NORMAL]
  37.         self.slice_gc = style.base_gc[gtk.STATE_NORMAL]
  38.         self.selected_slice_gc = style.base_gc[gtk.STATE_SELECTED]
  39.  
  40.     
  41.     def __on_size_allocate(self, widget, allocation):
  42.         self.width = allocation.width
  43.         self.height = allocation.height
  44.  
  45.     
  46.     def draw_slice(self, gc, offset, aperture):
  47.         self.window.draw_arc(gc, True, 0, 0, self.radius, self.radius, offset, aperture)
  48.  
  49.     
  50.     def draw_circle(self, gc):
  51.         self.draw_slice(gc, 0, _CIRCLE)
  52.  
  53.     
  54.     def __on_expose_event(self, widget, event):
  55.         offset = 0
  56.         selected_slices = []
  57.         index = 0
  58.         total = 0
  59.         for v in self.values:
  60.             total += self.getter(v)
  61.         
  62.         filled = total >= self.total
  63.         self.draw_circle(self.background_gc)
  64.         ratio = _CIRCLE / float(self.total)
  65.         for value in self.values:
  66.             angle = int(self.getter(value) * ratio)
  67.             if index in self.selected:
  68.                 selected_slices.append((offset, angle))
  69.             elif not filled:
  70.                 self.draw_slice(self.slice_gc, offset, angle)
  71.             
  72.             offset += angle
  73.             index += 1
  74.         
  75.         if filled:
  76.             self.draw_circle(self.slice_gc)
  77.         
  78.         for offset, angle in selected_slices:
  79.             self.draw_slice(self.selected_slice_gc, offset, angle)
  80.         
  81.         r = int(self.radius / 4)
  82.         dx = self.radius / 2 - r / 2
  83.         self.window.draw_arc(self.transparent_gc, True, dx, dx, r, r, 0, _CIRCLE)
  84.         self.window.draw_arc(self.border_gc, False, dx, dx, r, r, 0, _CIRCLE)
  85.         self.window.draw_arc(self.border_gc, False, 0, 0, self.radius, self.radius, 0, _CIRCLE)
  86.  
  87.     
  88.     def get_radius(self):
  89.         return min(self.width, self.height) - self.offset
  90.  
  91.     radius = property(get_radius)
  92.  
  93. if hasattr(gtk.gdk.Drawable, 'cairo_create') or os.environ.get('SERP_USE_GDK', '') != 'yes':
  94.     PieChart = CairoPieChart
  95. else:
  96.     PieChart = GdkPieChart
  97.  
  98. class SerpentineUsage(object):
  99.     
  100.     def __init__(self, parent):
  101.         self._SerpentineUsage__parent = ref(parent)
  102.         self._SerpentineUsage__overflow = False
  103.         self.widget = PieChart(values = self.parent.source, getter = (lambda value: value['duration']))
  104.         self.widget.total = self.parent.disc_size
  105.         self.parent.source.listeners.append(self)
  106.         self.parent.listeners.append(self)
  107.  
  108.     
  109.     def get_parent(self):
  110.         return self._SerpentineUsage__parent()
  111.  
  112.     parent = property(get_parent)
  113.     
  114.     def __set_overflow(self, is_overflow):
  115.         self.widget.filled = is_overflow
  116.         self._SerpentineUsage__is_overflow = is_overflow
  117.  
  118.     
  119.     def __get_overflow(self):
  120.         return self._SerpentineUsage__overflow
  121.  
  122.     overflow = property(__get_overflow, __set_overflow)
  123.     del __set_overflow
  124.     del __get_overflow
  125.     
  126.     def on_contents_changed(self, *args):
  127.         self.widget.queue_draw()
  128.         self._SerpentineUsage__update()
  129.  
  130.     
  131.     def on_musics_added(self, e, rows):
  132.         self.widget.queue_draw()
  133.         self._SerpentineUsage__update()
  134.  
  135.     on_musics_removed = on_musics_added
  136.     
  137.     def __update(self):
  138.         self.overflow = self.widget.total < self.parent.source.total_duration
  139.  
  140.     
  141.     def on_selection_changed(self, e):
  142.         if not self.overflow:
  143.             self.widget.selected = self.parent.get_selected()
  144.             self.widget.queue_draw()
  145.         
  146.  
  147.     
  148.     def on_disc_size_changed(self, e):
  149.         self.widget.total = self.parent.disc_size
  150.         self._SerpentineUsage__update()
  151.         self.widget.queue_draw()
  152.  
  153.  
  154.