Ticket #69: selection-ranges.museek+.diff

File selection-ranges.museek+.diff, 5.2 kB (added by alangrow@…, 20 months ago)
  • mucous/pymucous/MucousInput.py

    # To reduce the tedium of typing out /download 1, /download 2, and so on,
    # here is a patch that adds support for integer sets and ranges as arguments
    # to /download, /abort{d,u}, /remove{d,u} and /retry. After the patch you 
    # can address multiple list items like so: /download 1-10,13,17,29-31.
    # A more generic solution might be a /select command with the same syntax,
    # and a corresponding key to select or unselect the currently highlighted
    # item. Think message tagging in mutt.
    #
     
    44import os   
    55import threading 
    66import curses.wrapper 
     7import re 
    78## Input line  
    89# :: Here we detect which keys have been pressed 
    910#class CharacterParse(threading.Thread): 
     
    11171118                        return line 
    11181119                except Exception, e: 
    11191120                        self.mucous.Help.Log("debug", "MouseXY: "+str(e) ) 
    1120          
     1121 
     1122        def ParseIntegerSet(self, s): 
     1123                trim = re.compile('(^\s+|\s+$)') 
     1124                sequence = re.compile('\s*,\s*') 
     1125                interval = re.compile('(\d+)\s*-\s*(\d+)') 
     1126 
     1127                s = trim.sub('', s) 
     1128                nums = set() 
     1129 
     1130                for i in sequence.split(s): 
     1131                        if i.isdigit(): 
     1132                                nums.add(int(i)) 
     1133                        elif interval.match(i): 
     1134                                a, b = interval.match(i).groups() 
     1135                                for j in range(int(a), int(b)+1): 
     1136                                        nums.add(j) 
     1137                        else: 
     1138                                return 
     1139 
     1140                return nums 
     1141 
    11211142        ## Parse Entry box for commands 
    11221143        # @param self is mucous 
    11231144        # @param line is a text string 
     
    18171838                                         
    18181839                        elif command in ("/download", "/downdir") and args != "": 
    18191840                                linput = args 
     1841                                nums = self.ParseIntegerSet(linput) 
     1842 
     1843                                if nums == None: 
     1844                                                self.mucous.Help.Log("status", "Enter an Integer or Range") 
     1845                                                return 
     1846                                                                                                                          
    18201847                                if command == "/download": 
    18211848                                        dtype = "file" 
    18221849                                elif command == "/downdir": 
    18231850                                        dtype = "dir" 
    1824                                 if linput == None or not linput.isdigit(): 
    1825                                         self.mucous.Help.Log("status", "Enter an Integer") 
    1826                                          
    1827                                 else: 
     1851 
     1852                                for i in nums: 
    18281853                                        if self.mucous.mode == "search": 
    1829                                                 user, path = self.mucous.Search.GetDownloadFromNum(linput) 
     1854                                                user, path = self.mucous.Search.GetDownloadFromNum(i) 
    18301855                                                 
    18311856                                        elif self.mucous.mode == "browse":       
    1832                                                 user, path = self.mucous.BrowseShares.GetDownloadFromNum(linput) 
     1857                                                user, path = self.mucous.BrowseShares.GetDownloadFromNum(i) 
    18331858                                        else: 
    18341859                                                return 
    18351860                                         
     
    18381863                                        elif dtype == "dir": 
    18391864                                                self.mucous.Transfers.FolderDownload(user, path) 
    18401865                                                 
    1841                                                  
    18421866                        elif command == "/filter" and args != '': 
    18431867                                 
    18441868                                self.mucous.Search.sfilter = args 
     
    19141938                                Manage Transfers 
    19151939                                ''' 
    19161940                        elif command in ("/abortd", "/abortdown") and args != '': 
    1917                                 transfer = None 
    1918                                 if args.isdigit(): 
    1919                                         transfer = int(args) 
    1920                                 else: 
    1921                                         self.mucous.Help.Log("status", "Enter an Integer") 
    1922                                 if transfer != None: 
     1941                                nums = self.ParseIntegerSet(args) 
     1942 
     1943                                if nums == None: 
     1944                                        self.mucous.Help.Log("status", "Enter an Integer or Range") 
     1945                                        return 
     1946 
     1947                                for transfer in nums: 
    19231948                                        user, path = self.mucous.Transfers.GetDownloadFromNum(transfer) 
    19241949                                        self.mucous.Transfers.AbortDownload(user, path) 
    19251950                                         
    19261951                        elif command in ("/abortu", "/abortup") and args != '': 
    1927                                 transfer = None 
    1928                                 try: 
    1929                                         transfer = int(args) 
    1930                                 except: 
    1931                                         self.mucous.Help.Log("status", "Enter an Integer") 
    1932                                 if transfer != None: 
     1952                                nums = self.ParseIntegerSet(args) 
     1953 
     1954                                if nums == None: 
     1955                                        self.mucous.Help.Log("status", "Enter an Integer or Range") 
     1956                                        return 
     1957 
     1958                                for transfer in nums: 
    19331959                                        user, path = self.mucous.Transfers.GetUploadFromNum(transfer) 
    19341960                                        self.mucous.Transfers.AbortUpload(user, path) 
    19351961                                 
    19361962                        elif command in ("/removeu", "/removeup") and args != '': 
    1937                                 transfer = None 
    1938                                 try: 
    1939                                         transfer = int(args) 
    1940                                 except: 
    1941                                         self.mucous.Help.Log("status", "Enter an Integer") 
    1942                                 if transfer != None: 
     1963                                nums = self.ParseIntegerSet(args) 
     1964 
     1965                                if nums == None: 
     1966                                        self.mucous.Help.Log("status", "Enter an Integer or Range") 
     1967                                        return 
     1968 
     1969                                for transfer in nums: 
    19431970                                        user, path = self.mucous.Transfers.GetUploadFromNum(transfer) 
    19441971                                        self.mucous.Transfers.ClearUpload(user, path) 
    1945                                  
    1946                                          
    19471972                 
    19481973                        elif command in ("/removed", "/removedown") and args != '': 
    1949                                 transfer = None 
    1950                                 try: 
    1951                                         transfer = int(args) 
    1952                                 except: 
    1953                                         self.mucous.Help.Log("status", "Enter an Integer") 
    1954                                 if transfer != None: 
     1974                                nums = self.ParseIntegerSet(args) 
     1975 
     1976                                if nums == None: 
     1977                                        self.mucous.Help.Log("status", "Enter an Integer or Range") 
     1978                                        return 
     1979 
     1980                                for transfer in nums: 
    19551981                                        user, path = self.mucous.Transfers.GetDownloadFromNum(transfer) 
    19561982                                        self.mucous.Transfers.ClearDownload(user, path) 
    1957                                  
    19581983 
    19591984                        elif command == "/retry" and args != '': 
    1960                                 transfer = None 
    1961                                 try: 
    1962                                         transfer = int(args) 
    1963                                 except: 
    1964                                         self.mucous.Help.Log("status", "Enter an Integer") 
    1965                                 if transfer != None: 
     1985                                nums = self.ParseIntegerSet(args) 
     1986 
     1987                                if nums == None: 
     1988                                        self.mucous.Help.Log("status", "Enter an Integer or Range") 
     1989                                        return 
     1990 
     1991                                for transfer in nums: 
    19661992                                        user, path = self.mucous.Transfers.GetDownloadFromNum(transfer) 
    19671993                                        self.mucous.Transfers.RetryDownload(user, path) 
    19681994