From 6e98678e9a0b03c3dbbca303d9fc40e3a74029a8 Mon Sep 17 00:00:00 2001
From: stefan <stefan@5a81b35b-ba03-0410-adc8-b2c5c5119f08>
Date: Thu, 8 Apr 2010 12:47:42 +0000
Subject: [PATCH] Dokk (the docking game): -Added name input screen for top ten

git-svn-id: https://dng.biozentrum.unibas.ch/svn/openstructure/trunk@1944 5a81b35b-ba03-0410-adc8-b2c5c5119f08
---
 examples/dokk/datafiles/thrombin/level.ini    |   5 +-
 examples/dokk/datafiles/thrombin/top_ten.ini  |   4 +
 examples/dokk/datafiles/thrombinNoH/level.ini |  26 ++--
 .../dokk/datafiles/thrombinNoH/top_ten.ini    |  28 +++++
 examples/dokk/hud.py                          |  31 +++--
 examples/dokk/name_enter.py                   | 114 ++++++++++++++++++
 6 files changed, 178 insertions(+), 30 deletions(-)
 create mode 100644 examples/dokk/name_enter.py

diff --git a/examples/dokk/datafiles/thrombin/level.ini b/examples/dokk/datafiles/thrombin/level.ini
index db9c25972..b8486b580 100644
--- a/examples/dokk/datafiles/thrombin/level.ini
+++ b/examples/dokk/datafiles/thrombin/level.ini
@@ -2,6 +2,7 @@
 NAME: Thrombin
 DIFFICULTY: Medium
 TIME: 60000
+SAVE: 1
 
 [Intro]
 TEXTTIME: 3000
@@ -125,4 +126,6 @@ FRAMESKIP: 12
 
 [Goal]
 RMSD: 0
-SAVE: True
+
+[Name]
+TEXT: Bitte geben Sie ihr K�rzel ein:
diff --git a/examples/dokk/datafiles/thrombin/top_ten.ini b/examples/dokk/datafiles/thrombin/top_ten.ini
index e69de29bb..d0f47e95f 100644
--- a/examples/dokk/datafiles/thrombin/top_ten.ini
+++ b/examples/dokk/datafiles/thrombin/top_ten.ini
@@ -0,0 +1,4 @@
+[1]
+score = 1.39103358587
+name = STU
+
diff --git a/examples/dokk/datafiles/thrombinNoH/level.ini b/examples/dokk/datafiles/thrombinNoH/level.ini
index 1a7bc3088..1df706dbf 100644
--- a/examples/dokk/datafiles/thrombinNoH/level.ini
+++ b/examples/dokk/datafiles/thrombinNoH/level.ini
@@ -2,6 +2,7 @@
 NAME: Thrombin
 DIFFICULTY: Medium
 TIME: 60000
+SAVE: 1
 
 [Intro]
 TEXTTIME: 3000
@@ -70,23 +71,17 @@ TEXTCOLORRED: 255
 TEXTCOLORGREEN: 0
 TEXTCOLORBLUE: 0
 TEXTSIZE: 16
-TEXT_COUNT: 2
+TEXT_COUNT: 1
 
-TEXT1: Bravo, sie wurden $RANKer! 
-TEXTTIME1: 4000
+TEXT1: Bravo, Sie wurden $RANKer! 
+       RMSD:           $RMSD
+       Zeitmalus:     $TIMEMALUS
+       Endergebnis: $SCORE
+TEXTTIME1: 2000
 TEXTCOLORRED1: 0
 TEXTCOLORGREEN1: 255
 TEXTCOLORBLUE1: 64
-TEXTSIZE1: 100
-
-TEXT2: RMSD:           $RMSD
-       Zeitmalus:     $TIMEMALUS
-       Endergebnis: $SCORE
-TEXTTIME2: 8000
-TEXTCOLORRED2: 0
-TEXTCOLORGREEN2: 255
-TEXTCOLORBLUE2: 0
-TEXTSIZE2: 100
+TEXTSIZE1: 80
 
 [Box]
 XMIN:-25
@@ -108,6 +103,5 @@ ROTZ:0.3
 [Score]
 FRAMESKIP: 5
 
-[Goal]
-RMSD: 0
-SAVE: True
+[Name]
+TEXT: Bitte geben Sie ihr K�rzel ein:
diff --git a/examples/dokk/datafiles/thrombinNoH/top_ten.ini b/examples/dokk/datafiles/thrombinNoH/top_ten.ini
index e69de29bb..61f8003ff 100644
--- a/examples/dokk/datafiles/thrombinNoH/top_ten.ini
+++ b/examples/dokk/datafiles/thrombinNoH/top_ten.ini
@@ -0,0 +1,28 @@
+[1]
+score = 0.5437265475591
+name = STU
+
+[3]
+score = 1.00718728701
+name = SAA
+
+[2]
+score = 1.0
+name = 2AA
+
+[5]
+score = 1.51238689423
+name = TOB
+
+[4]
+score = 1.08293996255
+name = STU
+
+[7]
+score = 59.7783283631
+name = STU
+
+[6]
+score = 2.04023006757
+name = STU
+
diff --git a/examples/dokk/hud.py b/examples/dokk/hud.py
index d5ad7a7d2..31319fa6d 100644
--- a/examples/dokk/hud.py
+++ b/examples/dokk/hud.py
@@ -36,12 +36,14 @@ class HUDObject(QObject):
     self.timer = QTimer()
     self.timer.setSingleShot(True)
     self.hud = None
+    self.endtime = None
     QObject.connect(self.timer, SIGNAL("timeout()"), self.Timeout)
     
   def Appended(self, hud):
     self.hud = hud
-    self.timer.start(self.time)
-    self.endtime = float(time.time()+(self.time)/1000.0)
+    if self.time >= 0:
+      self.timer.start(self.time)
+      self.endtime = float(time.time()+(self.time)/1000.0)
     
   def Timeout(self):
     self.timer.stop()
@@ -64,9 +66,10 @@ class TextHUDObject(HUDObject):
     self.font = font
   
   def Paint(self, painter):
-    rem_time = (self.endtime-float(time.time()))*1000.0
-    if rem_time > 0:
-      self.color.setAlpha((rem_time/self.time)*255)
+    if self.endtime is not None:
+      rem_time = (self.endtime-float(time.time()))*1000.0
+      if rem_time > 0:
+        self.color.setAlpha((rem_time/self.time)*255)
     painter.setPen(QPen(self.color, Qt.SolidLine))
     painter.setFont(self.font)
     if self.pos is not None:
@@ -84,9 +87,10 @@ class RectTextHUDObject(HUDObject):
     self.font = font
     
   def Paint(self, painter):
-    rem_time = (self.endtime-float(time.time()))*1000.0
-    if rem_time > 0:
-      self.color.setAlpha((rem_time/self.time)*255)
+    if self.endtime is not None:
+      rem_time = (self.endtime-float(time.time()))*1000.0
+      if rem_time > 0:
+        self.color.setAlpha((rem_time/self.time)*255)
     painter.setPen(QPen(self.color, Qt.SolidLine))
     painter.setFont(self.font)
     painter.drawText(self.rect, self.align, self.text)
@@ -100,11 +104,12 @@ class RectHUDObject(HUDObject):
     self.border_color = border_color
 
   def Paint(self, painter):
-    rem_time = (self.endtime-float(time.time()))*1000.0
-    if self.fade and rem_time > 0:
-      alpha = (rem_time/self.time)*255
-      self.bg_color.setAlpha(alpha)
-      self.border_color.setAlpha(alpha)
+    if self.fade:
+      rem_time = (self.endtime-float(time.time()))*1000.0
+      if rem_time >0:
+        alpha = (rem_time/self.time)*255
+        self.bg_color.setAlpha(alpha)
+        self.border_color.setAlpha(alpha)
     painter.setPen(self.border_color)
     painter.setBrush(self.bg_color)
     painter.drawRect(self.rect)
diff --git a/examples/dokk/name_enter.py b/examples/dokk/name_enter.py
new file mode 100644
index 000000000..aba55ab8b
--- /dev/null
+++ b/examples/dokk/name_enter.py
@@ -0,0 +1,114 @@
+import dokk
+from PyQt4 import QtCore, QtGui
+from hud import *
+from ost import gui
+
+
+ALPHABET = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9']
+LETTER_BREAK = 3000
+NAME_BREAK = 8000
+
+class NameEnter(QtCore.QObject):
+  def __init__(self, parent=None):
+    QtCore.QObject.__init__(self, parent)
+    self.spnav = gui.SpnavInput.GetQThread()
+    self.spnav.start()
+    QtCore.QObject.connect(self.spnav,QtCore.SIGNAL("deviceTransformed(int,int,int,int,int,int)"), self.InputChanged)
+    QtCore.QObject.connect(self.spnav,QtCore.SIGNAL("deviceButtonPressed(int)"), self.ToggleInputMode)     
+
+    self.letter_pos = 0
+    self.al_len = len(ALPHABET)
+    self.letter_score = 0
+    
+    self.name = "AAA"
+    self.name_pos = 0
+    self.name_len = len(self.name)
+    self.name_score = 0
+    
+    self.int = 0
+    
+  def InputChanged(self, tx,ty,tz,rx,ry,rz):
+    if(abs(tx) > abs(tz)):
+      self.name_score += tx
+      if(self.name_score > NAME_BREAK):
+        self.name_pos +=1
+        self.__SetNamePos()
+      elif(self.name_score < -NAME_BREAK):
+        self.name_pos -=1
+        self.__SetNamePos()      
+    else:
+      self.letter_score += tz
+      if(self.letter_score > LETTER_BREAK):
+        self.letter_pos +=1
+        self.__SetLetterPos()
+      elif(self.letter_score < -LETTER_BREAK):
+        self.letter_pos -=1
+        self.__SetLetterPos()
+        
+  def ToggleInputMode(self, button):
+    if button == 10:
+      self.emit(QtCore.SIGNAL("Finished()"))
+  
+  def GetName(self):
+    return self.name
+  
+  def __SetLetterPos(self):
+    self.letter_pos = self.letter_pos % self.al_len
+    self.__SetName()
+    self.letter_score = 0
+    
+  def __SetNamePos(self):
+    self.name_pos = self.name_pos % self.name_len    
+    for i in range(0,self.al_len):
+      if ALPHABET[i] == self.name[self.name_pos]:
+        self.letter_pos = i
+    self.name_score = 0
+    self.emit(QtCore.SIGNAL("Changed()"))
+        
+  def __SetName(self):
+    self.name = self.name[0:self.name_pos] + ALPHABET[self.letter_pos] + self.name[self.name_pos+1:]
+    self.emit(QtCore.SIGNAL("Changed()"))
+    
+class HUDNameInput(QtCore.QObject):
+  def __init__(self, parent=None):
+    QtCore.QObject.__init__(self, parent)
+    self.ne = NameEnter()
+    self.connect(self.ne,QtCore.SIGNAL("Changed()"),self.Update)
+    self.connect(self.ne,QtCore.SIGNAL("Finished()"),self.Finished)
+    self.huds = list()
+        
+    rect = QtCore.QRect(QtCore.QPoint(60, 60), QtCore.QSize(dokk.Dokk().gl_win.Width()-120, 220))
+    self.bg = RectHUDObject(-1,rect, bg_color=QtGui.QColor(128,128,128,200))
+    dokk.Dokk().gl_win.AddHUDObject(self.bg)
+    self.hud_text = RectTextHUDObject(dokk.Dokk().GetLevel().config.Name["TEXT"], rect=rect, time=-1,font = QtGui.QFont("Verdana",30))
+    dokk.Dokk().gl_win.AddHUDObject(self.hud_text)
+    
+    font = QtGui.QFont("Courier", 30)
+    xpos = (dokk.Dokk().gl_win.Width()/2) - ((len(self.ne.GetName())*30)/2)
+    for i in range(0,len(self.ne.GetName())):
+      hud_obj = TextHUDObject(self.ne.GetName()[i], QtCore.QPoint(xpos,250), -1,font = font)
+      if self.ne.name_pos == i:
+        hud_obj.color = QtGui.QColor(255,255,0)
+      else:
+        hud_obj.color = QtGui.QColor(255,255,255)
+      self.huds.append(hud_obj)
+      dokk.Dokk().gl_win.AddHUDObject(hud_obj)
+      xpos += 30
+    
+  def GetName(self):
+    return self.ne.GetName()
+  
+  def Update(self):
+    for i in range(0,len(self.ne.GetName())):
+      self.huds[i].text = self.ne.GetName()[i]
+      if self.ne.name_pos == i:
+        self.huds[i].color = QtGui.QColor(255,255,0)
+      else:
+        self.huds[i].color = QtGui.QColor(255,255,255)
+        
+  def Finished(self):
+    for hud in self.huds:
+      dokk.Dokk().gl_win.RemoveHUDObject(hud)
+    dokk.Dokk().gl_win.RemoveHUDObject(self.hud_text)
+    dokk.Dokk().gl_win.RemoveHUDObject(self.bg)
+    self.emit(QtCore.SIGNAL("Finished()"))
\ No newline at end of file
-- 
GitLab