def SetValue(self, value): """ Функция преобразует входное значение в одно из значений списка (если это возможно) и установит его в качестве текущего. Преобразование производится через словарь замен _dictRepl. @type value: C{string} @param value: Устанавливаемое значение. """ ret = False if self._itemsLst: for i, el in enumerate(self._itemsLst): if el[0] == value: self.SetSelection(i) return True elif self._dictRepl: try: val = self._dictRepl[value] ret = self.SetRealValue(val) except: self.SetSelection(-1) io_prnt.outLastErr( 'KeyError in icchoice.SetValue(val), val=%s' % value) else: ret = self.SetRealValue(value) return ret
def __init__(self, parent, id=-1, component={}, logType=0, evalSpace={}, bCounter=False, progressDlg=None, sizer=None): """ Конструктор для создания объекта icGridBagSizer. @type parent: C{wx.Window} @param parent: Указатель на родительское окно. @type id: C{int} @param id: Идентификатор окна. @type component: C{dictionary} @param component: Словарь описания компонента. @type logType: C{int} @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога). @param evalSpace: Пространство имен, необходимых для вычисления внешних выражений. @type evalSpace: C{dictionary} @type sizer: C{icSizer} @param sizer: Ссылка на родительский сайзер. """ icSpcDefStruct(SPC_IC_GRID_BAGSIZER, component) # Кортеж задающий вид прокутки (bHoriz, bVert) self.enableScr = None icSizer.__init__(self, parent, id, component, logType, evalSpace, sizer=sizer) self.vgap = component['vgap'] self.hgap = component['hgap'] wx.GridBagSizer.__init__(self, component['vgap'], component['hgap']) self.minCellWidth = w = component['minCellWidth'] self.minCellHeight = h = component['minCellHeight'] self.SetEmptyCellSize((w, h)) # Максимальный номер строки и колонки self.maxRow = 0 self.maxCol = 0 # Размеры колонок и рядов self.sizeCols = [] self.sizeRows = [] # Создаем дочерние компоненты if 'child' in component: self.childCreator(bCounter, progressDlg) # Устанавливаем колонки и ряды, которые подстраивают # свои размеры под размеры родительского окна # ВНИМАНИЕ! Эту операцию необходимо выполнять после # добавления объектов в сайзер for col in component['flexCols']: try: self.AddGrowableCol(col) except: io_prnt.outLastErr('flexCols col=<%s>' % col) for row in component['flexRows']: self.AddGrowableRow(row) if parent: import ic.utils.graphicUtils as grph parent_bgr = parent.GetBackgroundColour() self.shape_clr = grph.AdjustColour2(parent_bgr, 7) else: self.shape_clr = icSizer.DESIGN_SHAPE_COLOR
def OnLeftDown(self, evt): if self.bButton: self._buttonPress = True self.Refresh() if self.CanSort(): if self.sortDirection == 0: self.sortDirection = -1 elif self.sortDirection == -1: self.sortDirection = 1 else: self.sortDirection = -1 if self.GetParent().grid: try: col = self.position[1] self.GetParent().grid.SortCol(col, self.sortDirection) except: io_prnt.outLastErr(u'Error in icheadergrid') self.Refresh() # Убираем признак сортировки у других колонок for obj in self.GetParent().parAddList: if obj.CanSort() and obj != self: obj.sortDirection = 0 obj.Refresh() # --- onLeftDown self.evalSpace['evt'] = evt self.evalSpace['self'] = self if self.evalSpace['__runtime_mode'] != util.IC_RUNTIME_MODE_EDITOR: self.eval_attr('onLeftDown')
def doFilterBuilder(Parent_, Environment_, Default_=None): """ Запустить редактор критериев выборки/фильтров. @param Parent_: Родительское окно редактора. @param Environment_: Структура окружения редактора. @param Default_: Структура по умолчанию. @return: Возвращает результат редактирования. """ try: dlg = icFilterBuilderDialog(Parent_, -1, style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER) dlg.setEnvironment(Environment_) dlg.setEditResult(Default_) result = dlg.ShowModal() if result == wx.ID_OK: # Нажата кнопка OK в редакторе return dlg.getEditResult() else: # Нажата кнопка "Отмена" return None except: io_prnt.outLastErr(u'Ошибка запуска редактора критериев выбора.') return None
def Add(self, obj, pos, span=(1, 1), flag = 0, border = 0): """ Функция добавления в сайзер. Она переопределена для того, чтобы контролировать комопненты, которые добавляются, т. к. стандартные сайзеры этого делать не позволяют. """ row, col = pos if row == -1: row = len(self.objectList) if col == -1: col = 0 pos = (row, col) if obj.type == 'SizerSpace': bret = wx.GridBagSizer.Add(self, obj.size, pos, span, flag, border) else: bret = wx.GridBagSizer.Add(self, obj, pos, span, flag, border) if bret: obj.contaningSizer = self obj.span = span obj.position = pos obj.flag = flag obj.border = border obj.pt_dw = 0 obj.pt_dh = 0 self.objectList.append(obj) else: io_prnt.outLastErr('Error Add obj: <%s>' % obj) return bret
def setLimitLabel(self, limit=None, over_limit=None): """ Вывести сообщение об ограничении количества записей. @param limit: Ограничение количества записей. @param over_limit: Количество записей при привышении ограничения. """ if over_limit: try: label = ERROR_LIMIT_LABEL_FMT % int(over_limit) self.limit_staticText.SetLabel(label) self.limit_staticText.SetForegroundColour(wx.RED) return except: io_prnt.outLastErr(u'Ошибка в setLimitLabel') if limit: # Есть ограничение, но не превышено try: label = DEFAULT_LIMIT_LABEL_FMT % int(limit) self.limit_staticText.SetLabel(label) fg = wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT) self.limit_staticText.SetForegroundColour(fg) return except: io_prnt.outLastErr(u'Ошибка в setLimitLabel') # Нет ограничений self.limit_staticText.SetLabel(u'')
def GetTitle(self, indx): """ Возвращет ссылку на нужную закладку. @type indx: C{int} @param indx: Индекс закладки. """ try: return self.GetTitlesList()[indx] except: io_prnt.outLastErr('##?: GetTitle ERROR') return None
def ConnectObjToTitle(self, indx, obj): """ Привязывает объект к нужной странице. @type indx: C{int} @param indx: Индекс закладки. """ try: titleObj = self.GetTitlesList()[indx] titleObj.ConnectObj(obj) if obj not in self._connectedObjList: self._connectedObjList.append(obj) except: io_prnt.outLastErr('###?: ConnectObjToTitle() ERROR')
def icFilterConstructorDlg(ParentWin_=None, DefaultFilterData_=None, Env_=None): """ Функция вызова диалогового окна конструктора фильтров. @param ParentWin_: Родительское окно диалога конструктора фильтров. @param DefaultFilterData_: Фильтр по умолчанию. @param Env_: Окружение работы конструктора фильтров. """ if Env_ is None: io_prnt.outWarning( u'Не определено окружение для конструктора фильтров') # Окружение должно быть обязательно try: Env_ = filter_builder_env.FILTER_ENVIRONMENT except: from . import filter_builder_env Env_ = filter_builder_env.FILTER_ENVIRONMENT dlg = None try: win_clear = False if ParentWin_ is None: id_ = wx.NewId() ParentWin_ = wx.Frame(None, id_, '') win_clear = True dlg = icFilterConstructorDialog(ParentWin_, DefaultFilterData_, Env_) if dlg.ShowModal() in (wx.ID_OK, ): result = dlg.getFilterData() dlg.Destroy() # Удаляем созданное родительское окно if win_clear: ParentWin_.Destroy() return result except: io_prnt.outLastErr(u'Ошибка конструктора фильтра') finally: if dlg: dlg.Destroy() # Удаляем созданное родительское окно if win_clear: ParentWin_.Destroy() return None
def getChoiceSelectedCode(self, choice_ctrl, item=-1): """ Получить выбранный код из контрола wx.Choice. @param choice_ctrl: Объект контрола. @param item: Индекс пункта, есл не определен, то имеется в виду выбранный пункт. @return: Строковый выбранный код. """ if item < 0: item = choice_ctrl.GetSelection() try: return choice_ctrl.GetClientData(item) except: io_prnt.outLastErr(u'Не данных узла <%d>' % item) return None
def GetCellRBPoint(self, row, col): """ Возвращает координаты верхнего левого угла заданой ячейки. """ if col < 0 or row < 0: return None dx, dy = self.GetPosition() try: for i in range(row): dy += wx.GridBagSizer.GetCellSize(self, i, col) for i in range(col): dx += wx.GridBagSizer.GetCellSize(self, row, i) except: io_prnt.outLastErr('icGridBagSizer.GetCellRBPoint') return wx.Point(dx, dy)
def OnPreSelect(self, evt): """ Обработчик события wx.EVT_LEFT_DOWN. """ pos = evt.GetPosition() sx, sy = self.GetSize() # Определяем номер страницы, которая будет выбранна findx = self.GetTitleIndx(pos) # Обработчик пользователя rectList = wx.Rect(sx - IC_NB_SERV_ZONE + 2, (IC_NB_HEIGHT - 8) / 2 - 1, 13, 12) rectNext = wx.Rect(sx - IC_NB_SERV_ZONE + 26, (IC_NB_HEIGHT - 8) / 2, 8, 8) rectPrev = wx.Rect(sx - IC_NB_SERV_ZONE + 17, (IC_NB_HEIGHT - 8) / 2, 8, 8) if findx >= 0 and self.SelectTitle(findx): pass elif rectNext.Inside(pos) and self.CanPressNext(): self.SetFirstVisible(self.GetFirstVisible() + 1) elif rectPrev.Inside(pos) and self.CanPressPrev(): self.SetFirstVisible(self.GetFirstVisible() - 1) elif rectList.Inside(pos) and (self.CanPressPrev() or self.CanPressNext()): menu = wx.Menu() id = 10000 for indx, obj in enumerate(self.GetTitlesList()): if indx < self.GetFirstVisible() or indx > self.GetLastVisible( ): item = wx.MenuItem(menu, id, obj.title) if obj.bitmap: try: item.SetBitmap(obj.bitmap) except: io_prnt.outLastErr('') menu.AppendItem(item) self.Bind(wx.EVT_MENU, self.OnMenu, id=id) id += 1 self.PopupMenu(menu, evt.GetPosition()) else: evt.Skip()
def design(self): """ Запуск режима конструирования отчетов. """ if os.path.exists(self._report_exec_filename): cmd = 'python2 %s --editor --path=%s &' % ( self._report_exec_filename, self.getReportDir()) try: io_prnt.outLog(u'Запуск внешней программы <%s>' % cmd) os.system(cmd) except: io_prnt.outLastErr( u'Запуск программы <icReport> в режиме конструктора отчетов: <%s>' % cmd) else: io_prnt.outWarning( u'Запускаемый модуль программы <icReport> : <%s> не найден' % self._report_exec_filename)
def Show(self, bShow=True, activeTitle=None): """ Показывает или скрывает компоненты привязанные к закладке. @type bShow: C{bool} @param bShow: Призка, который определяет скрывать или показывать компоненты. @type activeTitle: C{icTitle} @param activeTitle: Указывает на активную страницу. Это необходимо для того, чтобы не скрыть компонент активной страницы, в случае если компонент одновременно привязан к нескольким страницам. """ for obj in self._objList: try: if not bShow and activeTitle and obj in activeTitle.GetConnectedObj( ): pass else: obj.Show(bShow) except: io_prnt.outLastErr('##?: Show Error')
def post_select_action(self, report_filename, parent=None, db_url=None, sql=None, command=None, stylelib_filename=None, variables=None): """ Выбрать действие, которое хотим сделать с отчетом, после генерации отчета. @param report_filename: Имя файла шаблона отчета. Пути задаются относительно папки отчетов. @param parent: Родительское wxWindow окно для диалога. Если не указано, то береться wx.GetAppt().GetTopWindow(). @param db_url: Connection string в виде url. Например postgresql+psycopg2://postgres:[email protected]:5432/realization. @param sql: Запрос SQL. @param command: Комманда после генерации. print/preview/export. @param stylelib_filename: Файл библиотеки стилей. @param variables: Словарь дополнительных переменных. @return: True/False. """ if os.path.exists(self._report_exec_filename): cmd = 'python2 %s --select=%s --path=%s' % ( self._report_exec_filename, report_filename, self.getReportDir()) cmd = self._addCmdExtArgs(cmd, db_url, sql, command, stylelib_filename, variables) if isinstance(cmd, unicode): cmd = cmd.encode(config.DEFAULT_ENCODING) msg_cmd = ic_str.toUnicode(cmd, config.DEFAULT_ENCODING) try: io_prnt.outLog(u'Запуск внешней программы <%s>' % msg_cmd) os.system(cmd) except: io_prnt.outLastErr( u'Запуск программы <icReport> в режиме выбора действия над отчетом отчета: <%s>' % msg_cmd) else: io_prnt.outWarning( u'Запускаемый модуль программы <icReport> : <%s> не найден' % self._report_exec_filename)
def AddCell(self, cell): """ Функция добавляет ячейку заголовока. @type cell: C{string} @param cell: Компонент ячейки. """ if cell.position == (-1, -1): pos = (0, len(self.parAddList)) else: pos = cell.position try: self.sz.Add(cell, pos, cell.span, cell.add_style) except: io_prnt.outLastErr(u'ADD ERROR') self.parAddList.append(cell) self.parAddList.sort(sortCell) self.sz.Layout()
def report_export(self, report_filename, db_url=None, sql=None, command=None, stylelib_filename=None, variables=None): """ Запуск генерации отчета с конвертацией в офисную программу. @param report_filename: Имя файла шаблона отчета. Пути задаются относительно папки отчетов. @param db_url: Connection string в виде url. Например postgresql+psycopg2://postgres:[email protected]:5432/realization. @param sql: Запрос SQL. @param command: Комманда после генерации. print/preview/export. @param stylelib_filename: Файл библиотеки стилей. @param variables: Словарь дополнительных переменных. @return: True/False. """ if os.path.exists(self._report_exec_filename): cmd = 'python2 %s --export=%s --path=%s' % ( self._report_exec_filename, report_filename, self.getReportDir()) cmd = self._addCmdExtArgs(cmd, db_url, sql, command, stylelib_filename, variables) if isinstance(cmd, unicode): cmd = cmd.encode(config.DEFAULT_ENCODING) msg_cmd = ic_str.toUnicode(cmd, config.DEFAULT_ENCODING) try: io_prnt.outLog(u'Запуск внешней программы <%s>' % msg_cmd) os.system(cmd) except: io_prnt.outLastErr( u'Запуск программы <icReport> в режиме экспорта отчета: <%s>' % msg_cmd) else: io_prnt.outWarning( u'Запускаемый модуль программы <icReport> : <%s> не найден' % self._report_exec_filename)
def Draw(renderer, grid, cell_attr, dc, rect, row, col, isSelected): """ Функция отрисовки значения данного типа в режиме просмотра в гриде. """ bgr = renderer.backgroundColor icCombineEdt.Clear(dc, rect, bgr) style = grid.GetTable().GetValue(row, col) attr = grid.GetTable().GetValue(row, 0) attr = attr.strip() try: if attr in grid._styles_attr: styles = grid._styles_attr[attr] dict = basefuncs.getStyleDict(int(style), styles) text = '' for indx, key in enumerate(dict.keys()): if dict[key] == 1: text = text + ' | ' + key icCombineEdt.DrawText(renderer, grid, text[3:], dc, rect) else: icCombineEdt.DrawText(renderer, grid, style, dc, rect) except: io_prnt.outLastErr(u'ERROR') icCombineEdt.DrawText(renderer, grid, style, dc, rect)
def AddToLoadMenu(self, MenuItems_): """ Догрузить меню. @param MenuItems_: список имен пунктов меню. @return: Возвращает ссылку на объект меню или None в случае ошибки. """ try: # Обработка всех пунктов по порядку for item_name in MenuItems_: # Загрузить структуру пункта if isinstance(self._ResData, str): item_struct = ic_res.LoadObjStruct( ic_res.RES_IDX_POPUP_ITEM, item_name, self._ResData) elif isinstance(self._ResData, dict): item_struct = self._ResData[item_name] else: io_prnt.outWarning(u'Ошибка загрузки меню:') return None self.AppendMenuItem(self, item_name, item_struct) return self except: io_prnt.outLastErr(u'Ошибка загрузки меню:') return None
def setResAttr(res, typRes, name, attr, value, uuidLink=None, prntRes=None): """ Функция ищет в ресурсе ресурс заданного типа и имени и устанавливает значение заданного атрибута. При этом генерируется новый UUID ресурса - половинка старого UUID складывается с половинкой ссылки. @type res: C{dictionary} @param res: Ресурсное описание, где происходить поиск. @type typRes: C{string} @param typRes: Тип ресурса, который ищется. @type name: C{string} @param name: Имя ресурного описаия компонента. @type attr: C{string} @param attr: Имя атрибута. @type value: C{...} @param value: Новое значение атрибута. @type uuidLink: C{string} @param uuidLink: Универсальный идентификатор ссылки. @type prntRes: C{dictionary} @param prntRes: Ресурсное описание родительского компонента-контейнера. @rtype: C{bool} @return: Признак того, что нужный атрибут найден и установлен. None означает, что компонет не имеет нужного атрибута. """ if not isinstance(res, dict) or not res: return False # Если нужный компонент нашли пытаемся установить атрибут res_name = None if 'type' in res and 'name' in res and res['type'] == typRes: if 'alias' in res and not res['alias'] in [None, '', 'None']: res_name = res['alias'] else: res_name = res['name'] if res_name == name: try: res[attr] = value if res['type'] == 'GridCell' and prntRes and uuidLink and '_uuid' in prntRes: nf = len(uuidLink) / 2 prntRes['_uuid'] = prntRes['_uuid'][:nf] + uuidLink[nf:] elif uuidLink and '_uuid' in res: nf = len(uuidLink) / 2 res['_uuid'] = res['_uuid'][:nf] + uuidLink[nf:] return True except: io_prnt.outLastErr(u'setResAttr ERROR') return None else: for key in res: # Если значение атрибута словарь if isinstance(res[key], dict): bret = setResAttr(res[key], typRes, name, attr, value, uuidLink, res) if bret is None or bret: return bret # Если значение атрибута список elif isinstance(res[key], list): for r in res[key]: if isinstance(r, dict): bret = setResAttr(r, typRes, name, attr, value, uuidLink, res) if bret is None or bret: return bret return False
def HlpDlg(parent, attr, value, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0, *arg, **par): """ Диалоговое окно для редактирования словаря в текстовом редакторе. @type parent: C{wx.Window} @param parent: Указатель на родительское окно (грид). @type attr: C{string} @param attr: Имя текущего атрибута. @type value: C{string} @param value: Текущее значение. @type pos: C{wx.Point} @param pos: Расположение диалога на гриде. @type size: C{wx.Size} @param size: Размер диалогового окна. @type style: C{int} @param style: Стиль диалогового окна. @type par: C{dictionary} @param par: Словарь дополнительных именованных параметров. <attr> - имя атрибута, <uuid_attr> - старый UUID атрибута, <bEnable=True> - признак режима редактирования. @rtype: C{tuplpe} @return: Первый элемент признак редактирования, второй текст, третий новый uuid. """ from ic.PropertyEditor import ic_pyed text = value uuid_attr = par['uuid_attr'] if 'bEnable' in par: bEnable = par['bEnable'] else: bEnable = True try: # Определяем смещение видимой части окна old = text x, y = pos sx, sy = size if sx < 450: size = (450, sy) pos = parent.ClientToScreenXY(x, y) dlg = ic_pyed.icPyEditorDlg(parent, text, pos, size, style=style) if not bEnable: dlg.editor.SetReadOnlyMode() ret = dlg.ShowModal() prz = False if ret == wx.ID_OK: # Генерируем новый UUID old_uuid = uuid_attr if bEnable: text = dlg.editor.GetText() # Если текст изменился генерируем новый uuid if old != text: prz = True uuid_attr = ic_uuid.get_uuid() if dlg: dlg.Destroy() except: io_prnt.outLastErr(u'icTextDictEdt HlpDlg ERROR') return prz, text, uuid_attr
def GenerateModText(self): """ Генерирует текст модуля. """ first = self.GetPrev().GetPrev() dct = first.sizer.evalSpace['_dict_obj'] spc = {} spc['__events__'] = {} spc['__attr_types__'] = {} spc['__parent__'] = 'icwidget.SPC_IC_WIDGET' # Читаем атрибуты пользовательского класса attrGrid = self.GetPrev().sizer.evalSpace['_dict_obj']['AttrGrid'] lr = attrGrid.GetDataset().getRecordCount() for row in range(lr): key = attrGrid.getNameValue('name', row) typ = attrGrid.getNameValue('type', row) val = attrGrid.getNameValue('defaultVal', row) spc[key] = value = icDefInf.strToVal(typ, val) try: id_type = getattr(icDefInf, typ) if id_type in spc['__attr_types__']: spc['__attr_types__'][id_type].append(key) else: spc['__attr_types__'][id_type] = [key] except: io_prnt.outLastErr(u'Set Attribute Type') # Читаем атрибуты обработчиков сообщений msgGrid = self.sizer.evalSpace['_dict_obj']['MsgGrid'] lr = msgGrid.GetDataset().getRecordCount() for row in range(lr): key = msgGrid.getNameValue('name', row) typ = msgGrid.getNameValue('type', row) func = msgGrid.getNameValue('function', row) prz = msgGrid.getNameValue('przCommand', row) if not func: func = None spc['__events__'][key] = (typ, func, prz) if icDefInf.EDT_PY_SCRIPT in spc['__attr_types__']: spc['__attr_types__'][icDefInf.EDT_PY_SCRIPT].append(key) else: spc['__attr_types__'][icDefInf.EDT_PY_SCRIPT] = [key] spc[key] = None # Если установлен признак контейнера if self.GetPrev( ).sizer.evalSpace['_dict_obj']['przContainer'].IsChecked(): spc['child'] = [] discr = { 'module_name': dct['TextModulName'].GetValue(), 'class_name': dct['TextClassName'].GetValue(), 'purpose': dct['TextDiscr'].GetValue(), 'author': dct['TextAuthor'].GetValue(), 'created': 'class:', 'Id': '', 'copyright': dct['TextCopyright'].GetValue(), 'import': dct['TextParentModule'].GetValue(), 'parent_class': dct['TextParentClass'].GetValue(), 'icon': dct['TextIcon'].GetValue(), 'doc': '\'%s\'' % dct['TextDoc'].GetValue(), 'contain': '[]', 'not_contain': 'None', 'spc_description': None, 'spc': spc, 'styles': '{\'DEFAULT\':0}', 'init_arg': '*args, **kwargs', 'bind_events': None, 'events_function': None } text_mod = CreatUserClass(discr) return text_mod
def __init__(self, parent, id, component, logType=0, evalSpace=None, bCounter=False, progressDlg=None): """ Конструктор базового класса пользовательских компонентов. @type parent: C{wx.Window} @param parent: Указатель на родительское окно. @type id: C{int} @param id: Идентификатор окна. @type component: C{dictionary} @param component: Словарь описания компонента. @type logType: C{int} @param logType: Тип лога (0 - консоль, 1- файл, 2- окно лога). @param evalSpace: Пространство имен, необходимых для вычисления внешних выражений. @type evalSpace: C{dictionary} @type bCounter: C{bool} @param bCounter: Признак отображения в ProgressBar-е. Иногда это не нужно - для создания объектов полученных по ссылки. Т. к. они не учтены при подсчете общего количества объектов. @type progressDlg: C{wx.ProgressDialog} @param progressDlg: Указатель на идикатор создания формы. """ component = util.icSpcDefStruct(self.component_spc, component) icwidget.icWidget.__init__(self, parent, id, component, logType, evalSpace) # По спецификации создаем соответствующие атрибуты (кроме служебных атрибутов) lst_keys = [x for x in component.keys() if x.find('__') != 0] for key in lst_keys: setattr(self, key, component[key]) # Локализуем подписи закладок if self.isLocaleTitles: self.titles = [_(el) for el in self.titles] # Цвета текста и фона self.bgr = bgr = component['backgroundColor'] or (100, 100, 100) self.fgr = fgr = component['foregroundColor'] # ----------------------------------------------------------- style = wx.ST_NO_AUTORESIZE | wx.NO_BORDER parentModule.PyControl.__init__(self, parent, id, self.position, self.size, style, name=self.name) # ----------------------------------------------------------- self.SetAutoLayout(True) # Устанавливаем шрифт if not self.font: font = parent.GetFont() if not font.Ok(): font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) self.passiveFont = font else: self.passiveFont = icfont.icFont(self.font) parentModule.PyControl.SetFont(self, self.passiveFont) # Устанавливаем цвета if bgr: self.SetBackgroundColour(bgr) if fgr: self.SetForegroundColour(fgr) # Размер rw, rh = self.size self.SetSize(wx.Size(rw, IC_NB_HEIGHT + 3)) # ---------------------------------------------- # Регистрация обработчиков событий self.Bind(wx.EVT_LEFT_UP, self.OnSelectTitle) self.Bind(wx.EVT_LEFT_DOWN, self.OnPreSelect) self.Bind(wx.EVT_MOTION, self.OnMove) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeave) self.BindICEvt() # ---------------------------------------------- self.clientPanel = self # Признаки, определяющие можно нажать кнопки Next, Prev self._canNext = False self._canPrev = False # Список закладок self._tilesObjList = [] # Индекс первой видимой закладки self._firstVisible = 0 # Индекс последней видимой закладки self._lastVisible = -1 # Индекс активной закладки self._selected = 0 # Список присоединеных объектов self._connectedObjList = [] # Указатель на окно подсказки self._helpWin = None self._lastHelp = -1 self.path = self.getICAttr('path') if not self.path: self.path = os.getcwd() self.path = self.path.replace('\\', '/') if self.path[-1] != '/': self.path += '/' # Наполняем панель закладками for indx, title in enumerate(self.titles): img = None if indx < len(self.images): filename = self.path + self.images[indx] bmptype = icbitmap.icBitmapType(filename) if bmptype is not None and os.path.isfile(filename): img = wx.Image(filename, bmptype).ConvertToBitmap() self.AddTitle(title, img=img) # Создаем дочерние компоненты if 'child' in component: self.childCreator(bCounter, progressDlg) # Привязвыаем объекты к панели закладок for indx, spc in enumerate(self.child): try: # Если описанием подключаемого объекта является группа, # то к закладке подключаются объекты из группы if spc['type'] == 'Group': for spc_grp in spc['child']: obj = self.evalSpace['_dict_obj'][spc_grp['name']] if obj not in self.GetConnectedObjLst(): self.ConnectObjToTitle(indx, obj) else: obj = self.evalSpace['_dict_obj'][spc['name']] if obj not in self.GetConnectedObjLst(): self.ConnectObjToTitle(indx, obj) except: io_prnt.outLastErr('') self.SelectTitle()