#!/usr/bin/env python
# vim: set fileencoding=utf-8 :

import sys, os;
import pygtk;
pygtk.require("2.0");
import gtk, gobject;
from gtk import gdk;



class ListSegments():
	def delete_event(self, widget, event, data=None):
		return False;

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

	def __init__(self):
		# Creating main window.
		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL);
		self.window.connect("delete_event", self.delete_event);
		self.window.connect("destroy", self.destroy);

		# Get bitmap info.
		sSegs = os.popen("lssu -a", 'r').read().splitlines()[1:];
		iXL = len(sSegs);
		iYL = ((iXL/400) + 1) * 20;
		iXL = (iXL/5) + 1;

		# Creating bitmap to put NilFS map.
		self.nil_bitmap = gtk.DrawingArea();
		self.nil_bitmap.set_size_request(iXL, iYL);
		self.nil_bitmap.set_events(
				gtk.gdk.POINTER_MOTION_MASK |
				gtk.gdk.POINTER_MOTION_HINT_MASK
		);
		self.nil_bitmap.connect("expose-event", self.nil_bitmap_expose_cb);
		self.nil_bitmap.connect("motion_notify_event", self.nil_bitmap_cmove_cb);

		# Welding everything togheter.
		self.window.add(self.nil_bitmap);
		self.nil_bitmap.show();
		self.window.show();

	def nil_bitmap_refresh_cb(self):
		self.nil_bitmap_draw(self.nil_bitmap, None);
		return False;

	def nil_bitmap_expose_cb(self, area, event):
		style = self.nil_bitmap.get_style();
		gc = style.fg_gc[gtk.STATE_NORMAL];
		gc.set_rgb_fg_color(gdk.Color(0xCCCC , 0xCCCC, 0xCCCC));
		self.nil_bitmap.window.draw_rectangle(gc, True, 0, 0, -1, -1);
		return self.nil_bitmap_draw(area, event);

	def nil_bitmap_draw(self, area, event):
		style = self.nil_bitmap.get_style();
		gc = style.fg_gc[gtk.STATE_NORMAL];
		sSegs = os.popen("lssu -a", 'r').read().splitlines()[1:];
		iX = 0; iY = 0;
		for seg in sSegs:
			d  = seg.split(' ');
			# Remove empty spaces.
			while True:
				try:
					d.remove('');
				except ValueError: break;

			# If it has data, draw a line in the map.
			if d[3][1] == 'd':
				iUsage = int(d[4])*0xFFFF/2048;
				if d[3][0] == 'a':
					hColor = gdk.Color(iUsage, 0xFFFF, 0);
				else:
					hColor = gdk.Color(0, 0, iUsage);
				if d[3][2] == 'e':
					hColor = gdk.Color(0xFFFF, 0, 0);
				gc.set_rgb_fg_color(hColor);
			else:
				gc.set_rgb_fg_color(gdk.Color(0, 0, 0));
			self.nil_bitmap.window.draw_line(gc, iX, iY, iX, iY+18);

			# Increase counter.
			iX += 1;
			if iX > 400:
				iX = 0;
				iY += 20;
		gobject.timeout_add(500, self.nil_bitmap_refresh_cb);
		return True;

	def nil_bitmap_cmove_cb(self, area, event):
		style = self.nil_bitmap.get_style();
		gc = style.fg_gc[gtk.STATE_NORMAL];
		return True;

	def main(self):
		gtk.main();

if __name__ == "__main__":
	m = ListSegments();
	sys.exit(m.main());
