#natxooy@gmail.com
#nautilus etiketa bilatzaile
#v 0.1

from gi.repository import Nautilus, GObject
from gi.repository import Gtk as gtk
from gi.repository.GdkPixbuf import Pixbuf
from subprocess import Popen, PIPE, STDOUT,call
from os import path,environ
from sys import platform
from urllib import unquote
from mimetypes import guess_type
import locale

class TagsManager:
    def __init__(self):
	    self.d={}
	    self.dtag={}
	    cmd='tracker-tag -t'
	    p=Popen(cmd,shell=True,stdin=PIPE, stdout=PIPE, stderr=STDOUT,close_fds=True)
	    output = p.stdout.read()
	    l=output.split('\n')
	    while('' in l): l.remove('')
	    if len(l)>3:
		    for i in range(2,len(l),3):
			    if i+2<len(l):self.d[l[i].strip()]=int(l[i+2][:l[i+2].find('f')])
		    original_list=[i for i in self.d.keys()]
	    decorated = [(s.lower(), s) for s in original_list]
	    decorated.sort()
	    lk = [s[1] for s in decorated]
	    for tag in lk:
		    if self.d[tag]<>0:
		        cmd='tracker-tag -t -s'
		        p=Popen(cmd,shell=True,stdin=PIPE, stdout=PIPE, stderr=STDOUT,close_fds=True)
		        output = p.stdout.read()
		        l=output.split('\n')
		        ll= [unquote(i.strip()).decode('utf-8') for i in l]
		        ini=ll.index(tag)
		        lkini=lk.index(unicode(tag))
		        if tag==lk[-1]:
		            resp=ll[ini+1:]
		            while('' in resp): resp.remove('')
		        else:
			        fin=ll.index(lk[lkini+1])
			        resp=[ll[i] for i in range(ini+1,fin)]
		        self.dtag[tag]=resp
		    else:self.dtag[tag]=[]

class Ventana:
    def clic(self, widget, event, data=None):
        l=[]
        lista_nueva=[]
        for i in self.todas.get_selection().get_selected_rows()[1]:
            t= self.todas.get_model().get_value(self.todas.get_model().get_iter(i), 0)
            l.append(t)
        if len(l)==1:
            lista_nueva=[i for i in self.tm.dtag[l[0]]]
        elif len(l)>1:
            lista_nueva=[i for i in self.tm.dtag[l[0]]]
            for i in l[1:]:
                ll=[]
                for f in self.tm.dtag[i]:
                    if f in lista_nueva: ll.append(f)
                lista_nueva=[f for f in ll]
        else:lista_nueva=[]
        self.files.get_model().clear()
        lista=[f.encode('utf-8')[7:] for f in lista_nueva]
        lf=[i for i in lista if path.isfile(i)]
        ld=[i for i in lista if not path.isfile(i)]
        lista_nueva=ld+lf
        for f in lista_nueva:
            mime_type= guess_type(path.basename(f))
            if mime_type[0]<>None:
                icon= 'gnome-mime-'+mime_type[0].replace('/','-')
            else:
                if path.isfile(f):icon='gtk-file'
                else:icon='folder'
            #if mime_type[0].split('/')[0]=='image':pixbuf = Pixbuf.new_from_file_at_size(f,48,48)
            #else:pixbuf = gtk.IconTheme.get_default().load_icon(icon, 48, 0)
            try: pixbuf = Pixbuf.new_from_file_at_size(f,48,48)
            except: pixbuf = gtk.IconTheme.get_default().load_icon(icon, 48, 0)
            self.files.get_model().append([pixbuf,path.basename(f),f])
        return False
     
    def open_file(self, iconview, ipath):
        model = iconview.get_model()
        iter = model.get_iter(ipath)
        filename = model.get_value(iter, 2)
        if platform == 'linux2':
            call(["xdg-open", filename])
        return
    
    def __init__(self):
        self.tm=TagsManager()
        self.paned = gtk.HPaned()
      
        self.existentags = gtk.ListStore(str)
        tags=[i for i in self.tm.d.keys()]
        tags.sort()
        for t in tags:
            self.existentags.append([t])
        self.todas = gtk.TreeView(self.existentags)
        self.todas.get_selection().set_mode(gtk.SelectionMode.MULTIPLE)
        cell = gtk.CellRendererText()
        self.todas.connect("button_release_event", self.clic, None)
        column0=gtk.TreeViewColumn("Tags",cell, text=0)
        self.todas.append_column(column0) 
        scrolled_window = gtk.ScrolledWindow()
        scrolled_window.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        scrolled_window.add_with_viewport (self.todas)
        self.paned.add1(scrolled_window)
        
        self.listfiles = gtk.ListStore(Pixbuf,str,str)
        self.files = gtk.IconView.new()
        self.files.set_model(self.listfiles)
        self.files.set_pixbuf_column(0)
        self.files.set_text_column(1)
        self.files.connect('item-activated', self.open_file)
        scrolled_window2 = gtk.ScrolledWindow()
        scrolled_window2.set_policy(gtk.PolicyType.AUTOMATIC, gtk.PolicyType.AUTOMATIC)
        scrolled_window2.add_with_viewport (self.files)
        self.paned.add2(scrolled_window2)
        self.paned.set_position(150)
        self.paned.show_all()

class PApplication(gtk.Application):
    def __init__(self,window):
        self.dialog = gtk.Dialog ("Etiketa iragazkia", window, gtk.DialogFlags.MODAL,
                                      (gtk.STOCK_CLOSE, gtk.ResponseType.CLOSE,))
        self.dialog.set_icon_name (gtk.STOCK_EDIT)
        self.dialog.set_size_request(600, 400)
        
        TS=Ventana()
        self.dialog.vbox.pack_start (TS.paned,expand=True, fill=True, padding=0)

class Pr(GObject.GObject, Nautilus.MenuProvider):
    def __init__(self):
        pass

    def ojo(self,menu,window):
        d=PApplication(window)
        r=d.dialog.run()
        d.dialog.destroy()
        return
    
    def get_background_items(self, window, files):
        return self.menuItem(window)
        
    def get_file_items(self, window, files):
        return self.menuItem(window)

    def menuItem(self, window):
        self.window=window
        P = Nautilus.MenuItem(
            name="Etiketa iragazkia::Etiketa iragazkia",
            label="Etiketa iragazkia",
            tip="Etiketa iragazkia"
        )
        P.connect('activate', self.ojo, window)
        return [P]


