Advertisement
nux95

ListView C4D

May 30th, 2013
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.99 KB | None | 0 0
  1.  
  2. import c4d
  3. from c4d import Vector
  4. from c4d.gui import GeUserArea
  5.  
  6. class ListView(GeUserArea):
  7.     MOUSEWHEEL_MODE         = 1027215       # Registered at Plugincafe.com
  8.     SELECTEDROW_UP          = 1027216       # Registered at Plugincafe.com
  9.     SELECTEDROW_DOWN        = 1027217       # Registered at Plugincafe.com    
  10.     SELECTEDROW_CHANGED     = 1027218       # Registered at Plugincafe.com
  11.     SELECTEDROW_PREVIOUS    = 1027219       # Registered at Plugincafe.com
  12.  
  13.     colors             = {
  14.         "background":       Vector(.2),
  15.         "lighterRow":       Vector(.31),
  16.         "darkerRow":        Vector(.29),
  17.         "markedRow":        Vector(.38),
  18.         "text":             Vector(.64705),
  19.         "markedText":       Vector(1., .66, .024)
  20.     }
  21.  
  22.     def __init__(
  23.             self,
  24.             parentDialog    = None,                 # The parent-dialog, can be None if the 'Command'-Method should not be invoked on an Input-Event
  25.             initialData     = (()),                 # Data to display, must be 2 dimensional
  26.             rowHeight       = 16,                   # Height of a row in the ListView
  27.             columnWidths    = (100,),               # Widths of the columns in the ListView
  28.             minSize         = (300, 100),           # Minimum size of the area. If second is None, it will be calculated.
  29.         ):
  30.  
  31.         self.parentDialog       = parentDialog
  32.  
  33.         self.rowHeight          = rowHeight
  34.         self.columnWidths       = tuple(columnWidths)
  35.         self.data               = list(initialData)
  36.         self.selectedRow        = -1
  37.  
  38.         self.minSize            = tuple(minSize)
  39.  
  40.     # Overriden
  41.     def DrawMsg(self, x1, y1, x2, y2, msg):
  42.         """ Called when redrawing the UserArea """
  43.         self.OffScreenOn()
  44.         self.SetClippingRegion(x1, y1, x2, y2)
  45.  
  46.         self.DrawSetPen(self.colors["background"])  # Set Background Color
  47.         self.DrawRectangle(x1, y1, x2, y2)          # Fill Background
  48.  
  49.         """
  50.        Draw lighter rows
  51.        """
  52.         self.DrawSetPen(self.colors["lighterRow"])
  53.         for i in xrange(0,len(self.data), 2):           # Iterate the  specified rows
  54.             Rectangle       = {
  55.                 'x1':               0,
  56.                 'x2':               x2,
  57.                 'y1':               self.rowHeight * i,
  58.                 'y2':               self.rowHeight * (i + 1)
  59.             }
  60.             # If the selected Row is about to be drawn
  61.             if i == self.selectedRow and self.colors["markedRow"]:
  62.                 self.DrawSetPen(self.colors["markedRow"])
  63.                 self.DrawRectangle(**Rectangle)
  64.                 self.DrawSetPen(self.colors["lighterRow"])
  65.             else:
  66.                 self.DrawRectangle(**Rectangle)
  67.  
  68.         """
  69.        Draw darker rows
  70.        """
  71.         self.DrawSetPen(self.colors["darkerRow"])
  72.         for i in xrange(1,len(self.data), 2):           # Iterate the  specified rows
  73.             Rectangle       = {
  74.                 'x1':               0,
  75.                 'x2':               x2,
  76.                 'y1':               self.rowHeight * i,
  77.                 'y2':               self.rowHeight * (i + 1)
  78.             }
  79.             # If the selected Row is about to be drawn
  80.             if i == self.selectedRow and self.colors["markedRow"]:
  81.                 self.DrawSetPen(self.colors["markedRow"])
  82.                 self.DrawRectangle(**Rectangle)
  83.                 self.DrawSetPen(self.colors["darkerRow"])
  84.             else:
  85.                 self.DrawRectangle(**Rectangle)
  86.  
  87.         """
  88.        Draw data.
  89.        """
  90.         self.DrawSetTextCol(self.colors["text"], c4d.COLOR_TRANS)
  91.         for i in xrange(len(self.data)):                # Iterate the  specified rows
  92.             previousItemPosX    = x1 + 5
  93.             for j in xrange(len(self.data[i])):         # Iterate the datas columns
  94.                 if j >= len(self.columnWidths):
  95.                     width       = self.columnWidths[-1]
  96.                 else:
  97.                     width       = self.columnWidths[j]
  98.  
  99.                 textToDraw          = str(self.data[i][j])
  100.  
  101.                 # If the selected Row is about to be drawn
  102.                 if i == self.selectedRow:
  103.                     self.DrawSetTextCol(self.colors["markedText"], c4d.COLOR_TRANS)
  104.                     self.DrawText(  txt     = textToDraw,
  105.                                     x1      = x1 + previousItemPosX ,
  106.                                     y1      = y1 + i *  self.rowHeight + self.rowHeight - 14,
  107.                     )
  108.                     self.DrawSetTextCol(self.colors["text"], c4d.COLOR_TRANS)
  109.                 else:
  110.                     self.DrawText(  txt     = textToDraw,
  111.                                     x1      = x1 + previousItemPosX ,
  112.                                     y1      = y1 + i *  self.rowHeight + self.rowHeight - 14,
  113.                     )
  114.                 previousItemPosX   += width
  115.  
  116.     def InputEvent(self, msg):
  117.         inputChannel            = msg[c4d.BFM_INPUT_CHANNEL]
  118.  
  119.         # Left or Right Mousebutton
  120.         if inputChannel in (c4d.BFM_INPUT_MOUSELEFT, c4d.BFM_INPUT_MOUSERIGHT, c4d.BFM_INPUT_MOUSEMIDDLE):
  121.             positionInDialog    = self.Global2Local()
  122.             mousePosX           = msg[c4d.BFM_INPUT_X] + positionInDialog["x"]
  123.             mousePosY           = msg[c4d.BFM_INPUT_Y] + positionInDialog["y"]
  124.  
  125.             clickedRow          = int(mousePosY/self.rowHeight)
  126.  
  127.             msg[self.SELECTEDROW_PREVIOUS]  = self.selectedRow
  128.  
  129.             if clickedRow > len(self.data) - 1:
  130.                 self.selectedRow    = -1
  131.             else:
  132.                 self.selectedRow    = clickedRow
  133.  
  134.             self.Redraw()
  135.  
  136.         # MouseWheel switching of elements
  137.         elif inputChannel == c4d.BFM_INPUT_MOUSEWHEEL:
  138.             inputValue      = msg[c4d.BFM_INPUT_VALUE]
  139.             selectedRow     = self.selectedRow
  140.  
  141.             # Go up (in visual), means to go back in the list
  142.             if inputValue > 0:
  143.                 # Do not if data-begin is reached
  144.                 if selectedRow > 0:
  145.                     if self.parentDialog:
  146.                         bc         = c4d.BaseContainer()
  147.  
  148.                         bc[self.MOUSEWHEEL_MODE]        = self.SELECTEDROW_UP
  149.                         bc[self.SELECTEDROW_CHANGED]    = -1    # Selected row + SELECTEDROW_CHANGED = newSelectedRow
  150.  
  151.                         self.parentDialog.Command(self.GetId(), bc)
  152.  
  153.                     self.selectedRow   -= 1
  154.  
  155.             # Go down (in visual), means to go further in the list
  156.             elif inputValue < 0:
  157.                 # Do not if data-end is reached
  158.                 if selectedRow <= len(self.data) -2:
  159.                     if self.parentDialog:
  160.                         bc         = c4d.BaseContainer()
  161.  
  162.                         bc[self.MOUSEWHEEL_MODE]        = self.SELECTEDROW_DOWN
  163.                         bc[self.SELECTEDROW_CHANGED]    = 1     # Selected row + SELECTEDROW_CHANGED = newSelectedRow
  164.  
  165.                         self.parentDialog.Command(self.GetId(), bc)
  166.  
  167.                     self.selectedRow   += 1
  168.  
  169.             self.Redraw()
  170.  
  171.         # if parentDialog is defined, send Command-Message
  172.         if self.parentDialog:
  173.             self.parentDialog.Command(self.GetId(), msg)
  174.  
  175.  
  176.         return True
  177.  
  178.     def GetMinSize(self):
  179.         """ Returns the minimum size of the area. """
  180.  
  181.         # >>> New implementation:
  182.         minh = self.rowHeight * len(self.data)
  183.         if self.minSize[1] > minh:
  184.             minh = self.minSize[1]
  185.  
  186.         minw = self.minSize[0]
  187.         return minw, minh
  188.  
  189.     # Getters
  190.     def GetMinHeight(self):
  191.         return self.minSize[1]
  192.  
  193.     def GetSelectedRow(self):
  194.         return self.selectedRow
  195.  
  196.     def GetRowHeight(self):
  197.         return self.rowHeight
  198.  
  199.     def GetColumnWidths(self):
  200.         return self.columnWidths
  201.  
  202.     def GetParentDialog(self):
  203.         return self.parentDialog
  204.  
  205.     # Setters
  206.     def SetColors(self, **kwargs):
  207.         for k, v in kwargs.iteritems():
  208.             if k in self.colors.keys():
  209.                 self.colors[k]  = v
  210.  
  211.     def SetData(self, data):
  212.         self.data   = data
  213.  
  214.     def SetRowHeight(self, height):
  215.         self.rowHeight      = height
  216.         self.minSize[1]     = self.rowHeight * len(self.data)
  217.  
  218.     def SetColumnWidths(self, columnWidths):
  219.         self.columnWidths   = columnWidths
  220.  
  221.     def SetSelectedRow(self, index):
  222.         if index >= len(self.data):
  223.             self.selectedRow    = -1
  224.             return False
  225.         else:
  226.             self.selectedRow    = index
  227.             return True
  228.  
  229.     def SetParentDialog(self, parent):
  230.         self.parentDialog       = parent
  231.  
  232.     # Adders
  233.     def AppendData(self, data):
  234.         self.data.append(data)
  235.  
  236.     def InsertData_AtIndex(self, data, index):
  237.         if index > len( self.data ):
  238.             return False
  239.         else:
  240.             self.data.insert(index, data)
  241.  
  242.     # Removers
  243.     def RemoveData(self, subData):
  244.         if subData in self.data:
  245.             del self.data[ self.data.index(subData) ]
  246.             return True
  247.         else:
  248.             return False
  249.  
  250.     def RemoveData_ByIndex(self, index):
  251.         if index > len( self.data ):
  252.             return False
  253.         else:
  254.             del self.data[index]
  255.  
  256.     # Update
  257.     pass
  258.  
  259. class Dialog(c4d.gui.GeDialog):
  260.  
  261.     def CreateLayout(self):
  262.         self.ua = ListView(self)
  263.         flags = c4d.SCROLLGROUP_HORIZ | c4d.SCROLLGROUP_VERT
  264.         if self.ScrollGroupBegin(0, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT, flags, 100, 100):
  265.             self.AddUserArea(1000, c4d.BFH_SCALEFIT | c4d.BFV_SCALEFIT)
  266.             self.AttachUserArea(self.ua, 1000)  
  267.             self.GroupEnd()  
  268.  
  269.         return True
  270.  
  271.     def Command(self, id, msg):
  272.         if id == 1000:
  273.             self.ua.AppendData('What beautiful day'.split())
  274.             self.ua.Redraw()
  275.             self.LayoutChanged(1000)
  276.         return True
  277.  
  278. dlg = Dialog()
  279. dlg.Open(c4d.DLG_TYPE_MODAL_RESIZEABLE)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement