#!/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 Settings():
	def __init__(self):
		"""Program wide settings"""
		# Window length
		self.iWinX = 300;
		self.iMinX = 100;
		# Stripes height.
		self.iBarY = 10;
		# Refresh rate in milliseconds.
		self.iRefresh = 1000;

cSet = Settings();

class ListSegments():
	def do_configure_event(self, event):
		"""Window has been resized"""
		# Get the new size.
		cSet.iWinX = event.x;
		return gtk.Window.do_configure_even(self, widget, event);

	def destroy(self, event):
		gtk.main_quit();

	def __init__(self):
		# Creating main window.
		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL);
		self.window.connect("destroy", self.destroy);
		self.window.resize(cSet.iWinX, cSet.iBarY+1);
		self.window.set_geometry_hints(height_inc=cSet.iBarY);

		# Creating bitmap to put NilFS map.
		self.nil_bitmap = gtk.DrawingArea();
		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.iTimer = 0;
		self.iTimerResize = 0;
		self.window.add(self.nil_bitmap);
		self.nil_bitmap.show();
		self.window.show();

	def nil_bitmap_refresh_timer_cb(self):
		self.iTimer = 0;
		self.nil_bitmap_draw(self.nil_bitmap, None);
		return False;

	def nil_bitmap_expose_cb(self, widget, event):
		cSet.iWinX = event.area.width;
		#, event.area.height;
		gc = self.nil_bitmap.window.new_gc();
		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(widget, event);

	def nil_bitmap_resize_timer_cb(self, iY):
		self.window.resize(cSet.iWinX, iY);
		return False;

	def nil_bitmap_draw(self, area, event):
		gc = self.nil_bitmap.window.new_gc();
#		gc.set_line_attributes(5, gdk.LINE_SOLID, gdk.CAP_BUTT, gdk.JOIN_ROUND);
		sSegs = os.popen("lssu -a", 'r').read().splitlines()[1:];
		iX = 1; iY = 1;
		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':
				if int(d[4]) == 2048: iUsage = 0xFFFF;
				else: iUsage = int(d[4])*0xF000/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+cSet.iBarY-2);

			# Increase counter.
			iX += 1;
			if iX > cSet.iWinX-2:
				iX = 1;
				iY += cSet.iBarY;

		# Resize the window accordingly.
		self.window.set_size_request(cSet.iMinX, iY+cSet.iBarY);

		# Set a refresh timer.
		if self.iTimer == 0:
			self.iTimer = gobject.timeout_add(cSet.iRefresh, self.nil_bitmap_refresh_timer_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());
