Beispiel #1
0
    def sub_selection_page(self):

        if hasattr(self, '_sub_selection_page'):
            return self._sub_selection_page

        page = QtGui.QWizardPage()
        page.setTitle("Selection")
        page.setSubTitle(
            "Select the subs you'd like to import.")

        self._subs_widget = SubscriptionTreeWidget(self.subs, 
            show_categories=self._category_lookup.keys())
        self._subs_widget.setFocusPolicy(QtCore.Qt.NoFocus)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(QtGui.QLabel('Available for import :'))
        layout.addWidget(self._subs_widget)

        page.setLayout(layout)

        self._sub_selection_page = page
        return self._sub_selection_page
Beispiel #2
0
class SubscriptionImportWizard(QtGui.QWizard):

    # -------------------------------------------------------------------------
    def __init__(self, session=None, parent=None):

        super(SubscriptionImportWizard, self).__init__(parent=parent)

        self.setModal(True)

        if not session:
            session = SessionRegistry().current()

        self._session = session

        logo_pixmap = QtGui.QPixmap(
            IconFactory().disk_path("icon:///images/icons/import_32x32.png"))

        self.setWindowTitle("Subscription Import")
        self.setPixmap(QtGui.QWizard.LogoPixmap, logo_pixmap)

        # get entity classes
        entity_classes = EntityRegistry().get_entity_classes(
            self.session.app_name)

        # map entity category to class
        self._category_lookup = {}
        for cls in entity_classes:
            self._category_lookup[cls.category] = cls

        selection_id = self.addPage(self.sub_selection_page)
        options_id = self.addPage(self.import_options_page)

        self.setOption(QtGui.QWizard.CancelButtonOnLeft, on=True)
        self.setButtonText(QtGui.QWizard.FinishButton, 'Import')

        self._subs_widget.itemSelectionChanged.connect(self._toggle_options)

        if not self._subs_widget.repr_items: 
            QtGui.QMessageBox.warning(self.parent(), "Import Warning",
                "<b>No subs available to Import</b>."
            )
            self.NO_SUBS = True

    # -------------------------------------------------------------------------
    def accept(self):

        # XXX currently assuming imports are fast. imports could be time 
        # consuming. should probably do these in a separate thread or at 
        # least give the user some more feedback about what is happening.

        self.setEnabled(False)

        errors = []

        for repr_item in self._subs_widget.selected_repr_items():
            
            representation = repr_item.representation
            category = repr_item.product.category
            entity_class = self._category_lookup[category]

            option_widget = self._options[representation]['widget']

            try:
                entities = entity_class.import_product_representation(
                    self.session,
                    representation,
                    **option_widget.value
                )
            except EntityError as e:
                errors.append(e)

        if errors:
            error_dialog = QtGui.QErrorMessage(self)
            error_dialog.setWindowTitle("Import Errors")
            error_dialog.showMessage(
                "There were errors during import:<br><br>" + \
                "<br>".join([str(e) for e in errors])
            )

        super(SubscriptionImportWizard, self).accept()

    # -------------------------------------------------------------------------
    def showEvent(self, event):
        super(SubscriptionImportWizard, self).showEvent(event)
        self._toggle_options()

    # -------------------------------------------------------------------------
    @property
    def import_options_page(self):

        if hasattr(self, '_import_options_page'):
            return self._import_options_page

        page = QtGui.QWizardPage()
        page.setTitle("Options")
        page.setSubTitle(
            "Set the options for the subs being imported.")

        self._options = defaultdict(dict)

        options_layout = QtGui.QVBoxLayout()

        for repr_item in self._subs_widget.repr_items:
            representation = repr_item.representation

            entity_class = self._category_lookup[repr_item.product.category]
            option_config = entity_class.option_config(
                self.session, 'import', file_type=representation.type)

            display_name = repr_item.product.name
            if representation.resolution != "none":
                display_name += " @" + representation.resolution
            display_name += " (." + representation.type + " " + \
                repr_item.product.category + ")"

            option_widget = ActionOptionWidget(option_config, 
                name=display_name)
            option_header = option_widget.header

            form_layout = QtGui.QFormLayout()
            form_layout.addRow(option_header)

            spacer = QtGui.QLabel()
            spacer.setFixedWidth(10)

            form_layout.addRow(option_widget)

            options_layout.addLayout(form_layout)

            h_rule = QtGui.QFrame()
            h_rule.setLineWidth(0)
            h_rule.setMidLineWidth(0)
            h_rule.setFrameStyle(QtGui.QFrame.HLine | QtGui.QFrame.Plain)

            options_layout.addWidget(h_rule)

            self._options[representation]['widget'] = option_widget
            self._options[representation]['header'] = option_header

            option_widget.value_changed.connect(self._check_option_values)

        options_layout.addStretch()

        options_widget = QtGui.QWidget()
        options_widget.setLayout(options_layout)

        scroll_area = QtGui.QScrollArea()
        scroll_area.setFocusPolicy(QtCore.Qt.NoFocus)
        scroll_area.setWidgetResizable(True)
        scroll_area.setWidget(options_widget)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(scroll_area)

        page.setLayout(layout)

        self._import_options_page = page
        return self._import_options_page

    # -------------------------------------------------------------------------
    @property
    def sub_selection_page(self):

        if hasattr(self, '_sub_selection_page'):
            return self._sub_selection_page

        page = QtGui.QWizardPage()
        page.setTitle("Selection")
        page.setSubTitle(
            "Select the subs you'd like to import.")

        self._subs_widget = SubscriptionTreeWidget(self.subs, 
            show_categories=self._category_lookup.keys())
        self._subs_widget.setFocusPolicy(QtCore.Qt.NoFocus)

        layout = QtGui.QVBoxLayout()
        layout.addWidget(QtGui.QLabel('Available for import :'))
        layout.addWidget(self._subs_widget)

        page.setLayout(layout)

        self._sub_selection_page = page
        return self._sub_selection_page

    # -------------------------------------------------------------------------
    @property
    def session(self):
        return self._session

    # -------------------------------------------------------------------------
    @property
    def subs(self):

        if not hasattr(self, '_subs'):

            ptask_version = self.session.ptask_version
            self._subs = ptask_version.subscriptions

        return self._subs

    # -------------------------------------------------------------------------
    def _check_option_values(self):

        finish_btn = self.button(QtGui.QWizard.FinishButton)
        
        for repr_item in self._subs_widget.repr_items:

            representation = repr_item.representation
            option_widget = self._options[representation]['widget']

            if not option_widget.isVisible():
                continue

            if not option_widget.value_ok:
                finish_btn.setEnabled(False)
                return
        
        finish_btn.setEnabled(True)

    # -------------------------------------------------------------------------
    def _toggle_options(self):

        some_selected = False

        for repr_item in self._subs_widget.repr_items:

            representation = repr_item.representation

            option_header = self._options[representation]['header']
            option_widget = self._options[representation]['widget']

            if repr_item.isSelected():
                option_header.show() 
                option_widget.show() 
                some_selected = True
            else:
                option_header.hide() 
                option_widget.hide() 

        next_btn = self.button(QtGui.QWizard.NextButton)
        finish_btn = self.button(QtGui.QWizard.FinishButton)

        if some_selected:
            next_btn.setEnabled(True) 
            finish_btn.setEnabled(True) 
        else:
            next_btn.setEnabled(False)
            finish_btn.setEnabled(False)