def setupUI(self):
        main_layout = QtGui.QVBoxLayout(self)
        main_layout.setContentsMargins(0, 0, 0, 0)
        main_layout.setSpacing(0)
        self._script_editor_tree = ScriptEditorTreeView(self)
        self._script_editor_tree.setSelectionMode(
            QtGui.QAbstractItemView.NoSelection)
        self._script_editor_tree.setIndentation(20)
        self._script_editor_tree.setAnimated(True)
        self._script_editor_tree.setHeaderHidden(True)
        self._script_editor_tree.setExpandsOnDoubleClick(True)
        self._script_editor_tree.file_dropped.connect(self._emit_dropped_file)
        main_layout.addWidget(self._script_editor_tree)

        self._option_frame = QtGui.QFrame(self)
        option_layout = QtGui.QHBoxLayout(self._option_frame)
        option_layout.setContentsMargins(0, 8, 0, 8)
        option_layout.setSpacing(8)
        # filter_lbl = QtGui.QLabel("Filter", self._option_frame)
        css_filter = """
        QLineEdit { border: 1px solid #666;
                    background: #555; color: #000; }
        """

        self._filter_edit = QtGui.QLineEdit(self._option_frame)
        self._filter_edit.setMaximumHeight(20)
        # self._filter_edit.setStyleSheet(css_filter)
        self._filter_edit.textChanged.connect(self._set_filter)
        self._previous_occurence = QtGui.QPushButton('previous',
                                                     self._option_frame)
        # self._previous_occurence.setArrowType(QtCore.Qt.LeftArrow)
        # self._previous_occurence.setMaximumWidth(20)
        # self._previous_occurence.setMaximumHeight(20)
        self._next_occurence = QtGui.QPushButton('next', self._option_frame)
        # self._next_occurence.setArrowType(QtCore.Qt.RightArrow)
        # self._next_occurence.setMaximumWidth(20)
        # self._next_occurence.setMaximumHeight(20)
        spacer = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding,
                                   QtGui.QSizePolicy.Minimum)
        self._collapse_all_btn = QtGui.QPushButton("Collapse All",
                                                   self._option_frame)
        self._collapse_all_btn.setMaximumHeight(20)
        # self._collapse_all_btn.setStyleSheet(css_btn)
        self._collapse_all_btn.clicked.connect(
            self._script_editor_tree.collapseAll)
        self._expand_all_btn = QtGui.QPushButton("Expand All",
                                                 self._option_frame)
        self._expand_all_btn.setMaximumHeight(20)
        # self._expand_all_btn.setStyleSheet(css_btn)
        self._expand_all_btn.clicked.connect(
            self._script_editor_tree.expandAll)
        option_layout.addWidget(self._filter_edit)
        option_layout.addWidget(self._previous_occurence)
        option_layout.addWidget(self._next_occurence)
        option_layout.addItem(spacer)
        option_layout.addWidget(self._collapse_all_btn)
        option_layout.addWidget(self._expand_all_btn)

        main_layout.addWidget(self._option_frame)
    def _buildClipsTab(self):

        l = FnAssetAPI.l

        imageSpecification = ImageSpecification()

        # > Media Ta

        mediaWidget = QtGui.QWidget()
        mediaWidget.setSizePolicy(QtGui.QSizePolicy.Expanding,
                                  QtGui.QSizePolicy.Expanding)
        mediaWidgetLayout = QtGui.QVBoxLayout()
        mediaWidgetLayout.setAlignment(QtCore.Qt.AlignLeft
                                       | QtCore.Qt.AlignTop)
        mediaWidget.setLayout(mediaWidgetLayout)

        # - Shared Media

        self._sharedClipsGroup = QtGui.QGroupBox(
            l("Some Source Clips are Shared " +
              "and used in more than one Shot in the Edit"))
        mediaWidgetLayout.addWidget(self._sharedClipsGroup)
        sharedClipsGroupLayout = QtGui.QVBoxLayout()
        self._sharedClipsGroup.setLayout(sharedClipsGroupLayout)

        self._sharedIgnoredRadio = QtGui.QRadioButton(l("Don't {publish}"))
        self._sharedToSequenceRadio = QtGui.QRadioButton(
            l("{publish} at the level above the Shots"))
        self._sharedToCustomRadio = QtGui.QRadioButton(
            l("{publish} to another location"))
        self._sharedIgnoredRadio.setChecked(True)
        sharedClipsGroupLayout.addWidget(self._sharedIgnoredRadio)
        sharedClipsGroupLayout.addWidget(self._sharedToSequenceRadio)
        sharedClipsGroupLayout.addWidget(self._sharedToCustomRadio)

        ## @todo Use the project entityReferences Parent if we have one?

        pickerCls = self._session.getManagerWidget(
            FnAssetAPI.ui.constants.kInlinePickerWidgetId, instantiate=False)

        self._sharedClipParentPicker = pickerCls(imageSpecification,
                                                 self._context)
        self._sharedClipParentPicker.setVisible(False)
        sharedClipsGroupLayout.addWidget(self._sharedClipParentPicker)

        self._previewWidget = PublishShotClipsSummaryWidget()
        self._previewWidget.setSizePolicy(QtGui.QSizePolicy.Expanding,
                                          QtGui.QSizePolicy.Expanding)
        mediaWidgetLayout.addWidget(self._previewWidget)

        # - Options

        self._clipOptionsGroup = QtGui.QGroupBox(l("Options"))
        optionsGroupLayout = QtGui.QVBoxLayout()
        self._clipOptionsGroup.setLayout(optionsGroupLayout)
        mediaWidgetLayout.addWidget(self._clipOptionsGroup)

        # See if we have any options from the manager
        self._managerOptionsClip = self._session.getManagerWidget(
            FnAssetAPI.ui.constants.kRegistrationManagerOptionsWidgetId,
            throw=False,
            args=(imageSpecification, self._context))

        if self._managerOptionsClip:
            optionsGroupLayout.addWidget(self._managerOptionsClip)
            optionsGroupLayout.addSpacing(10)

        hieroOptionsGrid = QtGui.QGridLayout()

        ## @todo we should have some base widget for this

        hieroOptionsGrid.addWidget(QtGui.QLabel(l("{asset} name:")), 0, 0)

        self._clipNameCombo = QtGui.QComboBox()
        self._clipNameCombo.addItems(("Clip Name", "Custom"))
        hieroOptionsGrid.addWidget(self._clipNameCombo, 0, 1)

        self._clipNameCustomField = QtGui.QLineEdit()
        hieroOptionsGrid.addWidget(self._clipNameCustomField, 0, 2)

        self._replaceClipSource = QtGui.QCheckBox(
            l("Link Source Clips to " + "{published} {assets}"))
        hieroOptionsGrid.addWidget(self._replaceClipSource, 1, 1, 1, 2)

        self._ignorePublishedClips = QtGui.QCheckBox(
            l("Ignore Source Clips that are " + "already {published}"))
        hieroOptionsGrid.addWidget(self._ignorePublishedClips, 2, 1, 1, 2)

        # Make sure we don't stretch the grid layout too much and make the last
        #column really wide
        hieroOptionsHBox = QtGui.QHBoxLayout()
        optionsGroupLayout.addLayout(hieroOptionsHBox)
        hieroOptionsHBox.addLayout(hieroOptionsGrid)
        hieroOptionsHBox.addStretch()

        return mediaWidget