Ver código fonte

update scroll func

hi80482 3 anos atrás
pai
commit
ca1e4cfe91
1 arquivos alterados com 129 adições e 45 exclusões
  1. 129 45
      sys.py/UI/page.py

+ 129 - 45
sys.py/UI/page.py

@@ -8,7 +8,7 @@ import sys
 import math
 import fnmatch
 import random
-
+import time
 
 from libs import easing
 
@@ -111,6 +111,7 @@ class Page(Widget):
     _Padding = pygame.Rect(0, 0, 0, 0)  # x,y,w,h
     _Margin = pygame.Rect(0, 0, 0, 0)
     _ScrollStep = 1
+    _Scrolled = 0
     _ItemsPerPage = 6
 
     def __init__(self):
@@ -582,82 +583,165 @@ class Page(Widget):
             self._Icons[i].Draw()
 
     # make sure the Class has the _MyList
-    def ScrollDown(self):
+    # def ScrollDown(self):
         # if len(self._MyList) == 0:
-        if len(self._MyList) <= 1:
-            return
-        self._PsIndex +=1
-        if self._PsIndex >= len(self._MyList):
+            # return
+        # self._PsIndex +=1
+        # if self._PsIndex >= len(self._MyList):
             # self._PsIndex = len(self._MyList) -1
 
-            # loop scroll, to first
-            if len(self._MyList) > self._ItemsPerPage:
-                self.FScrollUp(len(self._MyList) - self._ItemsPerPage)
-            self._PsIndex = 0
-            return
-
-        cur_li = self._MyList[self._PsIndex]
-        if cur_li._PosY +cur_li._Height > self._Height:
-            for i in range(0,len(self._MyList)):
-                self._MyList[i]._PosY -= self._MyList[i]._Height
+        # cur_li = self._MyList[self._PsIndex]
+        # if cur_li._PosY +cur_li._Height > self._Height:
+            # for i in range(0,len(self._MyList)):
+                # self._MyList[i]._PosY -= self._MyList[i]._Height
     
-    def ScrollUp(self):
+    # def ScrollUp(self):
         # if len(self._MyList) == 0:
+            # return
+        # self._PsIndex -= 1
+        # if self._PsIndex < 0:
+            # self._PsIndex = 0
+        # cur_li = self._MyList[self._PsIndex]
+        # if cur_li._PosY < 0:
+            # for i in range(0, len(self._MyList)):
+                # self._MyList[i]._PosY += self._MyList[i]._Height
+    
+    def ScrollUp(self, step = 1):
         if len(self._MyList) <= 1:
             return
-        self._PsIndex -= 1
-        if self._PsIndex < 0:
-            # self._PsIndex = 0
+
+        # check step
+        if step > self._ItemsPerPage:
+            step = self._ItemsPerPage - 1
+        if step > len(self._MyList) - 1:
+            step = 1
+
+        # first to end
+        if self._PsIndex - step < 0 and step == 1:
+            # index of the last item on current screen 
+            self._PsIndex = 0 + self._ItemsPerPage - 1
 
             # loop scroll, to end
             if len(self._MyList) > self._ItemsPerPage:
-                self.FScrollDown(len(self._MyList) - self._ItemsPerPage)
+                self.FScrollDown(len(self._MyList) - self._ItemsPerPage, True)
             self._PsIndex = len(self._MyList) - 1
+            self._Scrolled = self._PsIndex
             return
+        else:
+            self.FScrollUp(step)
 
-        cur_li = self._MyList[self._PsIndex]
-        if cur_li._PosY < 0:
-            for i in range(0, len(self._MyList)):
-                self._MyList[i]._PosY += self._MyList[i]._Height
+    def ScrollDown(self, step = 1):
+        if len(self._MyList) <= 1:
+            return
+
+        # check step
+        if step > self._ItemsPerPage:
+            step = self._ItemsPerPage - 1
+        if step > len(self._MyList) - 1:
+            step = 1
+
+        # end to first
+        if self._PsIndex + step >= len(self._MyList) and step == 1:
+            # index of the first item on current screen
+            self._PsIndex = (len(self._MyList) - 1) - (self._ItemsPerPage - 1)
+
+            # loop scroll, to first
+            if len(self._MyList) > self._ItemsPerPage:
+                self.FScrollUp(len(self._MyList) - self._ItemsPerPage, True)
+            self._PsIndex = 0
+            self._Scrolled = self._PsIndex
+            return
+        else:
+            self.FScrollDown(step)
 
-    def FScrollUp(self,Step=1):
+    # do not directly call this function, please use "ScrollUp(step)"
+    def FScrollUp(self, step = 1, loop_scroll = False):
         # if len(self._MyList) == 0:
         if len(self._MyList) <= 1:
             return
+
+        if step < self._ItemsPerPage and not loop_scroll:
+            if (self._PsIndex - step + 1) - 1 < step:
+                step = 1
+
         tmp = self._PsIndex
-        self._PsIndex -= Step
+        self._PsIndex -= step
         
         if self._PsIndex < 0:
             self._PsIndex = 0
-        dy = tmp-self._PsIndex 
+
+        # dy = tmp-self._PsIndex
+        dy = abs(tmp - self._PsIndex)
         cur_li = self._MyList[self._PsIndex]
         if cur_li._PosY < 0:
             for i in range(0, len(self._MyList)):
-                self._MyList[i]._PosY += self._MyList[i]._Height*dy
-        
-    def RefreshPsIndex(self):
-        if len(self._MyList) == 0:
-            self._PsIndex = 0
-        if self._PsIndex > (len(self._MyList) -1):
-            self._PsIndex = len(self._MyList) -1
-        
-    def FScrollDown(self,Step=1):
+                self._MyList[i]._PosY += self._MyList[i]._Height * dy
+            self._Scrolled += dy
+
+    # do not directly call this function, please use "ScrollDown(step)"
+    def FScrollDown(self, step = 1, loop_scroll = False):
         # if len(self._MyList) == 0:
         if len(self._MyList) <= 1:
             return
+        
+        if step < self._ItemsPerPage and not loop_scroll:
+            if len(self._MyList) - (self._PsIndex + step + 1) < step:
+                step = 1
+
         tmp = self._PsIndex
-        self._PsIndex +=Step
+        self._PsIndex += step
+
         if self._PsIndex >= len(self._MyList):
-            self._PsIndex = len(self._MyList) -1
-        dy = self._PsIndex - tmp
+            self._PsIndex = len(self._MyList) - 1
+
+        # dy = self._PsIndex - tmp
+        dy = abs(self._PsIndex - tmp)
         cur_li = self._MyList[self._PsIndex]
-        if cur_li._PosY +cur_li._Height > self._Height:
-            for i in range(0,len(self._MyList)):
-                self._MyList[i]._PosY -= self._MyList[i]._Height*dy
+        if cur_li._PosY + cur_li._Height > self._Height:
+            for i in range(0, len(self._MyList)):
+                self._MyList[i]._PosY -= self._MyList[i]._Height * dy
+            self._Scrolled -= dy
+
+    def SyncScroll(self):
+        if self._Scrolled == 0:
+            return
+
+        if self._PsIndex < len(self._MyList):
+            cur_li = self._MyList[self._PsIndex]
+            if self._Scrolled > 0:
+                if cur_li._PosY < 0:
+                    for i in range(0, len(self._MyList)):
+                        self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height
+            elif self._Scrolled < 0:
+                if cur_li._PosY +cur_li._Height > self._Height:
+                    for i in range(0,len(self._MyList)):
+                        self._MyList[i]._PosY += self._Scrolled * self._MyList[i]._Height
+
+    def SpeedScroll(self, thekey):
+        if self._Screen._LastKey == thekey:
+            self._ScrollStep += 1
+            if self._ScrollStep >= self._ItemsPerPage:
+                self._ScrollStep = self._ItemsPerPage - 1
+        else:
+            self._ScrollStep = 1
+           
+        cur_time = time.time()
+            
+        if cur_time - self._Screen._LastKeyDown > 0.3:
+            self._ScrollStep = 1
+
+        if len(self._MyList) < self._ItemsPerPage:
+            self._ScrollStep = 1
+
+    def RefreshPsIndex(self):
+        if len(self._MyList) == 0:
+            self._PsIndex = 0
+        if self._PsIndex > (len(self._MyList) -1):
+            self._PsIndex = len(self._MyList) -1
     
-    # def KeyDown(self,event):##default keydown,every inherited page class should have it's own KeyDown
+    # def KeyDown(self,event):##default keydown, every inherited page class should have it's own KeyDown
     # fast: fast display mode
-    def KeyDown(self, event, fast = False):##default keydown,every inherited page class should have it's own KeyDown
+    def KeyDown(self, event, fast = False):##default keydown, every inherited page class should have it's own KeyDown
 
         if IsKeyMenuOrB(event.key):
             self.ReturnToUpLevelPage()