def updateDetails(*args, **kwargs): """ A macro function that will update one Details-sheet while preserving previous user data. Movelister can have multiple Details-views. To determine which one is updated, the code checks which Overview button was pressed to trigger the macro. """ try: if not Sheet.checkTemplatesExists(): message_box.showWarningWithOk( 'This file doesn\'t seem to have all necessary templates. Can\'t generate.' ) return # Get Overview sheet name from active sheet or from provided kwargs. activeOverviewName = kwargs.get('activeSheet', helper.getActiveSheetName()) # Get view name for the Details. This is presented in Overview sheet name inside parentheses. viewName = names.getViewName(activeOverviewName) detailsSheetName = names.getDetailsName(viewName) previousDetails = Details(viewName) if Sheet.hasByName(detailsSheetName): # Check if user wants to update existing Details-sheet. if not message_box.showSheetUpdateWarning(): return previousDetails = Details.fromSheet(detailsSheetName) modifiersSheet = Modifiers(MODIFIER_LIST_SHEET_NAME) parentOverview = Overview.fromSheet(activeOverviewName) # Create new Details sheet by combining new and existing data. newDetails = UpdateDetails.update(modifiersSheet, parentOverview, previousDetails, viewName) # Delete previous Details-sheet and generate a new one. Sheet.deleteSheetByName(detailsSheetName) formatter = DetailsFormatter(newDetails, parentOverview) unoDetailsSheet = formatter.generate() # Make columns width optimal. length = cursor.getWidth(unoDetailsSheet) format.setOptimalWidthToRange(unoDetailsSheet, 0, length) # Generate data validation. validation.setDataValidationToDetailsSheet(unoDetailsSheet, viewName) # Generate named ranges. about = About(ABOUT_SHEET_NAME) if about.isGenerateNamedRangesOn(): NamedRanges(unoDetailsSheet, 0, viewName).generate() # Generate cell styles used for details sheet. UpdateStyles.update() # Create conditional format ranges to the new details sheet which uses # styles created above. masterSheet = Master(MASTER_LIST_SHEET_NAME) resultsSheet = Results(RESULT_LIST_SHEET_NAME) inputSheet = Inputs(INPUT_LIST_SHEET_NAME) conditionalFormat.createDetailsConditionalFormats( unoDetailsSheet, masterSheet, resultsSheet, inputSheet, viewName) # Set new sheet as currently active sheet. helper.setActiveSheet(unoDetailsSheet) except errors.MovelisterError as e: helper.setActiveSheet(e.activeSheet) message_box.showWarningWithOk(str(e))
def testGenerate(self): """ Test generating new Overview-sheet from template, then assert that the sheet really exists and has generated content in it. """ modifier1 = Modifier('aa') modifier2 = Modifier('bb') modifier3 = Modifier('cc') self.overview.modifiers = [modifier1, modifier2, modifier3] modAct1 = Action('attack 1', phases=2, hitPhase=1, default=True) modAct1.addModifier(0, Modifier('aa')) modAct1.addModifier(1, Modifier('bb')) self.overview.addAction(modAct1) formatter = OverviewFormatter(self.overview) formatter.generate(1) sheet = Sheet.getByName(names.getOverviewName(self.sheetName)) data = cursor.getSheetContent(sheet) self.assertEqual( data, [['', '', '', '', '', '', '', '', '', '', ''], [ 'Action Name', 'Hit', 'Frames', 'Phase', 'DEF', 'aa', 'bb', 'cc', 'Notes 1', 'Notes 2', 'Notes 3' ], ['attack 1', '', '', '0', 'x', 'x', '', '', '', '', ''], ['attack 1', 'x', '', '1', 'x', '', 'x', '', '', '', '']])
def testInputsConditionalFormats(self): inputSheet = Inputs(INPUT_LIST_SHEET_NAME) detailsUnoSheet = Sheet.getByName(self.detailsName) inputsConditionalFormat = conditionalFormat.createInputsConditionalFormat( detailsUnoSheet, inputSheet, self.view) self.assertGreater(inputsConditionalFormat.getCount(), 0) self.assertIn('Entry1', inputsConditionalFormat.getElementNames())
def _readSheetContent(self): self.sheet = Sheet.getByName(self.name) self.data = cursor.getSheetContent(self.sheet) self.headerRowIndex = helper.getHeaderRowPosition(self.data) self.dataBeginRow = self.headerRowIndex + 1 self.nameColumnIndex = helper.getColumnPosition( self.data, 'Action Name', 0) self.hitColumnIndex = helper.getColumnPosition(self.data, 'Hit', 1) self.framesColumnIndex = helper.getColumnPosition( self.data, 'Frames', 2) self.phaseColumnIndex = helper.getColumnPosition(self.data, 'Phase', 3) self.defaultColumnIndex = helper.getColumnPosition(self.data, 'DEF', 4) self.notesIndex1 = helper.getColumnPosition(self.data, 'Notes 1', 5) self.notesIndex2 = helper.getColumnPosition(self.data, 'Notes 2', 6) self.notesIndex3 = helper.getColumnPosition(self.data, 'Notes 3', 7) self.dataHeader = self.data[self.headerRowIndex] self.dataRows = self._dataRows() self.modifierStartColumn = self.dataHeader.index( MODIFIER_START_COLUMN_NAME) + 1 self.modifierEndColumn = self.dataHeader.index( MODIFIER_END_COLUMN_NAME) self.modifiers = self._readModifiers() self.actionNames = self._getUniqueActionNames() self._actions = self._readActions() self._highestPhase = self._getHighestPhase()
def testResultsConditionalFormats(self): resultsSheet = Results(RESULT_LIST_SHEET_NAME) detailsUnoSheet = Sheet.getByName(self.detailsName) resultsConditionalFormat = conditionalFormat.createResultsConditionalFormat( detailsUnoSheet, resultsSheet) self.assertGreater(resultsConditionalFormat.getCount(), 0) self.assertIn('Entry1', resultsConditionalFormat.getElementNames())
def testActionConditionalFormats(self): masterSheet = Master(MASTER_LIST_SHEET_NAME) detailsUnoSheet = Sheet.getByName(self.detailsName) actionConditionalFormat = conditionalFormat.createActionConditionalFormats( detailsUnoSheet, masterSheet, self.view) self.assertGreater(actionConditionalFormat.getCount(), 0) self.assertIn('Entry1', actionConditionalFormat.getElementNames())
def testNewSheetRightOf(self): rightOfName = MASTER_LIST_SHEET_NAME name = 'test sheet' sheet = Sheet.newSheetRightOf(rightOfName, name) self.assertEqual(sheet.getName(), name) names = Context.getDocument().Sheets.getElementNames() index = names.index(rightOfName) self.assertEqual(names.index(name), index + 1)
def generate(self): """ Generate new Details sheet by copying template sheet and placing formatted Details class instance data in it. """ sheet = Sheet.newDetails(self.parentOverviewName, self.instance.name) cursor.setSheetContent(sheet, self.format()) return sheet
def generate(self, overviewSheetPosition): """ Generate new Overview sheet by copying template sheet to given position and placing formatted Overview class instance data in it. """ sheet = Sheet.newOverview(self.instance.name, overviewSheetPosition) cursor.setSheetContent(sheet, self.format()) return sheet
def testNewSheetLeftOf(self): leftOfName = MODIFIER_LIST_SHEET_NAME name = 'test sheet' sheet = Sheet.newSheetLeftOf(leftOfName, name) self.assertEqual(sheet.getName(), name) names = Context.getDocument().Sheets.getElementNames() index = names.index(leftOfName) self.assertEqual(names.index(name), index - 1)
def __init__(self, sheetName): self.name = sheetName self.sheet = Sheet.getByName(sheetName) self.data = cursor.getSheetContent(self.sheet) self.dataBeginRow = 2 self.optionsColumnIndex = 0 self.generateNamedRangesIndex = helper.getRowPosition( self.data, 'Generate Named Ranges:', self.optionsColumnIndex) self.showEntriesAscendingIndex = helper.getRowPosition( self.data, 'Show entries ascending when generating validation:', self.optionsColumnIndex) self.OptionsColors = helper.getCellColorsFromColumn( self.sheet, 1, self.dataBeginRow, len(self.data))
def __init__(self, sheetName): self.name = sheetName self.sheet = Sheet.getByName(sheetName) self.data = cursor.getSheetContent(self.sheet) self.headerRowIndex = helper.getHeaderRowPosition(self.data) self.dataBeginRow = self.headerRowIndex + 1 self.resultColumnIndex = helper.getColumnPosition( self.data, 'Results', 0) self.colorColumnIndex = helper.getColumnPosition(self.data, 'Color', 1) self.dataRows = self.data[self.dataBeginRow:] self.resultNames = self._parseResults() self.resultColors = helper.getCellColorsFromColumn( self.sheet, self.colorColumnIndex, self.dataBeginRow, len(self.data))
def __init__(self, sheetName): self.name = sheetName self.sheet = Sheet.getByName(sheetName) self.data = cursor.getSheetContent(self.sheet) self.headerRowIndex = helper.getHeaderRowPosition(self.data) self.dataBeginRow = self.headerRowIndex + 1 self.inputsColumnIndex = helper.getColumnPosition( self.data, 'Input List', 0) self.nameColumnIndex = helper.getColumnPosition( self.data, 'Input Name', 1) self.buttonColumnIndex = helper.getColumnPosition( self.data, 'Button', 2) self.colorColumnIndex = helper.getColumnPosition(self.data, 'Color', 3) self.dataHeader = self.data[self.headerRowIndex] self.dataRows = self.data[self.dataBeginRow:] self.inputColors = helper.getCellColorsFromColumn( self.sheet, self.colorColumnIndex, self.dataBeginRow, len(self.data)) self.inputs = self._parseInputs()
def testNewSheetWithExistingName(self): with self.assertRaises(RuntimeException): Sheet.newSheet(MASTER_LIST_SHEET_NAME, 0)
def setUp(self): super().setUp() self.detailsUnoSheet = Sheet.getByName('Details (Default)')
def testGetPosition(self): position = Sheet.getPosition(MODIFIER_LIST_SHEET_NAME) self.assertEqual(position, 4)
def updateOverview(*args, **kwargs): """ A macro function to update or create a new Overview sheet. Updated sheet will include earlier user data in the old Overview if any. """ try: if not Sheet.checkTemplatesExists(): message_box.showWarningWithOk( 'This file doesn\'t seem to have all necessary templates. Can\'t generate.' ) return # Get name of the Overview which user wants to generate. masterSheet = Master(MASTER_LIST_SHEET_NAME) activeSheetName = kwargs.get('activeSheet', '') if activeSheetName == '': viewName = masterSheet.getOverviewName() overviewSheetName = names.getOverviewName(viewName) else: viewName = names.getViewName(activeSheetName) overviewSheetName = activeSheetName # Some error checking. if not viewName: message_box.showWarningWithOk( 'You can\'t generate an Overview if no View-name is set in cell C1.' ) return if viewName not in masterSheet.getViewNames(): message_box.showWarningWithOk( 'You can\'t generate a View that has no Actions. Make sure at least one ' + 'Action uses the View-name written in cell C1 before continuing.' ) return oldOverview = Overview(viewName) # If document has existing Overview, then that is set as previous instead. if Sheet.hasByName(overviewSheetName): # Check if user wants to update existing Overview. if not message_box.showSheetUpdateWarning(): return oldOverview = Overview.fromSheet(overviewSheetName) newOverview = UpdateOverview.update(oldOverview, viewName) # Place new Overview sheet on the same position as the previous one. If previous one # does not exist, then place right of the Master sheet instead. position = Sheet.getPosition(overviewSheetName) if not position: position = Sheet.getPosition(MASTER_LIST_SHEET_NAME) + 1 # Delete old sheet if exists. Sheet.deleteSheetByName(overviewSheetName) # Generate a new one. formatter = OverviewFormatter(newOverview) unoOverviewSheet = formatter.generate(position) # Make columns width optimal. length = cursor.getWidth(unoOverviewSheet) format.setOptimalWidthToRange(unoOverviewSheet, 0, length) # Fix sheet colors. formatter.setOverviewModifierColors(overviewSheetName) # Set new sheet as currently active sheet. helper.setActiveSheet(unoOverviewSheet) except errors.MovelisterError as e: helper.setActiveSheet(e.activeSheet) message_box.showWarningWithOk(str(e))
def testGetSheetContent(self): masterSheet = Sheet.getByName(MASTER_LIST_SHEET_NAME) data = cursor.getSheetContent(masterSheet) for row in data: self.assertIsInstance(row, list)
def testGetWrongPosition(self): self.assertEqual(Sheet.getPosition('fails'), None)
def testGetSheetNames(self): names = Sheet.getSheetNames() for name in names: self.assertIsInstance(name, str)
def __init__(self, activeSheetName, message): Exception.__init__(self, message) self.activeSheet = Sheet.getByName(activeSheetName)
def testNewSheet(self): newName = 'test sheet' sheet = Sheet.newSheet(newName, 0) self.assertEqual(sheet.getName(), newName)
def testNewOverview(self): name = 'test' overviewName = names.getOverviewName(name) sheet = Sheet.newOverview(overviewName, 0) self.assertEqual(sheet.Name, overviewName) self.assertTrue(overviewName in Sheet.getSheetNames())
def testNewSheetRightOfWithWrongName(self): rightOfName = 'fail' self.assertEqual(Sheet.newSheetRightOf(rightOfName, 'will fail'), None)