Пример #1
0
 def accept(self):
     try:
         self._check_input()
         self._assemble_return()
         super().accept()
     except Exception as e:
         qtcommon.message_exc(self, "Input error", e=e)
Пример #2
0
 def accept(self):
     try:
         self._ret_value = []
         # assemble result
         for r in filter(lambda x: x.has_changes(), self.titems):
             self._ret_value.append(r)
         # ---- CHECKS
         # check table names
         nms = [r.new_name for r in self.titems if not r.do_remove]
         for n in nms:
             self.proj.is_possible_table_name(n)
         if len(set(nms)) < len(nms):
             raise Exception("Repeating table names are not valid.")
         # check column names
         for r in self._ret_value:
             cnms = [c.new_name for c in r.citems if not c.do_remove]
             for c in cnms:
                 self.proj.is_possible_column_name(c)
             if len(set(cnms)) < len(cnms):
                 raise Exception("Repeating column names are not valid.")
         self._ret_value = self.new_dictionaries(), self._ret_value
         # return
         return super().accept()
     except Exception as e:
         qtcommon.message_exc(self, "Invalid input", e=e)
Пример #3
0
 def accept(self):
     try:
         self.assemble_ret_value()
         if self.check_input():
             super().accept()
     except Exception as e:
         qtcommon.message_exc(self, "Invalid input", e=e)
Пример #4
0
    def do(self):
        import subprocess
        try:
            # temporary filename
            fname = export.get_unused_tmp_file('xlsx')

            # choose editor
            prog = self.mainwin.require_editor('xlsx')
            if not prog:
                return
            # export to a temporary
            opts = basic.CustomObject()
            opts.filename = fname
            opts.with_caption = True
            opts.with_id = True
            opts.format = 'xlsx'
            opts.numeric_enums = False
            opts.grouped_categories = 'None'
            opts.with_formatting = True
            export.model_export(self.amodel().dt, opts, self.amodel(),
                                self.aview())
            # open with editor
            path = ' '.join([prog, fname])
            subprocess.Popen(path.split())
        except Exception as e:
            qtcommon.message_exc(self.mainwin, "Open error", e=e)
Пример #5
0
 def do(self):
     all_cols = self.valid_col_names()
     used_cols = [
         self.amodel().dt.get_column(ivis=x).name
         for x in self.aview().selected_columns()
     ]
     tp = [self.amodel().dt.get_column(x).col_type() for x in all_cols]
     dialog = dlgs.CovarMatDlg(self.mainwin, used_cols, all_cols, tp)
     if dialog.exec_():
         try:
             colnames, bias, mtype = dialog.ret_value()
             if mtype.startswith('sym'):
                 mtype = 'both'
             mat = npinterface.mat_raw_values(self.amodel().dt, colnames)
             if len(mat) < 2 or len(mat[0]) < 2:
                 raise Exception("No enough data")
             if bias == 'population':
                 cm = stats.population_covariance_matrix(mat)
             else:
                 cm = stats.sample_covariance_matrix(mat)
             w = matrixview.MatrixView("Covariance matrix",
                                       self.mainwin,
                                       cm,
                                       colnames,
                                       colnames,
                                       sym=mtype)
             self.mainwin.add_subwindow(w)
             w.show()
         except Exception as e:
             qtcommon.message_exc(self.mainwin, 'Error', e=e)
Пример #6
0
 def do(self):
     from bgui import importdlgs
     dialog = dlgs.ImportTablesDlg(self.mainwin)
     if dialog.exec_():
         fname, frmt = dialog.ret_value()
         try:
             if frmt == "plain text":
                 dialog2 = importdlgs.ImportPlainText(
                     self.proj, fname,
                     lambda: self.mainwin.require_editor('text'),
                     self.mainwin)
             elif frmt == "xlsx":
                 dialog2 = importdlgs.ImportXlsx(
                     self.proj, fname,
                     lambda: self.mainwin.require_editor('xlsx'),
                     self.mainwin)
             else:
                 raise Exception("Unknow format {}".format(frmt))
         except Exception as e:
             qtcommon.message_exc(self.mainwin, "Import error", e=e)
             return
         if dialog2.exec_():
             newdicts, comimp = dialog2.ret_value()
             com = maincoms.ComImport(self.mainwin, newdicts, comimp)
             self.flow.exec_command(com)
Пример #7
0
 def confirm_input(self):
     "check errors and invoke parent accept"
     try:
         self.check_input()
         return True
     except Exception as e:
         qtcommon.message_exc(self, "Invalid input", e=e)
         return False
Пример #8
0
 def ext_preview(self):
     try:
         prog = self.require_editor()
         if prog:
             path = ' '.join([prog, self.fn])
             subprocess.Popen(path.split())
     except Exception as e:
         qtcommon.message_exc(self, "Open editor error", e=e)
Пример #9
0
    def __init__(self, flow, proj, opts):
        'proj - prog.projroot.ProjectDB'
        super().__init__()
        # init position (will be changed by opts data)
        self.resize(800, 600)
        self.setWindowIcon(QtGui.QIcon(":/biostata"))
        self.setGeometry(
            QtWidgets.QStyle.alignedRect(
                QtCore.Qt.LeftToRight, QtCore.Qt.AlignCenter, self.size(),
                QtWidgets.qApp.desktop().availableGeometry()))
        self.__subwindows = []

        # data
        self.proj = proj
        self.flow = flow
        self.opts = opts

        self.models = []
        self.tabframes = []
        self.active_model = None
        self.reload_options()

        # assemble actions
        self._build_acts()

        # interface
        self._ui()

        # restore
        try:
            state, geom = self.opts.mainwindow_state()
            self.restoreState(state)
            self.restoreGeometry(geom)
        except Exception as e:
            basic.ignore_exception(e)

        # signals to slots
        self.flow.command_done.add_subscriber(self._update_menu_status)
        self.active_model_changed.connect(self._update_menu_status)
        self.database_saved.connect(self._update_menu_status)
        self.wtab.currentChanged.connect(self._tab_changed)
        self.proj.xml_saved.add_subscriber(self.to_xml)
        self.proj.xml_loaded.add_subscriber(self.restore_from_xml)
        self.proj.monitor_recent_db(self.opts)
        QtWidgets.qApp.aboutToQuit.connect(self._on_quit)

        # Load data
        self.reset_title()
        filename = self.opts.default_project_filename()
        if filename is not None:
            try:
                self.acts['Open database'].load(filename)
            except Exception as e:
                qtcommon.message_exc(self, "Load error", e=e)
                self._close_database()
Пример #10
0
 def do(self):
     from bgui import joindlg
     dialog = joindlg.JoinTablesDialog(self.amodel().dt, self.mainwin)
     if dialog.exec_():
         try:
             name, tabentries = dialog.ret_value()
             dt = derived_tabs.join_table(name, tabentries, self.proj)
             com = maincoms.ComAddTable(self.mainwin, dt)
             self.flow.exec_command(com)
         except Exception as e:
             qtcommon.message_exc(self.mainwin, 'Join error', e=e)
Пример #11
0
 def do(self):
     from bgui import dictdlg
     try:
         dialog = dictdlg.DictInformation(self.proj, self.mainwin)
         if dialog.exec_():
             ret = dialog.ret_value()
             if ret:
                 com = maincoms.ComChangeDictionaries(self.mainwin, ret)
                 self.flow.exec_command(com)
     except Exception as e:
         qtcommon.message_exc(self.mainwin, "Error", e=e)
         self.mainwin.update()
Пример #12
0
 def do_load(self):
     try:
         if self.spec.confirm_input():
             od = self.spec.ret_value()
             self.load_table(od)
             tab = self.com.tab
             cap = self.com.caps
             self.draw_table(cap, tab)
             self.buttonbox.button(
                 QtWidgets.QDialogButtonBox.Ok).setEnabled(True)
         self.data_was_loaded.emit()
     except Exception as e:
         qtcommon.message_exc(self, "File parsing error", e=e)
Пример #13
0
 def do(self):
     from bgui import colinfodlg
     try:
         dialog = colinfodlg.TablesInfo(self.proj, self.mainwin)
         if dialog.exec_():
             newdicts, ret = dialog.ret_value()
             if not ret:
                 return
             else:
                 com = maincoms.ComConvertColumns(self.mainwin, newdicts,
                                                  ret)
                 self.flow.exec_command(com)
     except Exception as e:
         qtcommon.message_exc(self.mainwin, "Error", e=e)
         self.mainwin.update()
Пример #14
0
 def accept(self):
     from prog import valuedict
     try:
         name = self.e_name.text().strip()
         if len(name) == 0 or name[0] == '_':
             raise Exception("Invalid dictionary name")
         if name != self._ignore_name and name in self.projdict:
             raise Exception("{} dictionary already exists".format(name))
         tp = self.e_type.currentText()
         keys = self.e_table.model().get_keys()
         vals = self.e_table.model().get_values()
         comms = self.e_table.model().get_comms()
         self._ret_value = valuedict.Dictionary(name, tp, keys, vals, comms)
         return super().accept()
     except Exception as e:
         qtcommon.message_exc(self, "Invalid input", e=e)
Пример #15
0
    def _act_eview(self):
        from fileproc import export
        import subprocess
        try:
            # temporary filename
            fname = export.get_unused_tmp_file('xlsx')

            # choose editor
            prog = self.mw.require_editor('xlsx')
            if not prog:
                return
            # export to a temporary
            export.qmodel_xlsx_export(self.tab.model(), fname, True, True)
            # open with editor
            path = ' '.join([prog, fname])
            subprocess.Popen(path.split())
        except Exception as e:
            qtcommon.message_exc(self, "Open error", e=e)
Пример #16
0
 def calc(self):
     # get colnames which currently present in dt
     cn = []
     for nm in self.colnames:
         if self.dt.get_column(nm) is not None:
             cn.append(nm)
     if len(cn) == 0:
         qtcommon.message_exc(self, text='Data columns are not availible.')
     # build linkage
     self.linkage = stats.HierarchicalLinkage(self.dt, cn, None)
     self.acts['Inspect selection'].reset()
     self._bu_captions = {}
     # save state
     self.tab_state = self.dt.state_hash()
     # set possible x-axis captions
     self.xlab_wdg.set_items(
         [x.name for x in self.dt.all_columns if x.is_category()])
     # calculate
     self.recalc()
Пример #17
0
 def accept(self):
     try:
         ret = {}
         # Find removed dicts
         # [(removed name, was it in use?)], [not removed dicts]
         rem_dicts, left_dicts =\
             DictInfoItem.search_for_removed(self.ditems, self.proj)
         # [(changed name, new dict, was it shrinked?)]
         changed_dicts = DictInfoItem.search_for_changed(self.ditems)
         # new dicts:
         ret['__new__'] = DictInfoItem.search_for_new(self.ditems)
         # check if length > 0:
         rdicts = ret['__new__'] + left_dicts
         lenum = len([x for x in rdicts if x.dt_type == 'ENUM'])
         lbool = len([x for x in rdicts if x.dt_type == 'BOOL'])
         if lenum == 0:
             raise Exception("At least one enum dictionary is needed.")
         if lbool == 0:
             raise Exception("At least one bool dictionary is needed.")
         # removed
         ask_reconvert = False
         for a in rem_dicts:
             ret[a[0]] = None
             if a[1]:
                 ask_reconvert = True
         # changed
         for a in changed_dicts:
             ret[a[0]] = a[1]
             if a[2]:
                 ask_reconvert = True
         if ask_reconvert:
             r = QtWidgets.QMessageBox.question(
                 self, "Confirmation", "Edited dictionaries were used by "
                 "table data. Related columns "
                 "will be reconverted, "
                 "related filters will be removed. Continue?",
                 QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
             if r != QtWidgets.QMessageBox.Ok:
                 return
         self._ret_value = ret
         super().accept()
     except Exception as e:
         qtcommon.message_exc(self, "Invalid input", e=e)
Пример #18
0
    def accept(self):
        try:
            name = self.get_table_name()
            self.proj.is_valid_table_name(name)

            columns = self.table.model().get_columns()
            cnames = [c[0] for c in columns]
            for c in cnames:
                self.proj.is_possible_column_name(c)
            if len(set(cnames)) != len(cnames):
                raise Exception("Column names should be unique.")

            self.com.opt.tabname = name
            self.com.tab = self.table.model().get_tab()
            self.com.caps = [c[0] for c in columns]
            self.com.tps = [c[1] for c in columns]
            self.com.dnames = [c[2] for c in columns]
            return super().accept()
        except Exception as e:
            qtcommon.message_exc(self, "Invalid input", e=e)
Пример #19
0
 def set_captions(self):
     if not self.linkage.was_calculated():
         return
     cn = self.xlab_wdg.combo.currentText()
     if cn == '_row index':
         vfrom = self.linkage.rowid
     else:
         if cn in self._bu_captions:
             vfrom = self._bu_captions[cn]
         else:
             if self.is_legal_state():
                 vfrom = np.array(self.dt.get_column_values(cn))
                 vfrom = vfrom[self.linkage.rowid - 1]
                 self._bu_captions[cn] = vfrom
             else:
                 qtcommon.message_exc(self, text='Syncronize data!')
                 return self.xlab_wdg.combo.setCurrentText('_row index')
     caps = list(
         map(lambda x: str(vfrom[x]), self.scene.dendrogram.bottom_order))
     self.scene.set_captions(caps)
Пример #20
0
 def save(self):
     try:
         self.proj.commit_all_changes()
         self.database_saved.emit()
     except Exception as e:
         qtcommon.message_exc(self, "Save error", e=e)