All pastes #921684 Raw Edit

Something

public text v1 · immutable
#921684 ·published 2008-02-28 06:28 UTC
rendered paste body
#!/usr/bin/env python
# coding= UTF-8
#
#	wbar configuration gui  v0.5
#
#	Created by
#		Mika Hynnä <mika.hynna@wippies.com>
#
#	Copyright 2008 Mika Hynnä
# This program is distributed under the terms of the GNU General Public License
# For more info see http://www.gnu.org/licenses/gpl.txt 
#
#
# Requires
# * >=python-2.4
# * >=pygtk-2.10
#

import os
import pygtk
pygtk.require('2.0')
import gtk
import gobject

if gtk.pygtk_version < (2,3,90):
	print "PyGtk 2.3.90 or later required"
	raise SystemExit

wbarversion="0.5"

ITEM_ID = 0
ITEM_ICON = 1
ITEM_COMMAND = 2
ITEM_TITLE = 3
ITEM_IMAGE = 4

PLACE_ID=0
PLACE_IMAGE=1
PLACE_TITLE=2
PLACE_COMMAND=3
PLACE_ICON=4


def readconf():
	lines=0
	lastemptyline=0
	items=list()
	id=0

	userconf = os.path.expanduser('~') + '/.wbar'
	if (os.path.exists(userconf)):
		print "User configuration file found: ~/.wbar"
		conf = userconf
	elif os.path.exists('/usr/share/wbar/dot.wbar'):
		conf = '/usr/share/wbar/dot.wbar'
		print "Shared configuration found: /usr/share/wbar/dot.wbar"
	elif os.path.exists('/usr/local/share/wbar/dot.wbar'):
		conf = '/usr/local/share/wbar/dot.wbar'
		print "Shared configuration found: /usr/local/share/wbar/dot.wbar"
	else:
		print "No configuration file found, defaulting.."
	
	icons=[]
	titles=[]
	commands=[]
	ids=[]
	item_count=0
	try:
		file = open(conf, "r")
		for line in file:
			line=line.replace('\n','')
			line=line.strip()
			if not line.startswith('#'):	
				if (len(line) > 1):
					twofirst = line[0:2]
					ids.append(item_count)
					ids.append(item_count)
					if (twofirst == "i:"):
						item_count+=1
						icons.append(line[3:].strip())
					elif (twofirst == "c:"):
						commands.append(line[3:].strip())
					elif (twofirst == "t:"):
						titles.append(line[3:].strip())
	except:
		if file.closed == False:
			file.close()	
	if file.closed == False:
		file.close()

	print "Config file read"
	configuration = []
	try:
		for i in range(0,item_count):
			configuration.append([0, icons[i], commands[i], titles[i]])
	except:
		print "Configuration parse error: trying to continue.."	

	return configuration

def saveconf(conf):
	print "Saving in ~/.wbar ...\n"
	try:
		cfile = open(os.path.expanduser('~') + "/.wbar","w")
		cfile.write("# The Bar && Font")
		for object in conf:
	 		cfile.write("\n")
			num=0
			for item in object:
				num=num+1
				if (num == 2):
					cfile.write("i: "+str(item)+"\n")
				if (num == 3):
	                            cfile.write("c: "+str(item)+"\n")
	                	if (num == 4):
	                            cfile.write("t: "+str(item)+"\n")
		print "Saved!"
	except:
		print "Saving failed." 
		if (cfile.closed == False):
			cfile.close()
	if (cfile.closed == False):
		cfile.close()


class WbarGui:

	configuration = []
	current_selection = 0
	
	def delete_event(self, widget, event, data=None):
		print "Delete event: deleting gui\n"
		return False

	def destroy(self, widget, data=None):
		print "Quiting...\n"
		gtk.main_quit()

	def buttonSaveClicked(self, widget):
		print "Save pressed!"
		del self.configuration[1:]
		
		model = self.treeview.get_model()
		try:
			iter = model.get_iter(0)
		except ValueError:
			message = gtk.MessageDialog(self.window, 0, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK , "Icon list is empty!\n Not saving, sorry!")
			message.set_title("Empty icon list")
			message.set_position(gtk.WIN_POS_CENTER)
			message.run()
			message.destroy()
			return
		
		while iter:
			icon = model.get_value(iter, PLACE_ICON)
			title = model.get_value(iter, PLACE_TITLE)
			command = model.get_value(iter, PLACE_COMMAND)
			self.configuration.append([1,icon,command,title])
			iter = model.iter_next(iter)
			
#		print str(self.configuration)
		saveconf(self.configuration)

		notice = gtk.MessageDialog(self.window, 0, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, "Settings saved!")
		notice.set_title("Saving changes")
		notice.set_position(gtk.WIN_POS_CENTER)
		notice.run()
		notice.destroy()
		
	def __init__(self):

		#Load configuration
		self.configuration = readconf()

		
		#Create window
		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
		self.window.set_resizable(True)
		self.window.set_default_size(500,300)

		self.window.set_title(u"wbar configuration gui")
		self.window.set_position(gtk.WIN_POS_CENTER)
		self.window.connect("destroy", self.destroy)
		self.window.connect("delete_event", self.delete_event)
		

		#Containers
		
		self.VBoxBase = gtk.VBox()
		self.VBoxBase.set_spacing(5)
		self.HBoxButtons = gtk.HBox()
		self.HBoxControls = gtk.HBox()
		
		self.VBoxBase.add(self.HBoxControls)

		self.VBoxList = gtk.VBox()
		self.VboxListControls = gtk.HBox()
		self.VboxListControls.show()
		self.VBoxList.show()
		self.HBoxControls.pack_start(self.VBoxList, False)
		self.HBoxControls.set_spacing(5)
		
		self.VBoxEdits = gtk.VBox()
		
		self.VboxListControls.set_spacing(5)

		#Icon ListStore

		self.treeview = gtk.TreeView()
		model = gtk.ListStore(gobject.TYPE_INT, gtk.gdk.Pixbuf, gobject.TYPE_STRING, gobject.TYPE_STRING, gobject.TYPE_STRING)
		self.treeview.set_model(model)
		
		cell_id = gtk.CellRendererText()
		col_id = gtk.TreeViewColumn("id", cell_id, text=PLACE_ID)
		col_id.set_visible(False)
		self.treeview.append_column(col_id)

		cell_img = gtk.CellRendererPixbuf()
		col_img = gtk.TreeViewColumn("Icon", cell_img, pixbuf = PLACE_IMAGE)
		self.treeview.append_column(col_img)

		cell_text = gtk.CellRendererText()
		col_text = gtk.TreeViewColumn("Title", cell_text, text = PLACE_TITLE)
		self.treeview.append_column(col_text)

		cell_command = gtk.CellRendererText()
		col_command = gtk.TreeViewColumn("command", cell_command, text=PLACE_COMMAND)
		col_command.set_visible(False)
		self.treeview.append_column(col_command)

		cell_icon = gtk.CellRendererText()
		col_icon = gtk.TreeViewColumn("icon path", cell_icon, text=PLACE_ICON)
		col_icon.set_visible(False)
		self.treeview.append_column(col_icon)

		skipfirst=False
		for wbar_item in self.configuration:
			#Lets skip first entry because it contains other than icon information
			if (skipfirst == True):
				item = model.append(None)
				model.set_value(item, PLACE_ID, int(wbar_item[ITEM_ID]))
				try:
					model.set_value(item, PLACE_IMAGE, gtk.gdk.pixbuf_new_from_file_at_size(str(wbar_item[ITEM_ICON]),32,32) )
				except:
					print "Warning: Core melting!!!"
				model.set_value(item, PLACE_TITLE, str(wbar_item[ITEM_TITLE]) )
				model.set_value(item, PLACE_COMMAND, str(wbar_item[ITEM_COMMAND]))
				model.set_value(item, PLACE_ICON, str(wbar_item[ITEM_ICON]))
			else:
				skipfirst = True

		self.treeview.connect("cursor-changed", self.ListItemClicked)
		self.treeview.set_tooltip_text("Drag and Drop to change order")

#		self.treeview.show()
		self.treeview.set_reorderable(True)
        
		self.scrolled = gtk.ScrolledWindow()
		self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
		self.scrolled.add(self.treeview)
		self.scrolled.set_size_request(100,250)

		self.VBoxList.pack_start(self.scrolled)
		self.VBoxList.pack_start(self.VboxListControls, False)

		self.HBoxControls.pack_start(self.VBoxEdits)

		self.VBoxList.set_spacing(5)
		#Control buttons for list: new, delete and such
		#Add new
		self.button_control_new = gtk.Button("Add new", gtk.STOCK_ADD)
		self.button_control_new.connect("clicked", self.button_control_new_clicked)
		self.button_control_new.show()
		self.VboxListControls.pack_start(self.button_control_new, False)
		#Delete selected
		self.button_control_delete = gtk.Button("Delete selected", gtk.STOCK_REMOVE)
		self.button_control_delete.connect("clicked", self.button_control_delete_clicked)
		self.button_control_delete.show()
		self.VboxListControls.pack_start(self.button_control_delete, False)
        #Down arrow
                self.button_control_down = gtk.Button("Up", gtk.STOCK_GO_DOWN)
                self.button_control_down.connect("clicked", self.button_control_down_clicked)
                self.VboxListControls.pack_end(self.button_control_down, False)
        #Up arrow
                self.button_control_up = gtk.Button("Up", gtk.STOCK_GO_UP)
                self.button_control_up.connect("clicked", self.button_control_up_clicked)
                self.VboxListControls.pack_end(self.button_control_up, False)

		#Font options
		#lets first try parse the configuration for fonts...

		font = self.configuration[0][ITEM_TITLE]
		try:
			fonti = font.rindex('/')
			size = int(font[fonti+1:])
			font = font[:fonti]
		except:
			size = 12

		self.VBoxEditsFont = gtk.VBox()
		self.VBoxEdits.add(self.VBoxEditsFont)
		label_font = gtk.Label()
		label_font.set_label("Font:")
		label_font.show()
		self.VBoxEditsFont.pack_start(label_font,False)

		HBoxFont = gtk.HBox()
		self.VBoxEditsFont.pack_start(HBoxFont, False)

		self.text_font = gtk.Entry()
		self.text_font.insert_text(str(font))
		self.text_font.connect("changed", self.text_font_change)
		HBoxFont.pack_start(self.text_font)
		self.text_font.set_tooltip_text("full font path")

		button_font = gtk.Button("...")
		button_font.connect("clicked", self.button_font_clicked)
                button_font.set_tooltip_text("Open font file selection dialog")
		HBoxFont.pack_start(button_font, False)
		
		self.button_font_size = gtk.SpinButton(gtk.Adjustment(size,1,99,1), 1,0)
		self.button_font_size.set_range(1,100)
		self.button_font_size.connect("value-changed", self.button_font_size_callback)
		HBoxFont.pack_start(self.button_font_size, False)
		

		#Background options
		self.VBoxEditsBG = gtk.VBox()
		self.VBoxEdits.add(self.VBoxEditsBG)		

		label_bg = gtk.Label()
		label_bg.set_label("Background image:")
		label_bg.show()
		self.VBoxEditsBG.pack_start(label_bg, False)

		HBoxBackground = gtk.HBox()
		self.VBoxEditsBG.pack_start(HBoxBackground, False)

		self.text_bg = gtk.Entry()
		self.text_bg.insert_text(str(self.configuration[0][1]))
		self.text_bg.show()
		self.text_bg.connect("changed", self.text_bg_change)
		HBoxBackground.pack_start(self.text_bg)

		self.button_bg = gtk.Button("...")
		self.button_bg.connect("clicked", self.button_background_clicked)
                self.button_bg.set_tooltip_text("Open file selection dialog")
		HBoxBackground.pack_start(self.button_bg, False)

		# Frame for object's options
		self.frame = gtk.Frame()
		self.VBoxEdits.pack_start(self.frame)
		
		self.frame_inner = gtk.VBox()
		self.frame.add(self.frame_inner)
		self.frame_inner.set_spacing(10)
		
		
		#Title options
		self.VBoxEdits.set_border_width(2)
		self.label_title = gtk.Label()
		self.label_title.set_label("Title:")
		self.label_title.show()

		self.text_title = gtk.Entry()
		self.text_title.show()
		self.text_title.connect("changed", self.text_title_change)

		#Command options
		label_command = gtk.Label()
		label_command.set_label("Command:")
		label_command.show()

		self.text_command = gtk.Entry()
		self.text_command.show()
		self.text_command.connect("changed", self.text_command_change)

		self.button_command = gtk.Button("...")
		self.button_command.show()
		self.button_command.connect("clicked", self.button_command_clicked)
		self.button_command.set_tooltip_text("Open selection dialog")


		#Icon options
		label_icon = gtk.Label()
		label_icon.set_label("Icon:")

		self.text_icon = gtk.Entry()
		self.text_icon.connect("changed", self.text_icon_change)
		
		self.button_icon = gtk.Button("...")
		self.button_icon.connect("clicked", self.button_icon_clicked)
		self.button_icon.set_tooltip_text("Open icon file selection dialog")

		#Icon image in the frame:
		self.icon_image = gtk.Image()
		self.icon_image.set_size_request(96,96)
		self.frame_inner.add(self.icon_image)
		self.icon_image.set_from_stock(gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_DIALOG)

#################################################################
		#Table container inside frame
		table = gtk.Table(4,3)
		b = gtk.Button()
		table.attach(self.label_title,0,1,0,1, gtk.SHRINK)
		table.attach(self.text_title,1,3,0,1)
		
		table.attach(label_command,0,1,1,2, gtk.SHRINK)
		table.attach(self.text_command,1,3,1,2)
		table.attach(self.button_command,3,4,1,2, gtk.SHRINK, gtk.SHRINK)

		table.attach(label_icon,0,1,2,3, gtk.SHRINK)
		table.attach(self.text_icon,1,3,2,3)
		table.attach(self.button_icon,3,4,2,3, gtk.SHRINK, gtk.SHRINK)
		self.frame_inner.add(table)

#################################################################


		#Button Save
		self.button_save = gtk.Button(" Save",gtk.STOCK_SAVE)
		self.button_save.connect("clicked", self.buttonSaveClicked)
#		self.HBoxButtons.add(self.button_save)
		#Button Exit
		self.button_exit = gtk.Button("Close", gtk.STOCK_CLOSE)
		self.button_exit.connect("clicked", self.destroy)
#		self.HBoxButtons.add(self.button_exit)

		self.HBoxButtons.pack_end(self.button_exit, False, False, 10)
		self.HBoxButtons.pack_end(self.button_save, False, False, 10)

		self.VBoxBase.pack_start(self.HBoxButtons, False)
		self.window.add(self.VBoxBase)
		
		#Show main window frame and all content
		print "All inits ok so far, showing main window."
		self.window.show_all()

#################################################################
#################################################################
#                    EVENTS BEGIN

        def button_control_up_clicked(self, n):
            print "up"
            try:
                cursor = self.treeview.get_cursor()[0][0]
                model = self.treeview.get_model()
                model.move_before(model.get_iter(cursor), model.get_iter(cursor-1))
            except ValueError:
                print "End Reached"
            except TypeError:
                self.treeview.grab_focus()
                print "Empty list"


        def button_control_down_clicked(self, n):
            print "down"
            try:
                cursor = self.treeview.get_cursor()[0][0]
                model = self.treeview.get_model()
                model.move_after(model.get_iter(cursor), model.get_iter(cursor+1))
            except ValueError:
                print "End Reached"
            except TypeError:
                self.treeview.grab_focus()
                print "Empty List"
            
	def UpdateFontInformationInConf(self):
		font = self.text_font.get_text()
		size = self.button_font_size.get_value_as_int()
		self.configuration[0][ITEM_TITLE] = font+"/"+str(size)


	def button_font_size_callback(self,n):
		#Lets update font data
		self.UpdateFontInformationInConf()

	def ClearObjectFields(self):
		self.text_command.set_text("")
		self.text_title.set_text("")
		self.text_icon.set_text("")

	def ListItemClicked(self, n):
                
		try:
			nsel = n.get_cursor()
			selection = nsel[0][0]
			if (selection is not None):
				model = self.treeview.get_model()
				self.text_title.set_text(model.get_value(model.get_iter(selection), PLACE_TITLE) )
				self.text_command.set_text(model.get_value(model.get_iter(selection), PLACE_COMMAND) )
				self.text_icon.set_text( model.get_value( model.get_iter(selection), PLACE_ICON ) )
				self.frame.set_label(model.get_value(model.get_iter(selection), PLACE_TITLE))
		except TypeError:
			self.ClearObjectFields()
		
	def button_icon_clicked(self, n):
		dialog = gtk.FileChooserDialog("Select image file..", None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
		dialog.set_default_response(gtk.RESPONSE_OK)
		filter = gtk.FileFilter()
		filter.set_name("Images")
		filter.add_mime_type("image/svg")
		filter.add_mime_type("image/png")
		filter.add_mime_type("image/jpeg")
		filter.add_mime_type("image/gif")
		filter.add_pattern("*.svg")
		filter.add_pattern("*.png")
		filter.add_pattern("*.jpg")
		filter.add_pattern("*.gif")
		filter.add_pattern("*.tif")
		filter.add_pattern("*.xpm")
		dialog.add_filter(filter)

		filter = gtk.FileFilter()
		filter.set_name("All files")
		filter.add_pattern("*")
		dialog.add_filter(filter)

		dialog.set_current_folder('/usr/share/icons/')

		response = dialog.run()
		if response == gtk.RESPONSE_OK:
			#Set new icon information in place
			self.text_icon.set_text(dialog.get_filename())
		elif response == gtk.RESPONSE_CANCEL:
			print 'Closed, no files selected'
		dialog.destroy()

	def button_font_clicked(self, n):
		dialog = gtk.FileChooserDialog("Select font file..", None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
		dialog.set_default_response(gtk.RESPONSE_OK)

		filter = gtk.FileFilter()
		filter.set_name("All files")
		filter.add_pattern("*")
		dialog.add_filter(filter)

		dialog.set_current_folder('/usr/share/fonts/')

		response = dialog.run()
		if response == gtk.RESPONSE_OK:
			#Set new icon information in place
			self.text_font.set_text(dialog.get_filename())
		elif response == gtk.RESPONSE_CANCEL:
			print 'Closed, no files selected'
		dialog.destroy()


	def button_background_clicked(self, n):
		dialog = gtk.FileChooserDialog("Select background image file..", None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
		dialog.set_default_response(gtk.RESPONSE_OK)
		filter = gtk.FileFilter()
		filter.set_name("Images")
		filter.add_mime_type("image/svg")
		filter.add_mime_type("image/png")
		filter.add_mime_type("image/jpeg")
		filter.add_mime_type("image/gif")
		filter.add_pattern("*.svg")
		filter.add_pattern("*.png")
		filter.add_pattern("*.jpg")
		filter.add_pattern("*.gif")
		filter.add_pattern("*.tif")
		filter.add_pattern("*.xpm")
		dialog.add_filter(filter)

		filter = gtk.FileFilter()
		filter.set_name("All files")
		filter.add_pattern("*")
		dialog.add_filter(filter)

		dialog.set_current_folder(os.path.expanduser('~'))

		response = dialog.run()
		if response == gtk.RESPONSE_OK:
			#Set new icon information in place
			self.text_bg.set_text(dialog.get_filename())
		elif response == gtk.RESPONSE_CANCEL:
			print 'Closed, no files selected'
		dialog.destroy()


	def text_icon_change(self, n):
		#Replace icon to be displayed
		try:
			image = gtk.Image()
			self.icon_image.set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(str(n.get_text()),64,64))
		except:
			print "No icon image "+ n.get_text()+" found..."
			self.icon_image.set_from_stock(gtk.STOCK_MISSING_IMAGE, gtk.ICON_SIZE_DIALOG)

		#Try to upgrade the icon in list and ignore if error occurs
		try:
			selection=self.treeview.get_cursor()[0][0]
			model = self.treeview.get_model()
			model.set_value(model.get_iter(selection), PLACE_ICON, str(n.get_text()))
		
			model.set_value(model.get_iter(selection) , PLACE_IMAGE, gtk.gdk.pixbuf_new_from_file_at_size(str(n.get_text()),32,32))
		except TypeError:
			print "Empty fields"
		except:
			print "Another error.."	  
			model.set_value(model.get_iter(selection) , PLACE_IMAGE, None)
				  
	def text_title_change(self, n):
		#Update Icon file in configuration
		try:
			model = self.treeview.get_model()
			model.set_value(model.get_iter(self.treeview.get_cursor()[0][0]), PLACE_TITLE, str(n.get_text()))
			model.set_value(model.get_iter(self.treeview.get_cursor()[0][0]) , 2, n.get_text())
		except TypeError:
			print "Empty fields"
		
	def text_command_change(self, n):
		try:
			model = self.treeview.get_model()
			model.set_value(model.get_iter(self.treeview.get_cursor()[0][0]), PLACE_COMMAND, str(n.get_text()))
		except TypeError:
			print "Empty fields"


	def button_command_clicked(self, n):
		dialog = gtk.FileChooserDialog("Select command..", None, gtk.FILE_CHOOSER_ACTION_OPEN, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
		dialog.set_default_response(gtk.RESPONSE_OK)

		filter = gtk.FileFilter()
		filter.set_name("All files")
		filter.add_pattern("*")
		dialog.add_filter(filter)

		response = dialog.run()
		if response == gtk.RESPONSE_OK:
			#Set new icon information in place
			self.text_command.set_text(dialog.get_filename())
		elif response == gtk.RESPONSE_CANCEL:
			print 'Closed, no files selected'
		dialog.destroy()


	def text_bg_change(self, n):
		self.configuration[0][ITEM_ICON] = str(n.get_text())

	def text_font_change(self, n):
		self.UpdateFontInformationInConf()

	def button_control_new_clicked(self, n):
		model = self.treeview.get_model()
		#item = model.append(None)
		try:
			iter = model.get_iter(self.treeview.get_cursor()[0][0])
			item = model.insert_after(iter)
		except TypeError:
			item = model.append(None)
                        self.treeview.grab_focus()
                                                
		model.set_value(item, PLACE_ID, 0)
		model.set_value(item, PLACE_IMAGE, None )
		model.set_value(item, PLACE_TITLE, "New object")
		model.set_value(item, PLACE_COMMAND, "command")
		model.set_value(item, PLACE_ICON, "icon.png")
		
		
	def button_control_delete_clicked(self, n):
 		#remove item from configuration
 		try:
  	 		pos = self.treeview.get_cursor()[0][0]
 	  	 	model = self.treeview.get_model()
  	 	 	model.remove(model.get_iter(pos))
  	  	 	if pos < 1:
  	  	  		pos = 1
  	  	  	self.treeview.set_cursor(pos-1)
  	  	except TypeError:
  	  		print "Empty fields, nothing to delete"
  		
 	def main(self):
		gtk.main()


if __name__ == "__main__":
	print "wbar configuration gui"
	print "Copyright 2008 Mika Hynnä <mika.hynna@wippies.com>"
	print "\nthis program is distributed under the terms of the GNU General Public License\n"
	gui = WbarGui()
	gui.main()