def toggle(control: wx.CheckBox) -> bool: """ Toggle value of the given control. Usually used for checkboxes. :param control: """ if control.IsEnabled(): control.SetValue(not control.GetValue()) return True return False
def construct_entry_control(self, entry): """Creates the primary entry control""" if 'boolean' == entry.var_type: control = CheckBox( self.scrolled_panel, name=entry.key_name ) control.SetValue(entry.current) elif 'number' == entry.var_type: control = SpinCtrl( self.scrolled_panel, name=entry.key_name, ) control.SetValue(entry.current) else: control = TextCtrl( self.scrolled_panel, value=str(entry.current), name=entry.key_name, size=(-1, -1) ) self.grid_sizer.Add(control, -1, EXPAND)
class TodoistConfigurationPanel(AbstractConfigurationPanel): def __init__(self, parent: Notebook): self._cacheOptionControl: CheckBox = cast(CheckBox, None) self._tasksInParentOption: CheckBox = cast(CheckBox, None) self._parentProjectNameContainer: TextContainer = cast(TextContainer, None) super().__init__(parent) self.SetSizerType('vertical') self._textId: int = cast(int, None) self.Bind(EVT_CHECKBOX, self.__onCacheOption, self._cacheOptionControl) self.Bind(EVT_CHECKBOX, self.__onTasksInParentProject, self._tasksInParentOption) def _createControls(self): """ Creates the panel's controls and stashes them as private instance variables """ self._textId = wxNewIdRef() self._cacheOptionControl = CheckBox(parent=self, label="Allow Todoist Cache Cleanup", id=ID_ANY) self._tasksInParentOption = CheckBox(parent=self, label="Single Todoist Project", id=ID_ANY) self._parentProjectNameContainer = TextContainer(parent=self, labelText='Todoist Project Name:', valueChangedCallback=self.__onParentProjectNameChange) def _setControlValues(self): """ Set the current configuration values on the controls. """ chkBoxValue: bool = self._preferences.singleTodoistProject self._tasksInParentOption.SetValue(chkBoxValue) self._parentProjectNameContainer.textValue = self._preferences.todoistProjectName if chkBoxValue is False: self._parentProjectNameContainer.textControlEnabled(False) if self._preferences.cleanTodoistCache is True: self._cacheOptionControl.SetValue(True) else: self._cacheOptionControl.SetValue(False) def __onParentProjectNameChange(self, newValue: str): self._preferences.todoistProjectName = newValue def __onTasksInParentProject(self, event: CommandEvent): if event.IsChecked() is True: self._preferences.singleTodoistProject = True self._parentProjectNameContainer.textControlEnabled(True) else: self._preferences.singleTodoistProject = False self._parentProjectNameContainer.textControlEnabled(False) def __onCacheOption(self, event: CommandEvent): if event.IsChecked() is True: self._preferences.cleanTodoistCache = True else: self._preferences.cleanTodoistCache = False
class SaveSettings(object): def __init__(self, master, saveDirVal = None, backupDirVal = None): self.master = master saveDirSizer = BoxSizer(HORIZONTAL) self.saveDir = TextCtrl(master, size = (600, -1) ) if saveDirVal: self.saveDir.SetValue(saveDirVal) saveDirSizer.Add(StaticText(master, label = "Save directory"), 0, EXPAND ) saveDirSizer.Add(self.saveDir, 1, EXPAND) selectSaveDir = Button(master, -1, "Select") saveDirSizer.Add(selectSaveDir, 0, EXPAND) master.Bind(EVT_BUTTON, self._on_select_save_dir, selectSaveDir) openSave = Button(master, label = "Open") saveDirSizer.Add(openSave, 0, EXPAND) master.Bind(EVT_BUTTON, self._on_open_save_dir, openSave) hide = Button(master, label = "Hide") saveDirSizer.Add(hide, 0, EXPAND) master.Bind(EVT_BUTTON, self._on_hide, hide) backupDirSizer = BoxSizer(HORIZONTAL) self.backupDir = TextCtrl(master) if backupDirVal: self.backupDir.SetValue(backupDirVal) backupDirSizer.Add(StaticText(master, label = "Backup directory"), 0, EXPAND ) backupDirSizer.Add(self.backupDir, 1, EXPAND) switch = Button(master, label = "Switch") master.Bind(EVT_BUTTON, self._on_switch, switch) backupDirSizer.Add(switch, 0, EXPAND) override = Button(master, label = "Overwrite") master.Bind(EVT_BUTTON, self._on_overwrite, override) backupDirSizer.Add(override, 0, EXPAND) selectBackupDir = Button(master, -1, "Select") master.Bind(EVT_BUTTON, self._on_select_backup_dir, selectBackupDir) backupDirSizer.Add(selectBackupDir, 0, EXPAND) openBackup = Button(master, label = "Open") backupDirSizer.Add(openBackup, 0, EXPAND) master.Bind(EVT_BUTTON, self._on_open_backup_dir, openBackup) filterOutSizer = BoxSizer(HORIZONTAL) filterOutSizer.Add(StaticText(master, label = "Filter Out"), 0, EXPAND) self.filterOut = TextCtrl(master) filterOutSizer.Add(self.filterOut, 1, EXPAND) self.cbMonitor = CheckBox(master, label = "Monitor") master.Bind(EVT_CHECKBOX, self._on_monitor, self.cbMonitor) self.sizer = sizer = BoxSizer(VERTICAL) sizer.Add(saveDirSizer, 0, EXPAND) sizer.Add(backupDirSizer, 0, EXPAND) sizer.Add(filterOutSizer, 0, EXPAND) sizer.Add(self.cbMonitor, 0, EXPAND) self.settingsWidgets = [ selectSaveDir, self.saveDir, self.backupDir, switch, selectBackupDir, self.filterOut ] def _on_overwrite(self, _): self.ask_and_overwrite() def ask_and_overwrite(self): backupDir = self.backupDir.GetValue() savePath = self.saveDir.GetValue() if not (isdir(backupDir) and bool(savePath)): with MessageDialog(self.master, "Set paths up!", "Error") as dlg: dlg.ShowModal() return False repo = Repo(backupDir) if repo.is_dirty(): with MessageDialog(self.master, "Backup repository '%s' is dirty" % backupDir, "Error") as dlg: dlg.ShowModal() return False active_branch = repo.active_branch try: c = active_branch.commit except Exception as e: hint = "" try: if active_branch.name == "master": hint = "Is backup empty?" except: pass with MessageDialog(self.master, str(e) + "\n" + hint, "Error") as dlg: dlg.ShowModal() return False label = commit_time_str(c) + " | " + c.message dlg = MessageDialog(self.master, "Do you want to overwrite save data with current version?\n\n" + "SHA1: %s\n\n%s\n\n" % (c.hexsha, label) + "Files in save directory will be overwritten!", "Confirmation is required", YES_NO ) switch = dlg.ShowModal() == ID_YES dlg.Destroy() if not switch: return False self._switch_to(c) return True def _on_switch(self, _): backupDir = self.backupDir.GetValue() if not isdir(backupDir): return with BackupSelector(self.master, backupDir) as dlg: res = dlg.ShowModal() if res != ID_OK: return target = dlg.target try: self._switch_to(target) except BaseException as e: with MessageDialog(self.master, str(e), "Error") as dlg: dlg.ShowModal() def _switch_to(self, target): repo = Repo(self.backupDir.GetValue()) if repo.is_dirty(): raise RuntimeError("Backup repository is dirty") active = repo.active_branch cur = active.commit if cur.hexsha != target.hexsha: # select name for backup branch backups = [] need_head = True for h in repo.heads: mi = backup_re.match(h.name) if mi: backups.append(int(mi.group(1), base = 10)) if h.commit.hexsha == cur.hexsha: need_head = False if backups: n = max(backups) + 1 else: n = 0 # TODO: do not set branch if commits are reachable (other # branch exists) # setup backup branch and checkout new version if need_head: back_head = repo.create_head("backup_%u" % n, cur) try: active.commit = target try: active.checkout(True) except: active.commit = cur raise except: if need_head: repo.delete_head(back_head) raise save_path = self.saveDir.GetValue() # remove files of current stack = [cur.tree] while stack: node = stack.pop() for b in node.blobs: b_path = join(save_path, b.path) if exists(b_path): remove(b_path) stack.extend(node.trees) # copy files from target stack = [target.tree] while stack: node = stack.pop() for b in node.blobs: b_path = join(save_path, b.path) makedirs(dirname(b_path), exist_ok = True) with open(b_path, "wb+") as f: b.stream_data(f) stack.extend(node.trees) def _open_dir(self, path): if exists(path): open_directory_in_explorer(path) def _on_open_save_dir(self, _): self._open_dir(self.saveDir.GetValue()) def _on_open_backup_dir(self, _): self._open_dir(self.backupDir.GetValue()) def _on_select_save_dir(self, _): if not hasattr(self, "dlgSaveDir"): self.dlgSaveDir = DirDialog(self.master, "Choose directory of save data", "", DD_DEFAULT_STYLE | DD_DIR_MUST_EXIST ) cur = self.saveDir.GetValue() if cur: self.dlgSaveDir.SetPath(cur) if self.dlgSaveDir.ShowModal() == ID_OK: self.saveDir.SetValue(self.dlgSaveDir.GetPath()) def _on_select_backup_dir(self, _): if not hasattr(self, "dlgBackupDir"): self.dlgBackupDir = DirDialog(self.master, "Choose directory for backup", "", DD_DEFAULT_STYLE | DD_DIR_MUST_EXIST ) cur = self.backupDir.GetValue() if cur: self.dlgBackupDir.SetPath(cur) if self.dlgBackupDir.ShowModal() == ID_OK: self.backupDir.SetValue(self.dlgBackupDir.GetPath()) def _enable_settings(self): for w in self.settingsWidgets: w.Enable(True) def _disable_settings(self): for w in self.settingsWidgets: w.Enable(False) def _on_monitor(self, _): root = self.saveDir.GetValue() backup = self.backupDir.GetValue() root2threads = self.master.root2threads # See: http://timgolden.me.uk/python/win32_how_do_i/watch_directory_for_changes.html if self.cbMonitor.IsChecked(): self._disable_settings() if not root: dlg = MessageDialog(self.master, "Pleas select save directory", "Error" ) dlg.ShowModal() dlg.Destroy() self.cbMonitor.SetValue(False) self._enable_settings() return if not exists(root): dlg = MessageDialog(self.master, "No such directory '%s'" % root, "Error" ) dlg.ShowModal() dlg.Destroy() self.cbMonitor.SetValue(False) self._enable_settings() return if not backup: dlg = MessageDialog(self.master, "Pleas select backup directory", "Error" ) dlg.ShowModal() dlg.Destroy() self.cbMonitor.SetValue(False) self._enable_settings() return if root in root2threads: return # already monitored if not exists(backup): dlg = MessageDialog(self.master, "Directory '%s' does not exist. Create?" % backup, "Create backup directory", YES_NO ) res = dlg.ShowModal() dlg.Destroy() if not res: self.cbMonitor.SetValue(False) self._enable_settings() return makedirs(backup) filterOutRe = None filterOut = self.filterOut.GetValue() if filterOut: try: filterOutRe = compile(filterOut) except: if filterOut: dlg = MessageDialog(self.master, "Incorrect filter expression" " (use Python's re syntax)\n" + format_exc() + "\nContinue without filter?", "Filter Out Error", YES_NO ) res = dlg.ShowModal() dlg.Destroy() if res == ID_NO: self.cbMonitor.SetValue(False) self._enable_settings() return mt = MonitorThread(root, lambda : root2threads.pop(root)) bt = BackUpThread(root, backup, mt.changes, filterOutRe) root2threads[root] = (mt, bt) mt.start() bt.start() else: self._enable_settings() if root in root2threads: for t in root2threads[root]: t.exit_request = True def _on_hide(self, __): self.master._hide_save_settings(self) @property def saveData(self): return ( self.saveDir.GetValue(), self.backupDir.GetValue(), self.filterOut.GetValue(), )
class TipsFrame(Dialog): """ Represents a tips frame, a frame for displaying tips. :version: $Revision: 1.9 $ :author: C.Dutoit :contact: [email protected] """ def __init__(self, parent): """ """ # Check import sys if sys.platform == "win32": return # Initialize the dialog box super().__init__( parent, -1, _("Tips"), DefaultPosition, Size(DEFAULT_WIDTH, DEFAULT_HEIGHT), RESIZE_BORDER | SYSTEM_MENU | CAPTION | FRAME_FLOAT_ON_PARENT | STAY_ON_TOP) # Normalize tips from org.pyut.general.LineSplitter import LineSplitter ls = LineSplitter() dc = ClientDC(self) for i in range(len(Tips)): tip = ls.split(Tips[i], dc, int(DEFAULT_WIDTH * 0.8)) Tips[i] = "" for line in tip: Tips[i] += line + "\n" # tip = "" # for line in Tips[i].split("\n"): # newLine = "" # for word in line.split(" "): # if len(newLine) + len(word) > 59: # tip += newLine + "\n" # newLine = "" # newLine += word + " " # tip += newLine # Tips[i] = tip # Set current tips self._prefs = PyutPreferences() self._currentTip = self._prefs[PyutPreferences.CURRENT_TIP] if self._currentTip is None: self._currentTip = 0 else: self._currentTip = int(self._currentTip) # Add icon # fileName = resource_filename(IMG_PKG, 'TipsLogo.bmp') # icon = Icon(fileName, BITMAP_TYPE_BMP) # self.SetIcon(icon) # self.Center(BOTH) # Center on the screen self.Center(dir=VERTICAL) self.AcceptsFocus() # Create controls # bmp: Bitmap = org.pyut.resources.img.ImgTipsFrameTipsLogo.embeddedImage.GetBitmap() bmp: Bitmap = TipsLogo.GetBitmap() self._picture = StaticBitmap(self, -1, bmp) tip = Tips[self._currentTip] self._label = StaticText(self, -1, tip, size=Size(DEFAULT_WIDTH * 0.8, DEFAULT_HEIGHT * 0.8), style=ST_NO_AUTORESIZE) nextTipButton = Button(self, ID_SET_NEXT_TIP, _("&Next tip")) previousTipButton = Button(self, ID_SET_PREVIOUS_TIP, _("&Previous tip")) self._chkShowTips = CheckBox(self, ID_CHK_SHOW_TIPS, _("&Show tips at startup")) showTips: bool = self._prefs.showTipsOnStartup() self._chkShowTips.SetValue(showTips) # Upper sizer upSizer = BoxSizer(HORIZONTAL) upSizer.Add(self._picture, 0, ALL | ALIGN_CENTER, 5) upSizer.Add(self._label, 1, ALL | ALIGN_CENTER, 5) # Lower sizer loSizer = BoxSizer(HORIZONTAL) loSizer.Add(previousTipButton, 0, ALL | ALIGN_CENTER, 5) loSizer.Add(nextTipButton, 0, ALL | ALIGN_CENTER, 5) loSizer.Add(Button(self, ID_OK, "&Ok"), 0, ALL | ALIGN_CENTER, 5) # Main sizer self.SetAutoLayout(True) mainSizer = BoxSizer(VERTICAL) mainSizer.Add(upSizer, 0, ALL | ALIGN_CENTER, 5) mainSizer.Add(self._chkShowTips, 0, ALL | ALIGN_CENTER, 5) mainSizer.Add(loSizer, 0, ALL | ALIGN_CENTER, 5) self.SetSizer(mainSizer) mainSizer.Fit(self) # Events self.Bind(EVT_BUTTON, self._onOk, id=ID_OK) self.Bind(EVT_CLOSE, self._onClose) self.Bind(EVT_BUTTON, self._onNextTip, id=ID_SET_NEXT_TIP) self.Bind(EVT_BUTTON, self._onPreviousTip, id=ID_SET_PREVIOUS_TIP) # noinspection PyUnusedLocal def _onOk(self, event): """ _onOk : Handle user click on the OK button @author C.Dutoit """ # Exit modal mode self.Close() # noinspection PyUnusedLocal def _onNextTip(self, event): """ Select and display next tip @author C.Dutoit """ self._currentTip = (self._currentTip + 1) % len(Tips) self._label.SetLabel(Tips[self._currentTip]) # noinspection PyUnusedLocal def _onPreviousTip(self, event): """ Select and display previous tip @author C.Dutoit """ self._currentTip = (self._currentTip - 1) % len(Tips) self._label.SetLabel(Tips[self._currentTip]) def _onClose(self, event): """ Save state """ # Save state rationalTipNumber: int = (self._currentTip + 1) % len(Tips) currentTipNumber: str = f'{str(rationalTipNumber)}' self._prefs[PyutPreferences.CURRENT_TIP] = currentTipNumber self._prefs[PyutPreferences. SHOW_TIPS_ON_STARTUP] = self._chkShowTips.GetValue() event.Skip()
class DlgEditClass(DlgEditClassCommon): """ Dialog for the class edits. Creating a DlgEditClass object will automatically open a dialog for class editing. The PyutClass given in the constructor parameters will be used to fill the fields of the dialog, and will be updated when the OK button is clicked. Dialogs for methods and fields editing are implemented in different classes and created when invoking the _callDlgEditMethod and _callDlgEditField methods. Because dialog works on a copy of the PyutClass object, if you cancel the dialog any modifications are lost. Examples of `DlgEditClass` use are in `Mediator.py` """ def __init__(self, parent, windowId, pyutClass: PyutClass): """ Args: parent: dialog parent windowId: dialog identity pyutClass: Class modified by dialog """ super().__init__(parent=parent, windowId=windowId, dlgTitle=_("Class Edit"), pyutModel=pyutClass) self.logger: Logger = getLogger(__name__) lblStereotype: StaticText = StaticText(self, -1, _("Stereotype")) self._txtStereotype: TextCtrl = TextCtrl(self, ID_TXT_STEREO_TYPE, "", size=(125, -1)) self._szrNameStereotype.Add(lblStereotype, 0, ALL, 5) self._szrNameStereotype.Add(self._txtStereotype, 1, ALIGN_CENTER) # Label Fields lblField = StaticText(self, -1, _("Fields :")) # ListBox List self._lstFieldList = ListBox(self, ID_LST_FIELD_LIST, choices=[], style=LB_SINGLE) self.Bind(EVT_LISTBOX, self._evtFieldList, id=ID_LST_FIELD_LIST) self.Bind(EVT_LISTBOX_DCLICK, self._evtFieldListDClick, id=ID_LST_FIELD_LIST) # Button Add self._btnFieldAdd = Button(self, ID_BTN_FIELD_ADD, _("&Add")) self.Bind(EVT_BUTTON, self._onFieldAdd, id=ID_BTN_FIELD_ADD) # Button Edit self._btnFieldEdit = Button(self, ID_BTN_FIELD_EDIT, _("&Edit")) self.Bind(EVT_BUTTON, self._onFieldEdit, id=ID_BTN_FIELD_EDIT) # Button Remove self._btnFieldRemove = Button(self, ID_BTN_FIELD_REMOVE, _("&Remove")) self.Bind(EVT_BUTTON, self._onFieldRemove, id=ID_BTN_FIELD_REMOVE) # Button Up self._btnFieldUp = Button(self, ID_BTN_FIELD_UP, _("&Up")) self.Bind(EVT_BUTTON, self._onFieldUp, id=ID_BTN_FIELD_UP) # Button Down self._btnFieldDown = Button(self, ID_BTN_FIELD_DOWN, _("&Down")) self.Bind(EVT_BUTTON, self._onFieldDown, id=ID_BTN_FIELD_DOWN) # Sizer for Fields buttons szrFieldButtons = BoxSizer(HORIZONTAL) szrFieldButtons.Add(self._btnFieldAdd, 0, ALL, 5) szrFieldButtons.Add(self._btnFieldEdit, 0, ALL, 5) szrFieldButtons.Add(self._btnFieldRemove, 0, ALL, 5) szrFieldButtons.Add(self._btnFieldUp, 0, ALL, 5) szrFieldButtons.Add(self._btnFieldDown, 0, ALL, 5) szrMethodButtons: BoxSizer = self._createMethodsUIArtifacts() # Show stereotype checkbox self._chkShowStereotype = CheckBox(self, -1, _("Show stereotype")) # Show fields checkbox self._chkShowFields = CheckBox(self, -1, _("Show fields")) # Show methods checkbox self._chkShowMethods = CheckBox(self, -1, _("Show methods")) # Sizer for display properties szrDisplayProperties = BoxSizer(VERTICAL) szrDisplayProperties.Add(self._chkShowStereotype, 0, ALL, 5) szrDisplayProperties.Add(self._chkShowFields, 0, ALL, 5) szrDisplayProperties.Add(self._chkShowMethods, 0, ALL, 5) self._szrMain.Add(lblField, 0, ALL, 5) self._szrMain.Add(self._lstFieldList, 1, ALL | EXPAND, 5) self._szrMain.Add(szrFieldButtons, 0, ALL | ALIGN_CENTER_HORIZONTAL, 5) self._szrMain.Add(self._lblMethod, 0, ALL, 5) self._szrMain.Add(self._lstMethodList, 1, ALL | EXPAND, 5) self._szrMain.Add(szrMethodButtons, 0, ALL | ALIGN_CENTER_HORIZONTAL, 5) self._szrMain.Add(szrDisplayProperties, 0, ALL | ALIGN_CENTER_HORIZONTAL, 5) self._szrMain.Add( self._szrButtons, 0, ALL | ALIGN_RIGHT, 5 ) # wxPython 4.1.0 Vertical alignment flags are ignored in vertical sizers # Fill the txt control with class data self._fillAllControls() # Fix buttons (enable or not) self._fixBtnFields() self._fixBtnMethod() # Set the focus and selection self._txtName.SetFocus() self._txtName.SetSelection(0, len(self._txtName.GetValue())) # Help Pycharm self._dlgMethod = cast(Dialog, None) self._szrMain.Fit(self) # subclasses need to do this self.Centre() self.ShowModal() def _callDlgEditField(self, field: PyutField) -> int: """ Dialog for Field editing Args: field: Field to be edited Returns: return code from dialog """ self._dlgField = DlgEditField(theParent=self, theWindowId=ID_ANY, fieldToEdit=field, theMediator=self._mediator) return self._dlgField.ShowModal() def _dupParams(self, params): """ Duplicate a list of params, all params are duplicated too. @since 1.9 @author N. Dubois <*****@*****.**> """ dupParams = [] for i in params: param: PyutParam = PyutParam(name=i.getName(), theParameterType=i.getType(), defaultValue=i.getDefaultValue()) dupParams.append(param) return dupParams def _fillAllControls(self): """ Fill all controls with _pyutModelCopy data. """ # Fill Class name self._txtName.SetValue(self._pyutModelCopy.getName()) # Fill Stereotype stereotype = self._pyutModelCopy.getStereotype() if stereotype is None: strStereotype = "" else: strStereotype = stereotype.getName() self._txtStereotype.SetValue(strStereotype) # Fill the list controls try: for el in self._pyutModelCopy.fields: self.logger.debug(f'field: {el}') self._lstFieldList.Append(str(el)) self._fillMethodList() except (ValueError, Exception) as e: eMsg: str = _(f"Error: {e}") dlg = MessageDialog(self, eMsg, OK | ICON_ERROR) dlg.ShowModal() dlg.Destroy() # Fill display properties self._chkShowFields.SetValue(self._pyutModelCopy.showFields) self._chkShowMethods.SetValue(self._pyutModelCopy.showMethods) self._chkShowStereotype.SetValue( self._pyutModelCopy.getShowStereotype()) def _fixBtnFields(self): """ Fix buttons of fields list (enable or not). """ selection = self._lstFieldList.GetSelection() # Button Edit and Remove ans = selection != -1 self._btnFieldEdit.Enable(ans) self._btnFieldRemove.Enable(ans) self._btnFieldUp.Enable(selection > 0) self._btnFieldDown.Enable( ans and selection < self._lstFieldList.GetCount() - 1) # noinspection PyUnusedLocal def _onFieldAdd(self, event: CommandEvent): """ Add a new field in the list. Args: event: """ field = PyutField() ret = self._callDlgEditField(field) if ret == OK: self._pyutModelCopy.fields.append(field) # Add fields in dialog list self._lstFieldList.Append(str(field)) # Tell window that its data has been modified fileHandling = self._mediator.getFileHandling() project = fileHandling.getCurrentProject() if project is not None: project.setModified() # noinspection PyUnusedLocal def _onFieldEdit(self, event: CommandEvent): """ Edit a field. """ selection = self._lstFieldList.GetSelection() field = self._pyutModelCopy.fields[selection] ret = self._callDlgEditField(field) if ret == OK: # Modify field in dialog list self._lstFieldList.SetString(selection, str(field)) # Tell window that its data has been modified fileHandling = self._mediator.getFileHandling() project = fileHandling.getCurrentProject() if project is not None: project.setModified() # noinspection PyUnusedLocal def _onFieldRemove(self, event: CommandEvent): """ Remove a field from the list. """ # Remove from list control selection = self._lstFieldList.GetSelection() self._lstFieldList.Delete(selection) # Select next if self._lstFieldList.GetCount() > 0: index = min(selection, self._lstFieldList.GetCount() - 1) self._lstFieldList.SetSelection(index) # Remove from _pyutModelCopy fields = self._pyutModelCopy.fields fields.pop(selection) # Fix buttons of fields list (enable or not) self._fixBtnFields() # Tell window that its data has been modified fileHandling = self._mediator.getFileHandling() project = fileHandling.getCurrentProject() if project is not None: project.setModified() # noinspection PyUnusedLocal def _onFieldUp(self, event: CommandEvent): """ Move up a field in the list. """ # Move up the field in _pyutModelCopy selection = self._lstFieldList.GetSelection() fields = self._pyutModelCopy.fields field = fields[selection] fields.pop(selection) fields.insert(selection - 1, field) # Move up the field in dialog list self._lstFieldList.SetString(selection, str(fields[selection])) self._lstFieldList.SetString(selection - 1, str(fields[selection - 1])) self._lstFieldList.SetSelection(selection - 1) # Fix buttons (enable or not) self._fixBtnFields() # Tell window that its data has been modified fileHandling = self._mediator.getFileHandling() project = fileHandling.getCurrentProject() if project is not None: project.setModified() # noinspection PyUnusedLocal def _onFieldDown(self, event: CommandEvent): """ Move down a field in the list. """ selection = self._lstFieldList.GetSelection() fields = self._pyutModelCopy.fields field = fields[selection] fields.pop(selection) fields.insert(selection + 1, field) # Move down the field in dialog list self._lstFieldList.SetString(selection, str(fields[selection])) self._lstFieldList.SetString(selection + 1, str(fields[selection + 1])) self._lstFieldList.SetSelection(selection + 1) # Fix buttons (enable or not) self._fixBtnFields() # Tell window that its data has been modified fileHandling = self._mediator.getFileHandling() project = fileHandling.getCurrentProject() if project is not None: project.setModified() # noinspection PyUnusedLocal def _evtFieldList(self, event): """ Called when click on Fields list. """ self._fixBtnFields() def _evtFieldListDClick(self, event: CommandEvent): """ Called when there is a double-click on Fields list. """ self._onFieldEdit(event) def _convertNone(self, theString): """ Return the same string, if string = None, return an empty string. Args: theString: The string Returns: The input string or 'None' if it was empty """ if theString is None: theString = "" return theString # noinspection PyUnusedLocal def _onOk(self, event: CommandEvent): """ Activated when button OK is clicked. """ strStereotype = self._txtStereotype.GetValue() if strStereotype == "": self._pyutModel.setStereotype(None) else: self._pyutModel.setStereotype(getPyutStereotype(strStereotype)) # Adds all fields in a list self._pyutModel.fields = self._pyutModelCopy.fields # Update display properties self._pyutModel.showFields = self._chkShowFields.GetValue() self._pyutModel.showMethods = self._chkShowMethods.GetValue() self._pyutModel.setShowStereotype(self._chkShowStereotype.GetValue()) from org.pyut.PyutPreferences import PyutPreferences prefs = PyutPreferences() try: if prefs["AUTO_RESIZE"]: oglClass = self._mediator.getOglClass(self._pyutModel) oglClass.autoResize() except (ValueError, Exception) as e: self.logger.warning(f'{e}') fileHandling = self._mediator.getFileHandling() project = fileHandling.getCurrentProject() if project is not None: project.setModified() super()._onOk(event)