#!/usr/bin/python

# This application is released under the GNU General Public License 
# v3 (or, at your option, any later version). You can find the full 
# text of the license under http://www.gnu.org/licenses/gpl.txt. 
# By using, editing and/or distributing this software you agree to 
# the terms and conditions of this license. 
# Thank you for using free software!
# 
#(c) AZorin 2010 <azorin@zorinmail.co.cc>
#(c) Zorink 2010 <zorink@zorinmail.co.cc>
#
# A Plymouth Splash screen managing program.
# This is free software made available under the GNU public license.

import gtk
import sys
import pango
import os
import gnome.ui

try:
    defaultfile = open('/lib/plymouth/themes/default.plymouth', 'r')			# Opening the Default plymouth theme file for reading
    defaultfile.readline()
    defaultfile.read(5)
    default = defaultfile.readline()

except:
    default = "Unknown"

try:
    textfile = open('/lib/plymouth/themes/text.plymouth', 'r')				# Opening the Default plymouth theme file for reading
    textfile.readline()
    textfile.read(5)
    text = textfile.readline()
    
except:
    text = "Unknown"

applogo = "/usr/share/pixmaps/splash-screen-manager.png"

class SplashManager(gtk.Window):
    def __init__(self):
        super(SplashManager, self).__init__()
        
        self.set_title("Zorin Splash Manager")
        self.set_size_request(350, 330)
        self.set_resizable(True)
        self.set_position(gtk.WIN_POS_CENTER)
        self.set_icon_from_file(applogo)
        self.connect("destroy", self.on_destroy)
        
        fixed = gtk.Fixed()

#####################
# Adding the buttons#
#####################

        changedefaulttheme = gtk.Button("Change Default theme")
        changedefaulttheme.connect("clicked", self.on_changedefaulttheme)
        changedefaulttheme.set_size_request(160, 30)

        fixed.put(changedefaulttheme, 95, 80)

        changedefaulttheme.set_tooltip_text("Change the Default (high graphics) Plymouth splash screen")

        changetexttheme = gtk.Button("Change Text theme")
        changetexttheme.connect("clicked", self.on_changetexttheme)
        changetexttheme.set_size_request(160, 30)

        fixed.put(changetexttheme, 95, 115)

        changedefaulttheme.set_tooltip_text("Change the Default (high graphics) Plymouth splash screen")

        install = gtk.Button("Install")
        install.connect("clicked", self.on_install)
        install.set_size_request(70, 30)

        fixed.put(install, 100, 190)

        install.set_tooltip_text("Install a new Plymouth Splash Screen theme")

        remove = gtk.Button("Remove")
        remove.connect("clicked", self.on_remove)
        remove.set_size_request(70, 30)

        fixed.put(remove, 180, 190)

        remove.set_tooltip_text("Remove a Plymouth Splash Screen theme")

        visit = gtk.Button("Check out Zorin OS")
        visit.connect("clicked", self.on_visit)
        visit.set_size_request(150, 30)

        fixed.put(visit, 60, 240)

        visit.set_tooltip_text("Visit the Zorin OS website")

        donate = gtk.Button("Donate")
        donate.connect("clicked", self.on_donate)
        donate.set_size_request(70, 30)

        fixed.put(donate, 220, 240)

        donate.set_tooltip_text("Donate to the creators of this program")
        
        about = gtk.Button(stock=gtk.STOCK_ABOUT)		
        about.connect("clicked", self.on_about)
        about.set_size_request(85, 30)

        fixed.put(about, 10, 290)
        
        close = gtk.Button(stock=gtk.STOCK_CLOSE)		
        close.connect("clicked", self.on_destroy)
        close.set_size_request(85, 30)

        fixed.put(close, 250, 290)

#########################
# Adding the text labels#
#########################

        currentthemetitle = "Current theme:"
        defaultthemetitle = "Default (high graphics): %s" %default
        textthemetitle = "Text (low graphics): %s" %text
        managethemestitle = "Manage themes"
        
        currentthemelabel = gtk.Label(currentthemetitle)
        defaultthemelabel = gtk.Label(defaultthemetitle)
        textthemelabel = gtk.Label(textthemetitle)
        managethemeslabel = gtk.Label(managethemestitle)

        fontdesc = pango.FontDescription("Sans Bold 10")
        fontdescthemes = pango.FontDescription("Sans 10")
        currentthemelabel.modify_font(fontdesc)
        defaultthemelabel.modify_font(fontdescthemes)
        textthemelabel.modify_font(fontdescthemes)
        managethemeslabel.modify_font(fontdesc)

        fixed.put(currentthemelabel, 120, 10)
        fixed.put(defaultthemelabel, 10, 35)
        fixed.put(textthemelabel, 10, 55)
        fixed.put(managethemeslabel, 115, 160)
        
        self.add(fixed)
        self.show_all()

##############################        
# Defining the button actions#
##############################

    def on_destroy(self, widget):
        sys.exit()

    def on_changedefaulttheme(self, widget):
        md = gtk.MessageDialog(None, 
            gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
            gtk.BUTTONS_OK, "Please select your desired .plymouth file\nin the Plymouth themes folder")
        md.run()
        md.destroy()

        chooser = gtk.FileChooserDialog("Select Plymouth splash file",
                                       None,
                                       gtk.FILE_CHOOSER_ACTION_OPEN,
                                       (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                       gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        chooser.set_current_folder('/lib/plymouth/themes')

        filter = gtk.FileFilter()
        filter.set_name("Plymouth splash file (*.plymouth)")
        filter.add_pattern("*.plymouth")
        chooser.add_filter(filter)
    
        response = chooser.run()
        if response == gtk.RESPONSE_OK:
            choosethemefile = chooser.get_filename()
            chooser.destroy()

            setmd = gtk.MessageDialog(None, 
                gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
                gtk.BUTTONS_OK, "Click OK and please wait while the Plymouth splash\ntheme is being changed")
            setmd.run()
            setmd.destroy()

            os.system("gksudo rm /etc/alternatives/default.plymouth")
            os.system("sudo ln -s %s /etc/alternatives/default.plymouth" %choosethemefile)
            os.system("sudo update-initramfs -u")
               
            finishedmd = gtk.MessageDialog(None, 
                gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
                gtk.BUTTONS_OK, "Plymouth splash theme successfully changed")
            finishedmd.run()
            finishedmd.destroy()
        
        elif response == gtk.RESPONSE_CANCEL:
            chooser.destroy()      
              
    def on_changetexttheme(self, widget):
        md = gtk.MessageDialog(None, 
            gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
            gtk.BUTTONS_OK, "Please select your desired .plymouth file\nin the Plymouth themes folder")
        md.run()
        md.destroy()

        chooser = gtk.FileChooserDialog("Select Plymouth splash file",
                                       None,
                                       gtk.FILE_CHOOSER_ACTION_OPEN,
                                       (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                       gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        chooser.set_current_folder('/lib/plymouth/themes')

        filter = gtk.FileFilter()
        filter.set_name("Plymouth splash file (*.plymouth)")
        filter.add_pattern("*.plymouth")
        chooser.add_filter(filter)
    
        response = chooser.run()
        if response == gtk.RESPONSE_OK:
            choosethemefile = chooser.get_filename()
            chooser.destroy()

            setmd = gtk.MessageDialog(None, 
                gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
                gtk.BUTTONS_OK, "Click OK and please wait while the Plymouth splash\ntheme is being changed")
            setmd.run()
            setmd.destroy()

            os.system("gksudo rm /etc/alternatives/text.plymouth")
            os.system("sudo ln -s %s /etc/alternatives/text.plymouth" %choosethemefile)
            os.system("sudo update-initramfs -u")
           
            finishedmd = gtk.MessageDialog(None, 
                gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
                gtk.BUTTONS_OK, "Plymouth splash theme successfully changed")
            finishedmd.run()
            finishedmd.destroy()
        
        elif response == gtk.RESPONSE_CANCEL:
            chooser.destroy()

    def on_install(self, widget):
        md = gtk.MessageDialog(None, 
            gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
            gtk.BUTTONS_OK, "Please select your desired splash screen installer archive")
        md.run()
        md.destroy()

        chooser = gtk.FileChooserDialog("Select Plymouth splash installer file",
                                       None,
                                       gtk.FILE_CHOOSER_ACTION_OPEN,
                                       (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                       gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        
        filter = gtk.FileFilter()
        filter.set_name("Archives")
        filter.add_mime_type("application/zip")
        filter.add_mime_type("application/x-gzip")
        filter.add_mime_type("application/x-bzip")
        filter.add_mime_type("application/x-tar")
        filter.add_pattern("*.zip")
        filter.add_pattern("*.tar")
        filter.add_pattern("*.tar.gz")
        filter.add_pattern("*.tar.bz2")
        filter.add_pattern("*.gz")
        filter.add_pattern("*.bz2")
        chooser.add_filter(filter)
        
        filter = gtk.FileFilter()
        filter.set_name("All files")
        filter.add_pattern("*")
        chooser.add_filter(filter)
        
        response = chooser.run()
        if response == gtk.RESPONSE_OK:
            chooseinstallfile = chooser.get_filename()
            chooser.destroy()
            try:
                os.system("sudo tar -xf %s -C /lib/plymouth/themes" %chooseinstallfile)
            except:
                os.system("sudo tar -xfj %s -C /lib/plymouth/themes" %chooseinstallfile)
            else:
                os.system("sudo unzip %s -d /lib/plymouth/themes" %chooseinstallfile)
            finally:
                finishedmd = gtk.MessageDialog(None, 
                    gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
                    gtk.BUTTONS_OK, "Plymouth splash theme successfully installed")
                finishedmd.run()
                finishedmd.destroy()
                
        elif response == gtk.RESPONSE_CANCEL:
            chooser.destroy()
            
    def on_remove(self, widget):
        md = gtk.MessageDialog(None, 
            gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
            gtk.BUTTONS_OK, "Please select your desired splash screen folder for removal\nin the Plymouth themes folder")
        md.run()
        md.destroy()
        
        chooser = gtk.FileChooserDialog("Select Plymouth splash directory",
                                       None,
                                       gtk.FILE_CHOOSER_ACTION_OPEN,
                                       (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                       gtk.STOCK_OPEN, gtk.RESPONSE_OK))
        chooser.set_default_response(gtk.RESPONSE_OK)
        chooser.set_action(gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER)
        chooser.set_current_folder('/lib/plymouth/themes')

        response = chooser.run()
        if response == gtk.RESPONSE_OK:
            chooseremove = chooser.get_filename()
            chooser.destroy()
            
            os.system("sudo rm -dR %s" %chooseremove)
        
            finishedmd = gtk.MessageDialog(None, 
                gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, 
                gtk.BUTTONS_OK, "Plymouth splash theme successfully removed")
            finishedmd.run()
            finishedmd.destroy()
        
        elif response == gtk.RESPONSE_CANCEL:
            chooser.destroy()    

    def on_visit(self, widget):
        os.system("xdg-open http://zorin-os.webs.com")

    def on_donate(self, widget):
        os.system("xdg-open http://zorin-os.webs.com/splash-screen-manager-donate.html")

#########################
#Making the About dialog#
#########################

    def on_about(self, widget):
        self.Applogoab = gtk.gdk.pixbuf_new_from_file_at_size(applogo,128,128)
        about = gnome.ui.About("Zorin OS Splash Screen Manager","1.2",u"Copyright \xa9 2010 Zorin Soft GNU GPL V3","A Plymouth Splash Screen managing program.",["AZorin <azorin@zorinmail.co.cc>" , "Zorink <zorink@zorinmail.co.cc>"],["AZorin <azorin@zorinmail.co.cc>"],"", self.Applogoab)
        about.show()

SplashManager()
gtk.main()
