""" capellaScript -- Copyright (c) 2004 Lutz Haase
>>> Noten nach Tonhöhe färben
    Einzelnoten werden abhängig von Tonhöhe gefärbt.
    Mit Farbauswahldialog
<<<
<?xml version="1.0" encoding="ISO-8859-1"?>
<info>
  <lang id="en">
    <title>Coloured notes</title>
    <descr>
      <p>Colouring notes after pitch.
Single notes are coloured depending on pitch.
With dialogue for colour selection</p>
    </descr>
  </lang>

  <lang id="de">
    <title>Farbige Noten</title>
    <descr>
      <p>Noten nach Tonhöhe färben.
Einzelnoten werden abhängig von Tonhöhe gefärbt.
Mit Farbauswahldialog</p>
    </descr>
  </lang>

  <lang id="nl">
    <title>Gekleurde noten</title>
    <descr>
      <p>Noten naar toonhoogte inkleuren.
Noten worden afzonderlijk ingekleurd naar toonhoogte.
Met dialoog voor kleurselectie</p>
    </descr>
  </lang>
</info>

Die vorhandene Farbvorgabe ist aus dem Script "Bunte Noten" entnommen.
Für die Anregung und die Farbliste herzlichen Dank an Herrn Hartmut Ring

Geplant ist eine Datei zu integrieren, in der beliebige Farbschemen
gespeichert sein können, da nicht alle Kinderinstrumente eine einheitliche Farbgebung haben.

        04.03.2019 WW Internationalisierung (en-de-nl)
"""

english = {
    'colSel'    :'Colour selection for coloured notes',
    'B'         :'B',
    'AB'        :'AB',
    'colNote'   :'Colouring note',
    'quit'      :'Quit',
    'colScore'  :'Colouring score',
    'colChords' :'Colouring chords too',
    'reset'     :'Reset',
    'ready'     :'Ready',
    'scoreCol'  :'The score is coloured',
    'colNotes'  :'Coloured Notes'
}
german = {
    'colSel'    :'Farbauswahl für farbige Noten',
    'B'         :'H',
    'AB'        :'AH',
    'colNote'   :'Note färben',
    'quit'      :'Beenden',
    'colScore'  :'Partitur färben',
    'colChords' :'Färben mit Akkorden',
    'reset'     :'Wiederherstellen',
    'ready'     :'Fertig',
    'scoreCol'  :'Die Partitur wurde gefärbt',
    'colNotes'  :'Farbige Noten'
}
dutch = {
    'colSel'    :'Kleurselectie voor gekleurde noten',
    'B'         :'B',
    'AB'        :'AB',
    'colNote'   :'Noot inkleuren',
    'quit'      :'Afsluiten',
    'colScore'  :'Partituur inkleuren',
    'colChords' :'Ook akkoorden inkleuren',
    'reset'     :'Herstellen',
    'ready'     :'Voltooid',
    'scoreCol'  :'De partituur werd ingekleurd',
    'colNotes'  :'Gekleurde noten'
}

try:
    setStringTable(
        ("en", english),
        ("de", german),
        ("nl", dutch))
except:
    def tr(s):
        return german[s]
#-----------------------------------------      
from Tkinter import *
from Canvas import *

def HexFarbe(R,G,B):
  hexd= '0123456789ABCDEF'
  return '#'+hexd[R/16] + hexd[R%16]+hexd[G/16] + hexd[G%16]+hexd[B/16] + hexd[B%16]
def HexFarbe_T(F):
  hexd= '0123456789ABCDEF'
  return '#'+hexd[F[0]/16] + hexd[F[0]%16]+hexd[F[1]/16] + hexd[F[1]%16]+hexd[F[2]/16] + hexd[F[2]%16]
def FarbZahl(RGB):
  return 256*((256*RGB[2])+RGB[1])+RGB[0]

class c_Note:
  def __init__(self, cv):
    self.Farbe=(0, 0, 0)
    self.cv=cv
    self.Kopf = Oval(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe), outline=HexFarbe_T(self.Farbe)) 
    self.Hals = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe))
    self.Kreuz1 = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe))
    self.Kreuz2 = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe))
    self.Kreuz3 = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe))
    self.Kreuz4 = Line(self.cv, (0,0),(0,0),fill=HexFarbe_T(self.Farbe))
  def SetzeFarbe(self,RGB):
    self.Farbe=RGB
    #print 'Eingabe:', RGB, 'Gesetzt:', self.Farbe
    self.Kopf['fill']=HexFarbe_T(self.Farbe)
    self.Kopf['outline']=HexFarbe_T(self.Farbe)
    self.Hals['fill']=HexFarbe_T(self.Farbe)
    self.Kreuz1['fill']=HexFarbe_T(self.Farbe)
    self.Kreuz2['fill']=HexFarbe_T(self.Farbe)
    self.Kreuz3['fill']=HexFarbe_T(self.Farbe)
    self.Kreuz4['fill']=HexFarbe_T(self.Farbe)
    self.cv.update()
  def GebeFarbe(self):
    return self.Farbe
  def GebeFarbeHex(self):
    return HexFarbe_T(self.Farbe)
  def MaleNote(self, x, y, Farbe, Kreuz):
    self.Farbe=Farbe
    self.Kopf = Oval(self.cv, (x-10, y-10),(x ,y),fill=HexFarbe_T(self.Farbe), outline=HexFarbe_T(self.Farbe)) 
    self.Hals = Line(self.cv, (x, y-5),(x, y-30),fill=HexFarbe_T(self.Farbe), width=2)
    if Kreuz== 1:
        self.Kreuz1 = Line(self.cv, (x-15, y+2),(x-15, y-15),fill=HexFarbe_T(self.Farbe), width=2)
        self.Kreuz2 = Line(self.cv, (x-20, y+2),(x-20, y-15),fill=HexFarbe_T(self.Farbe), width=2)
        self.Kreuz3 = Line(self.cv, (x-13, y-9),(x-22, y-7),fill=HexFarbe_T(self.Farbe), width=2)
        self.Kreuz4 = Line(self.cv, (x-13, y-5),(x-22, y-3),fill=HexFarbe_T(self.Farbe), width=2)
        
def RahmenXY(Parent, Typ, Rahmen, Hoehe, Breite, HGFarbe, Seite):
  if Typ== 'R':
    Rahmen= Frame(Parent, borderwidth=Rahmen, height=Hoehe, width=Breite, background=HGFarbe)
  else:
    Rahmen= Canvas(Parent, borderwidth=Rahmen, height=Hoehe, width=Breite, background=HGFarbe)
  Rahmen.pack(side=Seite, expand=NO)
  return Rahmen

class MyApp:
    def __init__(self,parent, NotenBlatt):
        self.ROT=0
        self.GRUEN=0
        self.BLAU=0
        self.NotenBlatt = NotenBlatt
        self.Noten_Namen = ['C', 'CD', 'D', 'DE', 'E', 'F', 'FG', 'G', 'GA', 'A', tr('AB'), tr('B')]
        self.FarbenListe=[(255,  0,  0),# rot
             (255,128,  0),# orange
             (255,192,  0),# orangegelb
             (255,255,  0),# gelb
             (160,255,  0),# gelbgelbgrün
             (128,255,  0),# gelbgrün
             (  0,224,  0),# grün
             (  0,112,128),# blaugrün
             (  0, 64,192),# grünblau
             (  0,  0,255),# blau
             ( 96,  0,160),# violett
             (224,  0, 80)]# rotviolett
        #print 'Aktuelle Auflösung:', parent.winfo_vrootwidth(), 'x', parent.winfo_vrootheight()        
        self.myParent = parent 
	self.myParent.geometry('640x400') #Abmessungen des Fensters festlegen
        #Rahmen um Alles, legt Arbeitsfläche fest
       	Rahmen_Alles = Frame(parent, borderwidth=5, background='gray')
	Rahmen_Alles.pack(expand=YES, fill=BOTH)
        #linker Teil die Musternoten, rechter Teil die Farbauswahl
        Rahmen_Rechts = RahmenXY(Rahmen_Alles, 'R', 5, 300, 150, 'gray', RIGHT)
        Rahmen_Links =  RahmenXY(Rahmen_Alles, 'R', 5, 0, 200, 'gray', RIGHT)
        # Rechts: oben: Musterfläche; Mitte: Eingabefelder; unten: Schaltfläche
        Rechts_Oben = RahmenXY(Rahmen_Rechts, 'Z', 0, 90, 90, 'white', TOP) 
        self.MusterFarbe = Rectangle(Rechts_Oben, (10,10),(80,80),fill=HexFarbe(self.ROT, self.GRUEN, self.BLAU), outline='white')
        self.MusterFarbe['fill']=HexFarbe(self.ROT, self.GRUEN, self.BLAU)
        Rechts_Mitte = RahmenXY(Rahmen_Rechts, 'R', 5, 0, 150,'gray', TOP)
        Rechts_Unten = RahmenXY(Rahmen_Rechts, 'R', 5, 0, 150,'gray', TOP)
        #Eingabefelder für die Farbwerte
        self.eingabe_r = self.EingabeFeld(Rechts_Mitte, 'red')
        self.eingabe_g = self.EingabeFeld(Rechts_Mitte, 'green')
        self.eingabe_b = self.EingabeFeld(Rechts_Mitte, 'blue')
        # links: Oben: Überschrift; Mitte: Notenmuster; unten1: Schaltflächen für die Noten
        # unten2: Schaltflächen für das Formular
        Links_Oben = RahmenXY(Rahmen_Links, 'R', 5, 20, 0, 'gray', TOP) #, background='yellow') ###
        Links_Mitte = RahmenXY(Rahmen_Links, 'Z', 5, 80, 420, 'gray', TOP) 
        Links_Unten = RahmenXY(Rahmen_Links, 'R', 5, 50, 420, 'gray', TOP) 
        Links_Unten2 = RahmenXY(Rahmen_Links, 'R', 5, 0, 0, 'gray', TOP) 
    
	myMessage=tr('colSel')
	Label(Links_Oben, text=myMessage, justify=LEFT).pack(side=TOP, anchor=W)

	self.NoteC =c_Note(Links_Mitte)
	self.NoteCD=c_Note(Links_Mitte)
	self.NoteD =c_Note(Links_Mitte)
	self.NoteDE=c_Note(Links_Mitte)
	self.NoteE =c_Note(Links_Mitte)
	self.NoteF =c_Note(Links_Mitte)
	self.NoteFG=c_Note(Links_Mitte)
	self.NoteG =c_Note(Links_Mitte)
	self.NoteGA=c_Note(Links_Mitte)
	self.NoteA =c_Note(Links_Mitte)
	self.NoteAH=c_Note(Links_Mitte)
	self.NoteH =c_Note(Links_Mitte)

	self.Noten_Name = StringVar()
	self.Noten_Name.set('C')
	self.Note_Mit_Name = {'A':self.NoteA, tr('B'):self.NoteH, 'C':self.NoteC, 'D':self.NoteD,
            'E':self.NoteE, 'F':self.NoteF, 'G':self.NoteG, 'CD':self.NoteCD, 'DE':self.NoteDE,
            'FG':self.NoteFG, 'GA':self.NoteGA, tr('AB'):self.NoteAH}
        #Notenlinien malen
        for i in range(5):
            n1 = Line(Links_Mitte, (5,20+10*i),(415,20+10*i),fill='#000000', width=2)
        n1 = Line(Links_Mitte, (5,20+10*5),(75,20+10*5),fill='#000000', width=2)

        #alle 12 Noten färben, einzeichnen und die Schaltfläche dazu erzeugen
        i2 = -1
        for i in range(12):
            Farbe=HexFarbe(self.FarbenListe[i][0],self.FarbenListe[i][1],self.FarbenListe[i][2])
            i2 += 1
            #print 'zahlen:', i, i2
            if len(self.Noten_Namen[i]) > 1:
                i2 -= 1
                self.Note_Mit_Name[self.Noten_Namen[i]].MaleNote(30+34*i, 75-5*i2, self.FarbenListe[i],1)
            else:
                self.Note_Mit_Name[self.Noten_Namen[i]].MaleNote(30+34*i, 75-5*i2, self.FarbenListe[i],0)
            button = Radiobutton(Links_Unten, text=str(self.Noten_Namen[i]), indicatoron=0, 
		value=self.Noten_Namen[i], command=self.Note_refresh, variable=self.Noten_Name, width = 4)
            button.pack(side=LEFT)
            
        self.Note_refresh()
        self.Schalter(Rechts_Unten, 'F1', tr('colNote'))
        self.Schalter(Links_Unten2, 'FQuit', tr('quit'))
        self.Schalter(Links_Unten2, 'F3', tr('colScore'))
        self.Schalter(Links_Unten2, 'F4', tr('colChords'))
        self.Schalter(Links_Unten2, 'F5', tr('reset'))
                    
    def Schalter(self, Rahmen, SName, SText):
        # command binding
        btn = Button(Rahmen, command = lambda arg1=SName:self.SchalterKlick(arg1))
	# event binding -- passing the event as an argument
	btn.bind('<Return>', lambda event, arg1=SName: self.SchalterKlick1(event, arg1))
	btn.configure(text=SText) #, background='gray')  
	btn.pack(side=RIGHT, fill=None, padx=5, pady=5, ipadx=3, ipady=3)
	#return btn
    
    def SchalterKlick1(self, event, SName):
        self.SchalterKlick(SName)
    def SchalterKlick(self, SName):
        #print SName
        if SName =='F1':
            farbe=(self.ROT, self.GRUEN, self.BLAU)
            self.Note_Mit_Name[self.Noten_Name.get()].SetzeFarbe(farbe)
        elif SName =='FQuit':
            self.myParent.destroy()
        elif SName =='F3':
            for i in range(12):
                self.FarbenListe[i] = self.Note_Mit_Name[self.Noten_Namen[i]].GebeFarbe()
            for obj in self.NotenBlatt().noteObjs():
                if obj.isChord() and obj.nHeads() == 1:
                    pitch = obj.head(0).chromaticPitch() % 12
                    obj.setColor(FarbZahl(self.FarbenListe[pitch]))
            messageBox(tr('ready'), tr('scoreCol'))
            self.myParent.destroy()
        elif SName =='F4':
            for i in range(12):
                self.FarbenListe[i] = self.Note_Mit_Name[self.Noten_Namen[i]].GebeFarbe()
            for obj in self.NotenBlatt().noteObjs():
                if obj.isChord() and obj.nHeads() > 0:
                    pitch = obj.head(0).chromaticPitch() % 12
                    obj.setColor(FarbZahl(self.FarbenListe[pitch]))
            messageBox(tr('ready'), tr('scoreCol'))
            self.myParent.destroy()
        elif SName =='F5':
            for i in range(12):
                self.Note_Mit_Name[self.Noten_Namen[i]].SetzeFarbe(self.FarbenListe[i])
            self.Note_refresh()
            pass
        
    def Note_refresh(self):
        Note = self.Note_Mit_Name[self.Noten_Name.get()]
        self.AktuelleFarbe = self.Note_Mit_Name[self.Noten_Name.get()].GebeFarbe()
        self.Setze(self.AktuelleFarbe[0], 'red')
        self.Setze(self.AktuelleFarbe[1], 'green')
        self.Setze(self.AktuelleFarbe[2], 'blue')
        #print 'Refresh:', self.Noten_Name.get(), self.AktuelleFarbe, self.Note_Mit_Name[self.Noten_Name.get()].GebeFarbe() 

    def EingabeFeld(self, Rahmen, Farbe):
        iRahmen = RahmenXY(Rahmen, 'R', 5, 0, 10, Farbe, LEFT)
        eingabe = Entry(iRahmen,width=4,background='white')
        eingabe.pack(fill=BOTH,expand=YES, side=LEFT)
        eingabe.bind('<Next>', lambda event, f=Farbe: self.TasteClick( event, f))
        eingabe.bind('<Prior>', lambda event, f=Farbe: self.TasteClick( event, f))
        eingabe.bind('<Down>', lambda event, f=Farbe: self.TasteClick( event, f))
        eingabe.bind('<Return>', lambda event, f=Farbe: self.TasteClick( event, f))
        eingabe.bind('<Up>', lambda event, f=Farbe: self.TasteClick( event, f))
        #eingabe.bind('<Key>', lambda event, f=Farbe: self.TasteClick( event, f))
        return eingabe
            
    def Setze(self, Zahl, Farbe): #, Feld):
        try:
            Wert=0+Zahl
        except:
            Wert=0
        if Wert >255:
            Wert=255
        elif Wert < 0:
            Wert=0
        if Farbe =='green':
            self.GRUEN= Wert
            self.eingabe_g.delete(0,20)
            self.eingabe_g.insert(0,Wert)
        elif Farbe =='red':
            self.ROT=Wert
            self.eingabe_r.delete(0,20)
            self.eingabe_r.insert(0,Wert)
        elif Farbe =='blue':
            self.BLAU=Wert
            self.eingabe_b.delete(0,20)
            self.eingabe_b.insert(0,Wert)
        self.MusterFarbe['fill']=HexFarbe(self.ROT, self.GRUEN, self.BLAU)

    def Gebe(self, Farbe):
        Wert=0
        if Farbe=='red':
            Wert=self.eingabe_r.get()
        elif Farbe=='green':
            Wert=self.eingabe_g.get()
        elif Farbe=='blue':
            Wert=self.eingabe_b.get()
        return Wert

    def TasteClick(self, event, Farbe):
        try:
            Wert = int(self.Gebe(Farbe))
        except:
            Wert = 0
        #print 'Taste:', event.keysym , 'Wert:', Wert, 'Farbe:', Farbe
        if event.keysym == 'Next':
            self.Setze(Wert-10,Farbe)
        elif event.keysym == 'Prior':
            self.Setze(Wert+10,Farbe)
        elif event.keysym == 'Up':
            self.Setze(Wert+1, Farbe)
        elif event.keysym == 'Down':
            self.Setze(Wert-1, Farbe)
        else:
            self.Setze(Wert, Farbe)
            pass
        
root = Tk()
#activeScore= 12 # zum Testen in PYTHON
root.wm_title(tr('colNotes'))
myapp = MyApp(root, activeScore)
root.mainloop()
