Ejemplo n.º 1
0
def error(title, message, can_continue=False):
    """Display an error, and exit if can_continue is False.

    Displays a message box if PyQt5 is available, otherwise write the error to
    stderr.

    """
    try:
        from PyQt5.QtWidgets import QApplication, QMessageBox
    except ImportError:
        write = sys.stderr.write
        write(title + '\n')
        write(message + '\n')
        if can_continue:
            write("Continuing...\n")
        else:
            write("Exiting.\n")
            sys.exit(1)
    else:
        app = QApplication([])
        box = QMessageBox()
        box.setIcon(QMessageBox.Critical)
        box.setWindowTitle("Frescobaldi")
        box.setText(title)
        box.setInformativeText(message)
        if can_continue:
            box.setStandardButtons(QMessageBox.Abort | QMessageBox.Ignore)
            box.button(QMessageBox.Ignore).setText("Continue")
        else:
            box.setStandardButtons(QMessageBox.Abort)
        box.button(QMessageBox.Abort).setText("Quit")
        result = box.exec()
        app.quit()
        if not can_continue or result == QMessageBox.Abort:
            sys.exit(1)
Ejemplo n.º 2
0
    def delete_customer(self):
        if self._assert_any_checked():
            msg_box = QMessageBox(self)
            msg_box.setIcon(QMessageBox.Question)
            msg_box.setWindowTitle('Informacja')
            msg_box.setText('Na pewno usunąć kontrahenta?')
            msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
            buttonY = msg_box.button(QMessageBox.Yes)
            buttonY.setText('Tak')
            buttonN = msg_box.button(QMessageBox.No)
            buttonN.setText('Nie')
            msg_box.exec_()

            if msg_box.clickedButton() == buttonY:
                session = data.Session()
                element = self.customersTableView.selectionModel(
                ).selectedIndexes()
                try:
                    c = session.query(data.Customer).filter(
                        data.Customer.alias == element[0].data()).one()
                    session.delete(c)
                    session.commit()
                    QMessageBox.information(self, 'Informacja',
                                            'Kontrahent usunięty')
                    self._refresh_table()
                except Exception:
                    QMessageBox.warning(self, 'Błąd', 'Nieznany błąd')
                finally:
                    session.close()
Ejemplo n.º 3
0
    def btn_learn_on_clicked(self):
        if not self.pos_xy:
            QMessageBox.critical(self, "注意", "请先写入您要学习的数字!")
            return None

        # 获取要学习的数字learn_num
        learn_num = self.combo_table.currentIndex()

        # 弹出确认对话框
        qbox = QMessageBox()
        qbox.setIcon(QMessageBox.Information)
        qbox.setWindowTitle("请确认")
        qbox.setText("学习数字 %d ?" % learn_num)
        qbox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        qbox.setDefaultButton(QMessageBox.No)
        qbox.button(QMessageBox.Yes).setText("是")
        qbox.button(QMessageBox.No).setText("否")
        reply = qbox.exec()

        # 判断对话框结果,执行程序
        if reply == QMessageBox.Yes:
            learn_result = False
            learn_dim = self.get_pos_xy()
            if learn_dim:
                learn_result = self.learn_db.learn_data(learn_num, learn_dim)
            else:
                print('get_pos_xy()函数返回空值')
                return None

            if learn_result:
                QMessageBox.about(self, "提示", "学习成功!")
            else:
                QMessageBox.about(self, "提示", "学习失败!")
        else:
            return None
Ejemplo n.º 4
0
    def delete_button_function(self, nome, rua, número, bairro):
        rowid = dm.get_customer_id(nome=nome, rua=rua, número=número, bairro=bairro)

        msg = QMessageBox()
        msg.setWindowTitle('Alerta')
        msg.setText('Você tem certeza que deseja REMOVER esse cliente?')
        msg.setStandardButtons(QMessageBox.No | QMessageBox.Yes)
        msg.button(msg.Yes).setText('Sim')
        msg.button(msg.No).setText('Não')
        msg.setIcon(QMessageBox.Question)
        msg.setDefaultButton(QMessageBox.No)

        self.delete_customer_answer = None
        msg.buttonClicked.connect(self.delete_customer_popup_clicked)

        x = msg.exec_()

        if self.delete_customer_answer == 'Sim':
            dm.delete_customer(rowid=rowid)
            self.search_customers()
            self.search_month_sales()

            msg = QMessageBox()
            msg.setWindowTitle('Alerta')
            msg.setText('Cliente removido com sucesso')
            msg.exec_()
            self.item_clicked_dialog.close()
def question_window(text,
                    informative_text="",
                    titel="Sind Sie sicher?",
                    detailed_text="",
                    buttontext_yes="Ja",
                    buttontext_no="Nein",
                    default="yes"):
    msg = QMessageBox()
    msg.setIcon(QMessageBox.Question)
    msg.setWindowIcon(QIcon(logo_path))
    msg.setWindowTitle(titel)
    msg.setText(text)
    msg.setInformativeText(informative_text)
    msg.setDetailedText(detailed_text)
    msg.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
    if default == "no":
        msg.setDefaultButton(QMessageBox.No)
    buttonY = msg.button(QMessageBox.Yes)
    buttonY.setText(buttontext_yes)
    buttonN = msg.button(QMessageBox.No)
    buttonN.setText(buttontext_no)
    response = msg.exec_()
    if response == QMessageBox.No:
        return False
    if response == QMessageBox.Yes:
        return True
Ejemplo n.º 6
0
 def _show_del(self, checked):
     # check item
     item = self.list.currentItem()
     # setup box
     mbox = QMessageBox(QMessageBox.Question, lang['DELETE']['title'],
                        lang['DELETE']['question'], QMessageBox.Yes |
                        QMessageBox.No | QMessageBox.Cancel, self)
     mbox.setWindowIcon(QIcon(DELETE))
     # setup 'Yes' button
     yes = mbox.button(QMessageBox.Yes)
     yes.setText(lang['DELETE']['yes'])
     yes.setToolTip(lang['DELETE']['yes_tt'])
     # setup 'No' button
     no = mbox.button(QMessageBox.No)
     no.setText(lang['DELETE']['no'])
     no.setToolTip(lang['DELETE']['no_tt'])
     # setup 'Cancel' button
     cancel = mbox.button(QMessageBox.Cancel)
     cancel.setText(lang['DELETE']['cancel'])
     cancel.setToolTip(lang['DELETE']['cancel_tt'])
     # deleting
     key = mbox.exec()
     if key == QMessageBox.Yes:
         manager.remove_from_desktop(item.text(), True)
     elif key == QMessageBox.No:
         manager.remove_from_desktop(item.text())
     else:
         return
     # change item font
     font = item.font()
     font.setBold(False)
     item.setFont(font)
     # changing enabled
     self.__change_enabled()
Ejemplo n.º 7
0
 def buildDrive(self):
     box = QMessageBox()
     box.setIcon(QMessageBox.Question)
     box.setWindowTitle('Create Drive')
     box.setText('Are you sure you want to create this drive?')
     box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
     box.setDefaultButton(QMessageBox.No)
     button_yes = box.button(QMessageBox.Yes)
     button_yes.setText('Ok')
     button_no = box.button(QMessageBox.No)
     button_no.setText('Cancel')
     box.exec_()
     letter, dr, name = self.letterBox.currentText(
     ), self.directoryEdit.toPlainText(), self.nameEdit.toPlainText()
     if dr != '' and name != '':
         if box.clickedButton() == button_yes:
             config = cp.ConfigParser()
             config.read('mappedDrives.ini')
             section = letter + name
             sections = config.sections()
             if section not in sections:
                 MappedDrive(letter, dr, name)
                 config.add_section(section)
                 with open("mappedDrives.ini", "w+") as f:
                     config.write(f)
     else:
         box = QMessageBox()
         box.setIcon(QMessageBox.Warning)
         box.setWindowTitle('Missing Arguments')
         box.setText('Please fill all the text boxes')
         box.setStandardButtons(QMessageBox.Ok)
         box.setDefaultButton(QMessageBox.Ok)
         button = box.button(QMessageBox.Ok)
         button.setText('Close')
         box.exec_()
Ejemplo n.º 8
0
    def closeEvent(self, event):
        if self.user:
            update_user(self.user)  # On close, update user wins/losses/draws
            if self.stack.currentIndex(
            ) == 1 and not self.game_frame.board.saved:
                save_prompt = QMessageBox()
                save_prompt.setWindowIcon(
                    QIcon('./assets/icons/pawn_icon.png'))
                save_prompt.setIcon(QMessageBox.Warning)
                save_prompt.setWindowTitle("Chess")
                save_prompt.setText("Your current progress will be lost.")
                save_prompt.setInformativeText("Do you want to save the game?")
                save_prompt.setStandardButtons(QMessageBox.Save
                                               | QMessageBox.Discard
                                               | QMessageBox.Cancel)
                save_prompt.setDefaultButton(QMessageBox.Save)
                save_prompt.button(QMessageBox.Discard).setText("Don't Save")
                option = save_prompt.exec_()

                # Save
                if option == QMessageBox.Save:
                    self.game_frame.board.save()
                    event.accept()
                # Don't save
                elif option == QMessageBox.Discard:
                    event.accept()
                # Cancel
                else:
                    event.ignore()
Ejemplo n.º 9
0
    def show_message(self, av, t):
        """ Show message to user """

        m = QMessageBox()
        m.setText(self.tr(t))
        if av == "P":
            m.setIcon(QMessageBox.Information)
            m.setWindowTitle("Pregunta")
            m.setStandardButtons(QMessageBox.Ok | QMessageBox.No)
            b1 = m.button(QMessageBox.Ok)
            b1.setText("Si")
            b2 = m.button(QMessageBox.No)
            b2.setText("No")
        else:
            if av == "W":
                m.setIcon(QMessageBox.Warning)
                z = "Atención"
            elif av == "C":
                m.setIcon(QMessageBox.Critical)
                z = "Error"
            else:
                m.setIcon(QMessageBox.Information)
            m.setWindowTitle("Aviso")
            m.setStandardButtons(QMessageBox.Ok)
            b = m.button(QMessageBox.Ok)
            b.setText("Seguir")

        return m.exec_()
Ejemplo n.º 10
0
def YesNoAbortDialog(title:str='Question', text:str='Answer?', textYes:str='Yes', textNo:str='No', textAbort:str=None):

    box = QMessageBox()
    box.setIcon(QMessageBox.Question)
    box.setWindowTitle(title)
    box.setText(text)

    box.setStandardButtons(QMessageBox.Yes|QMessageBox.No)
    if (textAbort is not None):
        box.setStandardButtons(QMessageBox.Yes|QMessageBox.No|QMessageBox.Abort)
        abortBtn = box.button(QMessageBox.Abort)
        abortBtn.setText(textAbort)
    else:
        abortBtn=None
        
    buttonY = box.button(QMessageBox.Yes)
    buttonY.setText(textYes)
    buttonN = box.button(QMessageBox.No)
    buttonN.setText(textNo)
    box.exec_()

    if (box.clickedButton()==buttonY):
        return QMessageBox.Yes
    elif (box.clickedButton()==buttonN):
        return QMessageBox.No
    elif (box.clickedButton()==abortBtn):
        return QMessageBox.Abort

    return None
Ejemplo n.º 11
0
    def fileDelete(self):
        # 弹出提示窗口询问
        messageBox = QMessageBox()
        messageBox.setWindowTitle('提示')
        messageBox.setText('确定删除该作品?')
        messageBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
        buttonY = messageBox.button(QMessageBox.Yes)
        buttonY.setText('确定')
        buttonN = messageBox.button(QMessageBox.No)
        buttonN.setText('取消')
        messageBox.exec_()
        response = messageBox.clickedButton()
        if response == buttonN:
            return

        # 获取目前选中的列表项的行数
        curRow = self.listWidget.currentRow()
        # 获取作品id
        iid = self.fileInfoList[curRow]['iid']
        response = self.clientSocket.deleteWork(self.token, iid)
        if response:
            simpleMessageBox('提示', '删除成功,作品id: ' + iid)
            # 刷新文件列表
            self.downLoadWork_myWork()
        else:
            simpleMessageBox('提示', '删除失败')
Ejemplo n.º 12
0
 def validate(self):
     """Checks if the input is acceptable.
     
     If this method returns True, the dialog is accepted when OK is clicked.
     Otherwise a messagebox could be displayed, and the dialog will remain
     visible.
     """
     name = self.name.text().strip()
     self.name.setText(name)
     if not name:
         self.name.setFocus()
         QMessageBox.warning(self, app.caption(_("Warning")),
             _("Please enter a session name."))
         if self._originalName:
             self.name.setText(self._originalName)
         return False
     
     elif name == '-':
         self.name.setFocus()
         QMessageBox.warning(self, app.caption(_("Warning")),
             _("Please do not use the name '{name}'.".format(name="-")))
         return False
     
     elif self._originalName != name and name in sessions.sessionNames():
         self.name.setFocus()
         box = QMessageBox(QMessageBox.Warning, app.caption(_("Warning")),
             _("Another session with the name {name} already exists.\n\n"
               "Do you want to overwrite it?").format(name=name),
             QMessageBox.Discard | QMessageBox.Cancel, self)
         box.button(QMessageBox.Discard).setText(_("Overwrite"))
         result = box.exec_()
         if result != QMessageBox.Discard:
             return False
         
     return True
Ejemplo n.º 13
0
    def promptSaveDialog(self, exit_when_done=False):
        """Save on quit, check if document changes have occurred.

        Returns:
            SAVE_DIALOG_OPTIONS['CANCEL'] or
            SAVE_DIALOG_OPTIONS['DISCARD'] or
            SAVE_DIALOG_OPTIONS['SAVE']
        """
        if app().dontAskAndJustDiscardUnsavedChanges:
            return SAVE_DIALOG_OPTIONS['DISCARD']
        if not self.undoStack().isClean():  # document dirty?
            savebox = QMessageBox(
                QMessageBox.Warning, "Application",
                "The document has been modified.\nDo you want to save your changes?",
                QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel,
                self.win,
                Qt.Dialog | Qt.MSWindowsFixedSizeDialogHint | Qt.Sheet)
            savebox.setWindowModality(Qt.WindowModal)
            save = savebox.button(QMessageBox.Save)
            discard = savebox.button(QMessageBox.Discard)
            cancel = savebox.button(QMessageBox.Cancel)
            savebox.setDefaultButton(save)
            savebox.setEscapeButton(cancel)
            save.setShortcut("Ctrl+S")
            discard.setShortcut(QKeySequence("D,Ctrl+D"))
            cancel.setShortcut(QKeySequence("C,Ctrl+C,.,Ctrl+."))
            ret = savebox.exec_()
            del savebox  # manual garbage collection to prevent hang (in osx)
            if ret == QMessageBox.Save:
                self.exit_when_done = exit_when_done
                self.actionSaveAsSlot()
                return SAVE_DIALOG_OPTIONS['SAVE']
            elif ret == QMessageBox.Cancel:
                return SAVE_DIALOG_OPTIONS['CANCEL']
        return SAVE_DIALOG_OPTIONS['DISCARD']
Ejemplo n.º 14
0
    def update_button_function(self, client_id):
        msg = QMessageBox()
        msg.setWindowTitle('Alerta')
        msg.setText('Deseja atualizar esse cadastro?')
        msg.setStandardButtons(QMessageBox.No | QMessageBox.Yes)
        msg.button(msg.Yes).setText('Sim')
        msg.button(msg.No).setText('Não')
        msg.setIcon(QMessageBox.Question)
        msg.setDefaultButton(QMessageBox.Yes)
        self.update_customer_answer = None
        msg.buttonClicked.connect(self.update_customer_popup_clicked)
        x = msg.exec_()

        if self.update_customer_answer == 'Sim':
            novo_nome = self.edit_na_field.text()
            nova_rua = self.edit_st_field.text()
            novo_número = self.edit_nu_field.text()
            novo_bairro = self.edit_ba_field.text()
            nova_referência = self.edit_re_field.text()
            novo_telefone = self.edit_ph_field.text()

            dm.update_customer(rowid=client_id, nome=novo_nome, rua=nova_rua, número=novo_número, bairro=novo_bairro,
                               referência=nova_referência, telefone=novo_telefone)

            msg = QMessageBox()
            msg.setWindowTitle('Sucesso')
            msg.setText('Cadastro atualizado com sucesso')
            x = msg.exec_()

            self.search_customers()
            self.search_month_sales()
            self.edit_dialog.close()
        else:
            pass
Ejemplo n.º 15
0
 def confirm_close_cancel(self):
     """ Display dialog for close/cancel confirmation
         :returns: The users decision
         :rtype: bool
     """
     message = _('Currently creating new container!\nDo you really want to quit?')
     mb = QMessageBox(QMessageBox.Question, '', message, QMessageBox.Ok | QMessageBox.Cancel, self)
     mb.button(QMessageBox.Ok).setText(_('Quit'))
     return mb.exec_() == QMessageBox.Ok
Ejemplo n.º 16
0
 def confirm_close(self):
     """ Inform about opened container and ask for confirmation to close & quit """
     message = _('<b>{device_name}</b> >> {container_path}\n'
                 'is currently <b>unlocked</b>,\n'
                 'Close Container now and quit?').format(device_name=self.luks_device_name,
                                                         container_path=self.encrypted_container)
     mb = QMessageBox(QMessageBox.Question, '', message, QMessageBox.Ok | QMessageBox.Cancel, self)
     mb.button(QMessageBox.Ok).setText(_('Quit'))
     if mb.exec_() == QMessageBox.Ok:
         self.do_close_container(shutdown=True)
Ejemplo n.º 17
0
def base_except_hook(exc_type, exc_value, exc_traceback):
    """
    Used to handle all uncaught exceptions.
    :type exc_type: class
    :type exc_value: Exception
    :type exc_traceback: Traceback
    """
    global app
    global box

    if issubclass(exc_type, KeyboardInterrupt):

        app.quit()

    else:

        if not box:

            m1 = 'This is embarrassing ...\n\n' \
                 'A critical error has just occurred. ' \
                 'Eddy will continue to work, however a reboot is highly recommended.'
            m2 = 'If the problem persists please <a href="{}">submit a bug report</a>.'.format(BUG_TRACKER)
            m3 = ''.join(traceback.format_exception(exc_type, exc_value, exc_traceback))

            box = QMessageBox()
            box.setIconPixmap(QPixmap(':/images/eddy-sad'))
            box.setWindowIcon(QIcon(':/images/eddy'))
            box.setWindowTitle('Unhandled error!')
            box.setText(m1)
            box.setInformativeText(m2)
            box.setDetailedText(m3)
            box.setStandardButtons(QMessageBox.Close|QMessageBox.Ok)

            buttonOk = box.button(QMessageBox.Ok)
            buttonOk.setText('Close')
            buttonQuit = box.button(QMessageBox.Close)
            buttonQuit.setText('Quit {}'.format(APPNAME))

            connect(buttonOk.clicked, box.close)
            connect(buttonQuit.clicked, app.quit)

            # noinspection PyArgumentList
            QApplication.beep()

            box.exec_()
            box = None
Ejemplo n.º 18
0
    def confirmDestructive(self):
        mb = QMessageBox(self.widget)
        mb.setIcon(QMessageBox.Warning)
        mb.setInformativeText("The plugin you are trying to install\
has already been installed. Replace the currently installed one?")
        mb.setStandardButtons(QMessageBox.No | QMessageBox.Yes)
        mb.exec_()
        return mb.clickedButton() == mb.button(QMessageBox.Yes)
Ejemplo n.º 19
0
def handle_exception(name, view):
    """Called when a snippet raises a Python exception.
    
    Shows the error message and offers the option to edit the offending snippet.
    
    """
    import sys, traceback
    exc_type, exc_value, exc_traceback = sys.exc_info()
    tb = traceback.extract_tb(exc_traceback)
    while tb and tb[0][0] != "<snippet>":
        del tb[0]
    msg = ''.join(traceback.format_list(tb) +
                    traceback.format_exception_only(exc_type, exc_value))
    dlg = QMessageBox(QMessageBox.Critical, _("Snippet error"), msg,
        QMessageBox.Ok | QMessageBox.Cancel)
    dlg.button(QMessageBox.Ok).setText(_("Edit Snippet"))
    dlg.setDefaultButton(QMessageBox.Cancel)
    dlg.setEscapeButton(QMessageBox.Cancel)
    if dlg.exec_() != QMessageBox.Ok:
        return
    
    # determine line number
    if exc_type is SyntaxError:
        lineno = exc_value.lineno
    elif tb:
        lineno = tb[0][1]
    else:
        lineno = None
    
    import panelmanager
    from . import edit
    widget = panelmanager.manager(view.window()).snippettool.widget()
    textedit = edit.Edit(widget, name).text
    if lineno is not None:
        # convert to line number in full snippet text
        for block in cursortools.all_blocks(textedit.document()):
            if block.text().startswith('-*- '):
                lineno += 1
            else:
                break
        block = textedit.document().findBlockByNumber(lineno-1)
        if block.isValid():
            textedit.setTextCursor(QTextCursor(block))
Ejemplo n.º 20
0
    def on_new_topfolder(self):
        logger.info("User initiates top-level folder creation")
        message_box = QMessageBox(
            QMessageBox.Question,
            "Create Folder",
            "Create folder in the default location?",
            QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel,
            self.window()

        )
        message_box.button(QMessageBox.No).setText("Create elsewhere")  # TODO: i18n
        result = message_box.exec_()

        self.window().app.monitor.suspend()

        if result == QMessageBox.Yes:
            logger.debug("User creates a new top-level folder.")
            self.__createFolder(None)

        elif result == QMessageBox.No:
            logger.debug("User creates a new folder and chose to create it elsewhere")
            path = QFileDialog.getExistingDirectory(
                self.window(),
                "Where should the folder be created?"
            )
            if path != "":
                path = str(path)
                name = os.path.basename(path)
                folder = model.Folder(name, path=path)
                new_item = ak_tree.FolderWidgetItem(None, folder)
                self.treeWidget.addTopLevelItem(new_item)
                self.configManager.folders.append(folder)
                self.window().app.config_altered(True)

            self.window().app.monitor.unsuspend()
        else:
            logger.debug("User canceled top-level folder creation.")
            self.window().app.monitor.unsuspend()
Ejemplo n.º 21
0
 def maybeSave(self):
     """Save on quit, check if document changes have occured."""
     if app().dontAskAndJustDiscardUnsavedChanges:
         return True
     if not self.undoStack().isClean():    # document dirty?
         savebox = QMessageBox(QMessageBox.Warning,   "Application",
             "The document has been modified.\nDo you want to save your changes?",
             QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel,
             self.win,
             Qt.Dialog | Qt.MSWindowsFixedSizeDialogHint | Qt.Sheet)
         savebox.setWindowModality(Qt.WindowModal)
         save = savebox.button(QMessageBox.Save)
         discard = savebox.button(QMessageBox.Discard)
         cancel = savebox.button(QMessageBox.Cancel)
         save.setShortcut("Ctrl+S")
         discard.setShortcut(QKeySequence("D,Ctrl+D"))
         cancel.setShortcut(QKeySequence("C,Ctrl+C,.,Ctrl+."))
         ret = savebox.exec_()
         del savebox  # manual garbage collection to prevent hang (in osx)
         if ret == QMessageBox.Save:
             return self.actionSaveAsSlot()
         elif ret == QMessageBox.Cancel:
             return False
     return True
Ejemplo n.º 22
0
 def queryCloseDocument(self, doc):
     """Return True whether a document can be closed.
     
     When no job is running, True is immediately returned.
     When a job is running, the user is asked whether to abort the job (not
     for autocompile ("hidden") jobs).
     
     """
     job = jobmanager.job(doc)
     if not job or not job.is_running() or jobattributes.get(job).hidden:
         return True
     msgbox = QMessageBox(QMessageBox.Warning,
         _("Warning"),
         _("An engrave job is running for the document \"{name}\".\n"
           "Do you want to abort the running job?").format(name=doc.documentName()),
         QMessageBox.Abort | QMessageBox.Cancel,
         self.mainwindow())
     abort_button = msgbox.button(QMessageBox.Abort)
     signal = lambda: abort_button.click()
     job.done.connect(signal)
     msgbox.exec_()
     job.done.disconnect(signal)
     return msgbox.clickedButton() == abort_button
Ejemplo n.º 23
0
Archivo: importer.py Proyecto: mpi2/vpv
    def __init__(self, parent, callback, virtual_stack_callback, last_dir, appdata, dragged_files=None):
        super(Import, self).__init__(parent)
        self.ui = Ui_Dialog()
        self.ui.setupUi(self)
        self.last_dir = last_dir
        self.callback = callback
        self.appdata = appdata
        self.virtual_stack_callback = virtual_stack_callback

        # Connect up the buttons for movin gthe rows around
        # self.ui.pushButtonUp.clicked.connect(self.move_up)
        # self.ui.pushButtonDown.clicked.connect(self.move_down)

        # Setup signals
        self.ui.pushButtonCancel.clicked.connect(self.on_cancel)
        self.ui.pushButtonChooseFile.clicked.connect(self.on_choose_files)
        self.ui.pushButtonChoseDir.clicked.connect(self.on_load_virtual_stack)
        self.ui.pushButtonOK.clicked.connect(self.on_ok)
        self.ui.checkBoxAllSameType.clicked.connect(self.on_all_same_type)
        self.type_combo_boxes = None
        self.ui.virtualStackWidget.hide()
        self.ui.pushButtonFilter.clicked.connect(self.filter_virtual_stack)

        # Setup folder filtering
        self.ui.lineEditFolderFilter.editingFinished.connect(self.set_folder_filter_pattern)

        # Create the table
        self.files_to_open = []
        self.folder_include_pattern = None

        self.vs_file_list = []
        self.vs_file_list_to_ignore = set()

        self.use_virtual_stack = False
        self.all_same_type = False

        if dragged_files:
            self.files_to_open = dragged_files
            # If one path is dropped onto the main window and it's a directory, as if we want to load a stack of slices
            if len(dragged_files) == 1 and os.path.isdir(dragged_files[0]):

                # use_folder_of_slices = QtGui.QMessageBox.question(parent, 'Choose data type?',
                #                                                   "Load individual 2D slices from folder (yes)\n"
                #                                                   "Load multiple image volumes (No)",
                #                                                   'Hello' | QtGui.QMessageBox.No)
                box = QMessageBox()
                box.setIcon(QMessageBox.Question)
                box.setWindowTitle('Choose data type')
                box.setText('Load individual 2D slices from folder, or load multiple single images volumes?')
                box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
                button_y = box.button(QMessageBox.Yes)
                button_y.setText('Satack of 2D image slices')
                button_n = box.button(QMessageBox.No)
                button_n.setText('Load multiple 3D image volumes')
                box.exec_()
                if box.clickedButton() == button_y:
                    self.setWindowTitle("Load stack of 2D slices")
                    self.load_virtual_stack(dragged_files[0])
                else:
                    self.populate_file_list()
                    self.setWindowTitle("Load image volumes")
            else:
                self.populate_file_list()
                self.setWindowTitle("Load image volumes")
        else:
            self.populate_file_list()
            self.setWindowTitle("Load image volumes")

        self.show()