00001 import BigWorld, GUI
00002
00003 import math
00004
00005 from PyGUIBase import PyGUIBase
00006
00007 class Console( PyGUIBase ):
00008
00009 factoryString = "PyGUI.Console"
00010
00011 def __init__( self, component ):
00012 PyGUIBase.__init__( self, component )
00013 component.script = self
00014
00015
00016 self.maxLines = 255
00017
00018
00019 self.lines = []
00020
00021
00022
00023
00024
00025 self.displayLines = []
00026
00027
00028 self.lineLength = component.visibleWidth()
00029
00030
00031 self.numOfLines = component.visibleHeight()
00032
00033
00034 self.scrollIndex = 0
00035
00036
00037 self.editColour = (255, 255, 255, 255)
00038
00039
00040 self.component.cursor = (0, 0)
00041
00042 self.setEditColour( self.editColour )
00043 self.setEditCursor( (0, 0) )
00044 self.setPosition( self.component.position )
00045
00046
00047 def onSave( self, dataSection ):
00048 PyGUIBase.onSave( self, dataSection )
00049
00050
00051 def onLoad( self, dataSection ):
00052 PyGUIBase.onLoad( self, dataSection )
00053
00054
00055 def onRecreateDevice( self ):
00056 self.displayLines = []
00057 for line in self.lines:
00058 self._addDisplayLine( line[0], line[1] )
00059 self.redraw()
00060
00061
00062 @staticmethod
00063 def create():
00064 c = GUI.Console()
00065 return Console( c ).component
00066
00067
00068 def getMaxLines( self ):
00069 return self.maxLines
00070
00071
00072 def setMaxLines( self, maxLines ):
00073 if self.maxLines > 0:
00074 self.clear()
00075 self.maxLines = maxLines
00076 self.redraw()
00077
00078
00079 def addLine( self, str, colour = (255, 255, 255, 255) ):
00080
00081 if len( self.lines ) == self.maxLines:
00082
00083 ( line, colour ) = self.lines[0]
00084
00085 n = int(math.ceil( len( line ) / self.lineLength )) + 1
00086 self.displayLines = self.displayLines[n:]
00087
00088 self.lines = self.lines[1:]
00089
00090 self.lines.append( (str, colour) )
00091
00092 self._addDisplayLine( str, colour )
00093
00094 self.redraw()
00095
00096
00097 def appendLine( self, str, colour = (255, 255, 255, 255) ):
00098 ( line, colour ) = self.lines.pop()
00099 n = int(math.ceil( len( line ) / self.lineLength ))
00100 self.displayLines = self.displayLines[ 0: int( len( self.displayLines ) - n) - 1 ]
00101 self.addLine( line + str, colour )
00102
00103
00104 def _addDisplayLine( self, str, colour ):
00105
00106 if len(str) <= self.lineLength:
00107 self.displayLines.append( (str,colour) )
00108 else:
00109 while len(str) > self.lineLength:
00110 line = str[:self.lineLength]
00111 idx = line.rfind(' ')
00112 if idx == -1:
00113 line = str[:self.lineLength]
00114 str = str[self.lineLength:]
00115 else:
00116 line = str[:idx]
00117 str = str[idx+1:]
00118 self.displayLines.append( (line,colour) )
00119 if len(str) > 0:
00120 self.displayLines.append( (str,colour) )
00121
00122
00123
00124 self.scrollIndex = len(self.displayLines) - self.numOfLines
00125 if self.scrollIndex < 0:
00126 self.scrollIndex = 0
00127
00128
00129 def clear( self ):
00130 self.lines = []
00131 self.displayLines = []
00132 self.scrollIndex = 0
00133 self.redraw()
00134
00135
00136 def scrollUp( self ):
00137 if self.scrollIndex > 0:
00138 self.scrollIndex -= 1
00139 self.redraw()
00140
00141
00142 def scrollDown( self ):
00143 if self.scrollIndex < len( self.displayLines ) - self.numOfLines:
00144 self.scrollIndex += 1
00145 self.redraw()
00146
00147
00148 def getScrollIndex( self ):
00149 return self.scrollIndex
00150
00151
00152 def setScrollIndex( self, index ):
00153 if index < 0:
00154 self.scrollIndex = 0
00155 elif index > len( self.displayLines ) - self.numOfLines:
00156 self.scrollIndex = len( self.displayLines ) - self.numOfLines
00157 else:
00158 self.scrollIndex = index
00159 self.redraw()
00160
00161
00162 def getLineLength( self ):
00163 return self.lineLength
00164
00165
00166 def setLineLength( self, length ):
00167 lineLength = length
00168 if lineLength > self.component.visibleWidth():
00169 lineLength = self.component.visibleWidth()
00170 self.lineLength = lineLength
00171 self.component.editLineLength = lineLength
00172 self.redraw()
00173
00174
00175 def getNumberOfLines( self ):
00176 return self.numOfLines
00177
00178
00179 def setNumberOfLines( self, numOfLines ):
00180 self.numOfLines = numOfLines
00181 if self.numOfLines > self.component.visibleHeight():
00182 self.numOfLines = self.component.visibleHeight()
00183 self.redraw()
00184
00185
00186 def getPosition( self ):
00187 return self.component.position
00188
00189
00190 def setPosition( self, position ):
00191 self.component.position = position
00192 self.redraw()
00193
00194
00195 def getEditCursor( self ):
00196 return (self.component.editCol, self.component.editRow)
00197
00198
00199 def setEditCursor( self, cursorPos ):
00200 self.component.editCol = cursorPos[0]
00201 self.component.editRow = cursorPos[1]
00202 self.setEditColour( self.editColour )
00203 self.redraw()
00204
00205
00206 def enableEdit( self ):
00207 self.component.editEnable = True
00208
00209
00210 def disableEdit( self ):
00211 self.component.editEnable = False
00212
00213
00214 def getEditPrompt( self ):
00215 return self.component.editPrompt
00216
00217
00218 def setEditPrompt( self, prompt ):
00219 self.component.editPrompt = prompt
00220
00221
00222 def getEditText( self ):
00223 return self.component.editText
00224
00225
00226 def setEditText( self, text ):
00227 self.component.editText = text[0:self.lineLength]
00228
00229
00230 def editCallback( self, callback ):
00231 self.component.editCallback = callback
00232
00233
00234 def setEditColour( self, colour ):
00235 self.editColour = colour
00236 self.component.editColour = colour
00237
00238 def consolePixelSize( self ):
00239 widthMode = self.component.widthMode
00240 self.component.widthMode = "PIXEL"
00241
00242 heightMode = self.component.heightMode
00243 self.component.heightMode = "PIXEL"
00244
00245 width = self.component.width
00246 height = self.component.height
00247
00248 self.component.widthMode = widthMode
00249 self.component.heightMode = heightMode
00250
00251 return (width, height)
00252
00253
00254 def redraw( self ):
00255
00256
00257 console = self.component
00258 console.clear()
00259
00260
00261 startIndex = self.scrollIndex
00262 endIndex = startIndex + self.numOfLines
00263 displayLines = self.displayLines[startIndex : endIndex]
00264
00265
00266 if len( displayLines ) < self.numOfLines:
00267 row = self.numOfLines - len( displayLines )
00268 else:
00269 row = 0
00270
00271
00272 for line in displayLines:
00273 str = line[0]
00274 colour = line[1]
00275
00276 console.cursor = (0, row)
00277 console.lineColour = colour
00278 console.prints( str )
00279
00280 row += 1
00281
00282
00283 if self.component.editEnable:
00284 self.setEditColour( self.editColour )