def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(750, 598)
        self.verticalLayout = QtGui.QVBoxLayout(Dialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.left_browser = ShotgunBrowserWidget(Dialog)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.left_browser.sizePolicy().hasHeightForWidth())
        self.left_browser.setSizePolicy(sizePolicy)
        self.left_browser.setObjectName("left_browser")
        self.horizontalLayout.addWidget(self.left_browser)
        self.verticalLayout_2 = QtGui.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum,
                                       QtGui.QSizePolicy.Expanding)
        self.verticalLayout_2.addItem(spacerItem)
        self.pushButton = QtGui.QPushButton(Dialog)
        self.pushButton.setText("")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/res/checkout.png"), QtGui.QIcon.Normal,
                       QtGui.QIcon.Off)
        self.pushButton.setIcon(icon)
        self.pushButton.setIconSize(QtCore.QSize(64, 64))
        self.pushButton.setFlat(True)
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout_2.addWidget(self.pushButton)
        self.pushButton_2 = QtGui.QPushButton(Dialog)
        self.pushButton_2.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/res/checkin.png"), QtGui.QIcon.Normal,
                        QtGui.QIcon.Off)
        self.pushButton_2.setIcon(icon1)
        self.pushButton_2.setIconSize(QtCore.QSize(64, 64))
        self.pushButton_2.setFlat(True)
        self.pushButton_2.setObjectName("pushButton_2")
        self.verticalLayout_2.addWidget(self.pushButton_2)
        spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum,
                                        QtGui.QSizePolicy.Expanding)
        self.verticalLayout_2.addItem(spacerItem1)
        self.horizontalLayout.addLayout(self.verticalLayout_2)
        self.right_browser = FilesystemBrowserWidget(Dialog)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.right_browser.sizePolicy().hasHeightForWidth())
        self.right_browser.setSizePolicy(sizePolicy)
        self.right_browser.setObjectName("right_browser")
        self.horizontalLayout.addWidget(self.right_browser)
        self.verticalLayout.addLayout(self.horizontalLayout)

        self.retranslateUi(Dialog)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
예제 #2
0
    def __setup_ui(self, callback):
        """
        Starts a QApplication and initializes the UI.
        """
        from tank.platform.qt import QtCore, QtGui

        # we got QT capabilities. Start a QT app and fire the command into the app
        tk_shotgun = self.import_module("tk_shotgun")

        t = tk_shotgun.Task(self, callback)

        # start up our QApp now
        qt_application = QtGui.QApplication([])
        qt_application.setWindowIcon(QtGui.QIcon(self.icon_256))
        self._initialize_dark_look_and_feel()

        # when the QApp starts, initialize our task code
        QtCore.QTimer.singleShot(0, t.run_command)

        # and ask the main app to exit when the task emits its finished signal
        t.finished.connect(qt_application.quit)

        # start the application loop. This will block the process until the task
        # has completed - this is either triggered by a main window closing or
        # byt the finished signal being called from the task class above.
        qt_application.exec_()
예제 #3
0
def start_app(engine):
    """ Run the QApplication for the given tk-desktop engine """
    if engine.has_ui:
        from tank.platform.qt import QtGui

        app = QtGui.QApplication([])
        app.setQuitOnLastWindowClosed(False)
        app.setApplicationName("%s Python" % engine.context.project["name"])

        # set default icon
        python_icon = os.path.realpath(
            os.path.join(os.path.dirname(__file__), "..", "..", "resources",
                         "python_icon.png"))
        app.setWindowIcon(QtGui.QIcon(python_icon))

        # Let the engine know we've created the app
        engine.register_qapplication(app)

        # use the toolkit look and feel
        engine._initialize_dark_look_and_feel()

        result = 0
        while True:
            # loop until we are signaled to close, in case an app accidentally quits the app
            result = app.exec_()
            if not engine.connected:
                # we have been signaled to quit rather than waiting for more commands
                break
        return result

    else:  # not engine.has_ui
        # wait for the engine communication channel to shut down
        engine.msg_server.join()
        return 0
예제 #4
0
def start_qt_app_and_show_modal(title, engine, widget_class, *args, **kwargs):
    """
    Wrapper around the engine.show_modal() call that first starts a 
    QApplication, then shows the window, then quits the QApplication.
    
    :param title: Window title
    :param engine: Engine object to associate with
    :param widget_class: UI class to create
    :param args/kwargs: parameters to pass to the UI
    
    :returns: The modal dialog return value
    """

    t = QtTask(title, engine, widget_class, args, kwargs)

    # start up our QApp now
    qt_application = QtGui.QApplication([])
    qt_application.setWindowIcon(QtGui.QIcon(engine.icon_256))
    engine._initialize_dark_look_and_feel()

    # when the QApp starts, initialize our task code
    QtCore.QTimer.singleShot(0, t.run_command)

    # and ask the main app to exit when the task emits its finished signal
    t.finished.connect(qt_application.quit)

    # start the application loop. This will block the process until the task
    # has completed - this is either triggered by a main window closing or
    # by the finished signal being called from the task class above.
    qt_application.exec_()

    return t.get_return_data()
    def clear_out_rv_roles(self):
        rows = self._tray_frame.tray_model.rowCount()

        for x in range(0,rows):
            index = self._tray_frame.tray_model.index(x, 0)
            self._tray_frame.tray_delegate.update_rv_role(index, None)

            # _CUT_THUMB_ROLE is the icon from the original query
            # _ORIGINAL_THUMBNAIL is a path to the cache.
            #thumb = index.data(self._CUT_THUMB_ROLE)
            orig_tn = index.data(self._ORIGINAL_THUMBNAIL)
            filtered_tn = index.data(self._FILTER_THUMBNAIL)
            
            if filtered_tn:
                self._tray_frame.tray_model.setData(index, None, self._FILTER_THUMBNAIL)

            if orig_tn:
                thumb = QtGui.QIcon(orig_tn)
                self._tray_frame.tray_model.setData(index, thumb, self._CUT_THUMB_ROLE)

                item = self._tray_frame.tray_model.itemFromIndex(index)
                item.setIcon(thumb)
                
        self._tray_frame.tray_model.notify_filter_data_refreshed(True)
        self._tray_frame.tray_list.repaint()
예제 #6
0
    def execute_command(self, cmd_key, args):
        """
        Executes a given command.
        """
        cb = self.commands[cmd_key]["callback"]

        # make sure the number of parameters to the command are correct
        cb_arg_spec = inspect.getargspec(cb)
        cb_arg_list = cb_arg_spec[0]
        cb_var_args = cb_arg_spec[1]

        if hasattr(cb, "__self__"):
            # first argument to cb will be class instance:
            cb_arg_list = cb_arg_list[1:]

        # ensure the correct/minimum number of arguments have been passed:
        have_expected_args = False
        if cb_var_args:
            have_expected_args = (len(args) >= len(cb_arg_list))
        else:
            have_expected_args = (len(args) == len(cb_arg_list))

        if not have_expected_args:
            expected_args = list(cb_arg_list)
            if cb_var_args:
                expected_args.append("*%s" % cb_var_args)
            raise TankError(
                "Cannot run command! Expected command arguments (%s)" %
                ", ".join(expected_args))

        if not self._has_qt:
            # QT not available - just run the command straight
            return cb(*args)
        else:
            from tank.platform.qt import QtCore, QtGui

            # we got QT capabilities. Start a QT app and fire the command into the app
            tk_shell = self.import_module("tk_shell")
            t = tk_shell.Task(self, cb, args)

            # start up our QApp now
            qt_application = QtGui.QApplication([])
            qt_application.setWindowIcon(QtGui.QIcon(self.icon_256))
            self._initialize_dark_look_and_feel()

            # now we have a working UI!
            self._has_ui = True

            # when the QApp starts, initialize our task code
            QtCore.QTimer.singleShot(0, t.run_command)

            # and ask the main app to exit when the task emits its finished signal
            t.finished.connect(qt_application.quit)

            # start the application loop. This will block the process until the task
            # has completed - this is either triggered by a main window closing or
            # byt the finished signal being called from the task class above.
            qt_application.exec_()
    def __init__(self, parent=None):
        QtGui.QPushButton.__init__(self, parent)

        # cache the icons for collapsed/expanded
        self.down_arrow = QtGui.QIcon(":tk-desktop/down_arrow.png")
        self.right_arrow = QtGui.QIcon(":tk-desktop/right_arrow.png")

        # adjust the button look
        self.setFlat(True)
        self.setStyleSheet("""
            text-align: left;
            font-size: 14px;
            background-color: transparent;
            border: none;
        """)

        # default is to be expanded
        self.setIcon(self.down_arrow)
예제 #8
0
    def setupUi(self, WorkAreaDialog):
        WorkAreaDialog.setObjectName("WorkAreaDialog")
        WorkAreaDialog.resize(443, 467)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/tk_multi_infopanel/rings.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        WorkAreaDialog.setWindowIcon(icon)
        self.verticalLayout = QtGui.QVBoxLayout(WorkAreaDialog)
        self.verticalLayout.setObjectName("verticalLayout")
        self.top_frame = QtGui.QFrame(WorkAreaDialog)
        self.top_frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.top_frame.setFrameShadow(QtGui.QFrame.Raised)
        self.top_frame.setObjectName("top_frame")
        self.horizontalLayout = QtGui.QHBoxLayout(self.top_frame)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.icon = QtGui.QLabel(self.top_frame)
        self.icon.setMinimumSize(QtCore.QSize(40, 40))
        self.icon.setMaximumSize(QtCore.QSize(40, 40))
        self.icon.setText("")
        self.icon.setPixmap(
            QtGui.QPixmap(":/tk_multi_infopanel/pin_large.png"))
        self.icon.setScaledContents(True)
        self.icon.setObjectName("icon")
        self.horizontalLayout.addWidget(self.icon)
        self.top_text = QtGui.QLabel(self.top_frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.top_text.sizePolicy().hasHeightForWidth())
        self.top_text.setSizePolicy(sizePolicy)
        self.top_text.setObjectName("top_text")
        self.horizontalLayout.addWidget(self.top_text)
        self.verticalLayout.addWidget(self.top_frame)
        self.task_list = QtGui.QListWidget(WorkAreaDialog)
        self.task_list.setObjectName("task_list")
        self.verticalLayout.addWidget(self.task_list)
        self.horizontalLayout_2 = QtGui.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem)
        self.cancel = QtGui.QPushButton(WorkAreaDialog)
        self.cancel.setObjectName("cancel")
        self.horizontalLayout_2.addWidget(self.cancel)
        self.ok = QtGui.QPushButton(WorkAreaDialog)
        self.ok.setObjectName("ok")
        self.horizontalLayout_2.addWidget(self.ok)
        self.verticalLayout.addLayout(self.horizontalLayout_2)

        self.retranslateUi(WorkAreaDialog)
        QtCore.QObject.connect(self.cancel, QtCore.SIGNAL("clicked()"),
                               WorkAreaDialog.reject)
        QtCore.QObject.connect(self.ok, QtCore.SIGNAL("clicked()"),
                               WorkAreaDialog.accept)
        QtCore.QMetaObject.connectSlotsByName(WorkAreaDialog)
    def run(self, splash=None, version=None):
        """
        Run the engine.

        This method is called from the GUI bootstrap to setup the application
        and to run the Qt event loop.
        """
        self.app_version = version

        # Initialize Qt app
        from tank.platform.qt import QtGui

        app = QtGui.QApplication.instance()
        if app is None:
            app = QtGui.QApplication(sys.argv)

        # update the app icon
        icon = QtGui.QIcon(":tk-desktop/default_systray_icon")
        app.setWindowIcon(icon)

        splash.set_message("Building UI")

        # setup the global look and feel
        self._engine._initialize_dark_look_and_feel()

        # load custom font
        QtGui.QFontDatabase.addApplicationFont(
            ":/tk-desktop/fonts/OpenSans-Bold.ttf")
        QtGui.QFontDatabase.addApplicationFont(
            ":/tk-desktop/fonts/OpenSans-Regular.ttf")
        QtGui.QFontDatabase.addApplicationFont(
            ":/tk-desktop/fonts/OpenSans-CondLight.ttf")
        QtGui.QFontDatabase.addApplicationFont(
            ":/tk-desktop/fonts/OpenSans-Light.ttf")

        # merge in app specific look and feel
        css_file = os.path.join(self._engine.disk_location, "resources",
                                "desktop_dark.css")
        f = open(css_file)
        css = app.styleSheet() + "\n\n" + f.read()
        f.close()
        app.setStyleSheet(css)

        # initialize System Tray
        self.desktop_window = desktop_window.DesktopWindow()

        # make sure we close down our rpc threads
        app.aboutToQuit.connect(self._engine.destroy_engine)

        # hide the splash if it exists
        if splash is not None:
            splash.hide()

        # and run the app
        result = app.exec_()
        return result
예제 #10
0
def Icon(icon = ''):
    """
    @param icon: The name of the icon to use eg refresh.png
    @type icon: String  
    """
    iconPath = "T:/software/lsapipeline/config/icons/"

    fullPath = '%s%s' % (iconPath, icon)
    icon = QtGui.QIcon(fullPath)
    return icon
예제 #11
0
    def __init__(self, parent=None):
        QtGui.QSystemTrayIcon.__init__(self, parent)

        # configure the system tray icon
        icon = QtGui.QIcon(":/tk-desktop/default_systray_icon")
        self.setIcon(icon)
        self.setToolTip("Shotgun")

        # connect up signal handlers
        self.activated.connect(self.__activated)
예제 #12
0
    def setupUi(self, TaskWidget):
        TaskWidget.setObjectName("TaskWidget")
        TaskWidget.resize(338, 36)
        self.verticalLayout = QtGui.QVBoxLayout(TaskWidget)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setContentsMargins(2, 2, 2, 2)
        self.verticalLayout.setObjectName("verticalLayout")
        self.frame = QtGui.QFrame(TaskWidget)
        self.frame.setMinimumSize(QtCore.QSize(0, 32))
        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtGui.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayout = QtGui.QHBoxLayout(self.frame)
        self.horizontalLayout.setSpacing(8)
        self.horizontalLayout.setContentsMargins(8, 2, 2, 2)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.icon = QtGui.QLabel(self.frame)
        self.icon.setMinimumSize(QtCore.QSize(18, 18))
        self.icon.setMaximumSize(QtCore.QSize(18, 18))
        self.icon.setPixmap(QtGui.QPixmap(":/tk_multi_publish2/shotgun.png"))
        self.icon.setScaledContents(True)
        self.icon.setAlignment(QtCore.Qt.AlignCenter)
        self.icon.setObjectName("icon")
        self.horizontalLayout.addWidget(self.icon)
        self.header = QtGui.QLabel(self.frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.header.sizePolicy().hasHeightForWidth())
        self.header.setSizePolicy(sizePolicy)
        self.header.setMinimumSize(QtCore.QSize(1, 1))
        self.header.setAccessibleName("")
        self.header.setObjectName("header")
        self.horizontalLayout.addWidget(self.header)
        self.status = QtGui.QToolButton(self.frame)
        self.status.setMinimumSize(QtCore.QSize(30, 22))
        self.status.setMaximumSize(QtCore.QSize(30, 22))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/status_publish.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.status.setIcon(icon)
        self.status.setIconSize(QtCore.QSize(16, 16))
        self.status.setObjectName("status")
        self.horizontalLayout.addWidget(self.status)
        self.checkbox = QtGui.QCheckBox(self.frame)
        self.checkbox.setObjectName("checkbox")
        self.horizontalLayout.addWidget(self.checkbox)
        self.verticalLayout.addWidget(self.frame)

        self.retranslateUi(TaskWidget)
        QtCore.QMetaObject.connectSlotsByName(TaskWidget)
    def setupUi(self, ProgressDetailsWidget):
        ProgressDetailsWidget.setObjectName("ProgressDetailsWidget")
        ProgressDetailsWidget.resize(370, 233)
        self.verticalLayout = QtGui.QVBoxLayout(ProgressDetailsWidget)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.progress_frame = QtGui.QFrame(ProgressDetailsWidget)
        self.progress_frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.progress_frame.setFrameShadow(QtGui.QFrame.Raised)
        self.progress_frame.setObjectName("progress_frame")
        self.verticalLayout_2 = QtGui.QVBoxLayout(self.progress_frame)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.progress_label = QtGui.QLabel(self.progress_frame)
        self.progress_label.setObjectName("progress_label")
        self.horizontalLayout.addWidget(self.progress_label)
        self.copy_log_button = QtGui.QToolButton(self.progress_frame)
        self.copy_log_button.setMinimumSize(QtCore.QSize(105, 0))
        self.copy_log_button.setToolButtonStyle(QtCore.Qt.ToolButtonTextOnly)
        self.copy_log_button.setObjectName("copy_log_button")
        self.horizontalLayout.addWidget(self.copy_log_button)
        self.close = QtGui.QToolButton(self.progress_frame)
        self.close.setMinimumSize(QtCore.QSize(30, 30))
        self.close.setMaximumSize(QtCore.QSize(30, 30))
        self.close.setText("")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/cross.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.close.setIcon(icon)
        self.close.setIconSize(QtCore.QSize(30, 30))
        self.close.setObjectName("close")
        self.horizontalLayout.addWidget(self.close)
        self.verticalLayout_2.addLayout(self.horizontalLayout)
        self.log_tree = QtGui.QTreeWidget(self.progress_frame)
        self.log_tree.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerItem)
        self.log_tree.setUniformRowHeights(True)
        self.log_tree.setWordWrap(True)
        self.log_tree.setColumnCount(2)
        self.log_tree.setObjectName("log_tree")
        self.log_tree.headerItem().setText(0, "1")
        self.log_tree.headerItem().setText(1, "2")
        self.log_tree.header().setVisible(False)
        self.log_tree.header().setStretchLastSection(False)
        self.verticalLayout_2.addWidget(self.log_tree)
        self.verticalLayout.addWidget(self.progress_frame)

        self.retranslateUi(ProgressDetailsWidget)
        QtCore.QMetaObject.connectSlotsByName(ProgressDetailsWidget)
예제 #14
0
def start_app(engine):
    """
    Run the QApplication for the given tk-desktop engine.
    """

    # If we're running the new engine that knows how to start the app, delegate the
    # task to it
    if hasattr(engine, "start_app"):
        return engine.start_app()

    # Otherwise run the legacy code.
    if engine.has_ui:

        # NOTE
        # The following code is meant to run for very old verions of tk-desktop. It
        # should not be edited to support newer features.
        from tank.platform.qt import QtGui

        app = QtGui.QApplication([])
        app.setQuitOnLastWindowClosed(False)
        app.setApplicationName("%s Python" % engine.context.project["name"])

        # set default icon
        python_icon = os.path.realpath(
            os.path.join(
                os.path.dirname(__file__), "..", "..", "resources", "python_icon.png"
            )
        )
        app.setWindowIcon(QtGui.QIcon(python_icon))

        # Let the engine know we've created the app
        engine.register_qapplication(app)

        # use the toolkit look and feel
        engine._initialize_dark_look_and_feel()

        result = 0
        while True:
            # loop until we are signaled to close, in case an app accidentally quits the app
            result = app.exec_()
            if not engine.connected:
                # we have been signaled to quit rather than waiting for more commands
                break
        return result

    else:  # not engine.has_ui
        # wait for the engine communication channel to shut down
        engine.msg_server.join()
        return 0
    def _add_menu_item(self, name, parent_menu, callback, properties=None):
        action = QtGui.QAction(name, parent_menu)
        parent_menu.addAction(action)
        action.triggered.connect(callback)

        if properties:
            if "tooltip" in properties:
                action.setTooltip(properties["tooltip"])
                action.setStatustip(properties["tooltip"])
            if "enable_callback" in properties:
                action.setEnabled(properties["enable_callback"]())
            if "icon" in properties:
                action.setIcon(QtGui.QIcon(properties["icon"]))

        return action
예제 #16
0
    def _initialize_application(self):
        from tank.platform.qt import QtGui

        app = QtGui.QApplication([])

        # We may launch multiple UI apps, do not quit as soon as the last one closes.
        app.setQuitOnLastWindowClosed(False)

        # Make the name pretty for the tray and the task manager.
        app.setApplicationName("%s Python" %
                               self._engine.context.project["name"])
        # set default icon
        python_icon = os.path.join(self._engine.disk_location,
                                   "icon_bg_python.png")
        app.setWindowIcon(QtGui.QIcon(python_icon))

        self.register_qapplication(app)
        # use the toolkit look and feel
        self._engine._initialize_dark_look_and_feel()

        return app
예제 #17
0
    def _add_menu_item(self, name, parent_menu, callback, properties=None):
        action = QtGui.QAction(name, parent_menu)
        parent_menu.addAction(action)
        if callback:
            action.triggered.connect(Callback(callback))

        if properties:
            self._engine.log_debug(properties)
            if "tooltip" in properties:
                action.setToolTip(properties["tooltip"])
                action.setStatusIip(properties["tooltip"])
            elif "description" in properties:
                action.setToolTip(properties["description"])
                action.setStatusTip(properties["description"])
            if "enable_callback" in properties:
                action.setEnabled(properties["enable_callback"]())
            if "checkable" in properties:
                action.setCheckable(True)
                action.setChecked(properties.get("checkable"))
            if "icon" in properties:
                action.setIcon(QtGui.QIcon(properties["icon"]))
        return action
예제 #18
0
    def __setup_ui(self, callback):
        """
        Starts a QApplication and initializes the UI.
        """
        from tank.platform.qt import QtCore, QtGui

        # we got QT capabilities. Start a QT app and fire the command into the app
        tk_shotgun = self.import_module("tk_shotgun")

        t = tk_shotgun.Task(self, callback)

        # We need to clear Qt library paths on Linux if KDE is the active environment.
        # This resolves issues with mismatched Qt libraries between the OS and the
        # application being launched if it is a DCC that comes with a bundled Qt.
        if sys.platform == "linux2" and os.environ.get(
                "KDE_FULL_SESSION") is not None:
            QtGui.QApplication.setLibraryPaths([])

        # start up our QApp now
        qt_application = QtGui.QApplication([])
        qt_application.setWindowIcon(QtGui.QIcon(self.icon_256))

        # make sure we have a dark theme
        self._initialize_dark_look_and_feel()

        # now we have a working UI!
        self._has_ui = True

        # when the QApp starts, initialize our task code
        QtCore.QTimer.singleShot(0, t.run_command)

        # and ask the main app to exit when the task emits its finished signal
        t.finished.connect(qt_application.quit)

        # start the application loop. This will block the process until the task
        # has completed - this is either triggered by a main window closing or
        # byt the finished signal being called from the task class above.
        qt_application.exec_()
    def _initialize_application(self):
        from tank.platform.qt import QtGui

        if sgtk.util.is_macos():
            # If we are on Mac with PySide2, then starting a QApplication even with no Windows
            # will steal focus from any currently focused application.
            # So we need to use AppKit if available to stop it from stealing focus.
            try:
                import AppKit

                info = AppKit.NSBundle.mainBundle().infoDictionary()
                info["LSUIElement"] = "1"
            except ImportError:
                # Since AppKit is bundled with the Desktop installer, it's possible we are using
                # an older version of the installer that doesn't contain this package. In which
                # case just move on silently.
                pass

        app = QtGui.QApplication([])

        # We may launch multiple UI apps, do not quit as soon as the last one closes.
        app.setQuitOnLastWindowClosed(False)

        # Make the name pretty for the tray and the task manager.
        app.setApplicationName("%s Python" %
                               self._engine.context.project["name"])
        # set default icon
        python_icon = os.path.join(self._engine.disk_location,
                                   "icon_bg_python.png")
        app.setWindowIcon(QtGui.QIcon(python_icon))

        self.register_qapplication(app)
        # use the toolkit look and feel
        self._engine._initialize_dark_look_and_feel()

        return app
예제 #20
0
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(836, 487)
        self.horizontalLayout = QtGui.QHBoxLayout(Dialog)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.context_overview_tab_widget = QtGui.QTabWidget(Dialog)
        self.context_overview_tab_widget.setTabPosition(QtGui.QTabWidget.South)
        self.context_overview_tab_widget.setObjectName(
            "context_overview_tab_widget")
        self.tab = QtGui.QWidget()
        self.tab.setObjectName("tab")
        self.verticalLayout_4 = QtGui.QVBoxLayout(self.tab)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.context_browser = ContextBrowserWidget(self.tab)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.context_browser.sizePolicy().hasHeightForWidth())
        self.context_browser.setSizePolicy(sizePolicy)
        self.context_browser.setMinimumSize(QtCore.QSize(380, 0))
        self.context_browser.setObjectName("context_browser")
        self.verticalLayout_4.addWidget(self.context_browser)
        self.label_4 = QtGui.QLabel(self.tab)
        self.label_4.setWordWrap(True)
        self.label_4.setObjectName("label_4")
        self.verticalLayout_4.addWidget(self.label_4)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/res/icon_task.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.context_overview_tab_widget.addTab(self.tab, icon, "")
        self.tab_2 = QtGui.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.verticalLayout_2 = QtGui.QVBoxLayout(self.tab_2)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.app_browser = AppBrowserWidget(self.tab_2)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.app_browser.sizePolicy().hasHeightForWidth())
        self.app_browser.setSizePolicy(sizePolicy)
        self.app_browser.setMinimumSize(QtCore.QSize(380, 0))
        self.app_browser.setObjectName("app_browser")
        self.verticalLayout_2.addWidget(self.app_browser)
        self.label_2 = QtGui.QLabel(self.tab_2)
        self.label_2.setWordWrap(True)
        self.label_2.setObjectName("label_2")
        self.verticalLayout_2.addWidget(self.label_2)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/res/logo_color_16.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.context_overview_tab_widget.addTab(self.tab_2, icon1, "")
        self.tab_3 = QtGui.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.verticalLayout_3 = QtGui.QVBoxLayout(self.tab_3)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.environment_browser = EnvironmentBrowserWidget(self.tab_3)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.environment_browser.sizePolicy().hasHeightForWidth())
        self.environment_browser.setSizePolicy(sizePolicy)
        self.environment_browser.setMinimumSize(QtCore.QSize(380, 0))
        self.environment_browser.setObjectName("environment_browser")
        self.verticalLayout_3.addWidget(self.environment_browser)
        self.label_3 = QtGui.QLabel(self.tab_3)
        self.label_3.setWordWrap(True)
        self.label_3.setObjectName("label_3")
        self.verticalLayout_3.addWidget(self.label_3)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap(":/res/cog_white.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.context_overview_tab_widget.addTab(self.tab_3, icon2, "")
        self.horizontalLayout.addWidget(self.context_overview_tab_widget)
        self.verticalLayout = QtGui.QVBoxLayout()
        self.verticalLayout.setSpacing(5)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtGui.QLabel(Dialog)
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap(":/res/tank_logo.png"))
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.jump_to_fs = QtGui.QPushButton(Dialog)
        self.jump_to_fs.setObjectName("jump_to_fs")
        self.verticalLayout.addWidget(self.jump_to_fs)
        self.reload_apps = QtGui.QPushButton(Dialog)
        self.reload_apps.setObjectName("reload_apps")
        self.verticalLayout.addWidget(self.reload_apps)
        self.support = QtGui.QPushButton(Dialog)
        self.support.setObjectName("support")
        self.verticalLayout.addWidget(self.support)
        spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum,
                                       QtGui.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.close = QtGui.QPushButton(Dialog)
        self.close.setObjectName("close")
        self.verticalLayout.addWidget(self.close)
        self.horizontalLayout.addLayout(self.verticalLayout)

        self.retranslateUi(Dialog)
        self.context_overview_tab_widget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
    def setupUi(self, NoteInputWidget):
        NoteInputWidget.setObjectName("NoteInputWidget")
        NoteInputWidget.resize(363, 203)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            NoteInputWidget.sizePolicy().hasHeightForWidth())
        NoteInputWidget.setSizePolicy(sizePolicy)
        self.verticalLayout_5 = QtGui.QVBoxLayout(NoteInputWidget)
        self.verticalLayout_5.setSpacing(0)
        self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.stacked_widget = QtGui.QStackedWidget(NoteInputWidget)
        self.stacked_widget.setObjectName("stacked_widget")
        self.note_editor_page = QtGui.QWidget()
        self.note_editor_page.setObjectName("note_editor_page")
        self.verticalLayout_2 = QtGui.QVBoxLayout(self.note_editor_page)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.text_entry = NoteEditor(self.note_editor_page)
        self.text_entry.setFocusPolicy(QtCore.Qt.ClickFocus)
        self.text_entry.setObjectName("text_entry")
        self.horizontalLayout.addWidget(self.text_entry)
        self.thumbnail = QtGui.QLabel(self.note_editor_page)
        self.thumbnail.setEnabled(True)
        self.thumbnail.setMinimumSize(QtCore.QSize(96, 75))
        self.thumbnail.setMaximumSize(QtCore.QSize(96, 75))
        self.thumbnail.setText("")
        self.thumbnail.setPixmap(
            QtGui.QPixmap(":/tk_framework_qtwidgets/rect_512x400.png"))
        self.thumbnail.setScaledContents(True)
        self.thumbnail.setAlignment(QtCore.Qt.AlignBottom
                                    | QtCore.Qt.AlignHCenter)
        self.thumbnail.setObjectName("thumbnail")
        self.horizontalLayout.addWidget(self.thumbnail)
        self.button_layout_right = QtGui.QVBoxLayout()
        self.button_layout_right.setSpacing(3)
        self.button_layout_right.setContentsMargins(5, -1, -1, -1)
        self.button_layout_right.setObjectName("button_layout_right")
        self.close = QtGui.QToolButton(self.note_editor_page)
        icon = QtGui.QIcon()
        icon.addPixmap(
            QtGui.QPixmap(
                ":/tk_framework_qtwidgets.note_input_widget/close.png"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.close.setIcon(icon)
        self.close.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
        self.close.setAutoRaise(True)
        self.close.setObjectName("close")
        self.button_layout_right.addWidget(self.close)
        spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum,
                                       QtGui.QSizePolicy.Expanding)
        self.button_layout_right.addItem(spacerItem)
        self.attach = QtGui.QToolButton(self.note_editor_page)
        icon1 = QtGui.QIcon()
        icon1.addPixmap(
            QtGui.QPixmap(
                ":/tk_framework_qtwidgets.note_input_widget/paper_clip.png"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.attach.setIcon(icon1)
        self.attach.setAutoRaise(True)
        self.attach.setObjectName("attach")
        self.button_layout_right.addWidget(self.attach)
        self.screenshot = QtGui.QToolButton(self.note_editor_page)
        icon2 = QtGui.QIcon()
        icon2.addPixmap(
            QtGui.QPixmap(
                ":/tk_framework_qtwidgets.note_input_widget/camera_hl.png"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.screenshot.setIcon(icon2)
        self.screenshot.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
        self.screenshot.setAutoRaise(True)
        self.screenshot.setObjectName("screenshot")
        self.button_layout_right.addWidget(self.screenshot)
        self.submit = QtGui.QToolButton(self.note_editor_page)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.submit.sizePolicy().hasHeightForWidth())
        self.submit.setSizePolicy(sizePolicy)
        self.submit.setText("")
        icon3 = QtGui.QIcon()
        icon3.addPixmap(
            QtGui.QPixmap(
                ":/tk_framework_qtwidgets.note_input_widget/tick.png"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.submit.setIcon(icon3)
        self.submit.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
        self.submit.setAutoRaise(True)
        self.submit.setObjectName("submit")
        self.button_layout_right.addWidget(self.submit)
        self.horizontalLayout.addLayout(self.button_layout_right)
        self.verticalLayout_2.addLayout(self.horizontalLayout)
        self.hint_label = QtGui.QLabel(self.note_editor_page)
        self.hint_label.setObjectName("hint_label")
        self.verticalLayout_2.addWidget(self.hint_label)
        self.stacked_widget.addWidget(self.note_editor_page)
        self.preview_page = QtGui.QWidget()
        self.preview_page.setObjectName("preview_page")
        self.verticalLayout_3 = QtGui.QVBoxLayout(self.preview_page)
        self.verticalLayout_3.setSpacing(0)
        self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.new_note_frame = QtGui.QFrame(self.preview_page)
        self.new_note_frame.setStyleSheet("")
        self.new_note_frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.new_note_frame.setFrameShadow(QtGui.QFrame.Raised)
        self.new_note_frame.setObjectName("new_note_frame")
        self.verticalLayout_4 = QtGui.QVBoxLayout(self.new_note_frame)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.new_note_placeholder = QtGui.QLabel(self.new_note_frame)
        self.new_note_placeholder.setAlignment(QtCore.Qt.AlignLeading
                                               | QtCore.Qt.AlignLeft
                                               | QtCore.Qt.AlignTop)
        self.new_note_placeholder.setObjectName("new_note_placeholder")
        self.verticalLayout_4.addWidget(self.new_note_placeholder)
        self.verticalLayout_3.addWidget(self.new_note_frame)
        self.stacked_widget.addWidget(self.preview_page)
        self.attachments_page = QtGui.QWidget()
        self.attachments_page.setObjectName("attachments_page")
        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.attachments_page)
        self.horizontalLayout_2.setSpacing(0)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.horizontalLayout_3 = QtGui.QHBoxLayout()
        self.horizontalLayout_3.setSpacing(3)
        self.horizontalLayout_3.setContentsMargins(0, -1, -1, -1)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.attachment_list = QtGui.QWidget(self.attachments_page)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.attachment_list.sizePolicy().hasHeightForWidth())
        self.attachment_list.setSizePolicy(sizePolicy)
        self.attachment_list.setObjectName("attachment_list")
        self.attachments_list_layout = QtGui.QVBoxLayout(self.attachment_list)
        self.attachments_list_layout.setSpacing(0)
        self.attachments_list_layout.setContentsMargins(0, 0, 0, 0)
        self.attachments_list_layout.setContentsMargins(0, 0, 0, 0)
        self.attachments_list_layout.setObjectName("attachments_list_layout")
        self.attachment_list_tree = QtGui.QTreeWidget(self.attachment_list)
        self.attachment_list_tree.setSelectionMode(
            QtGui.QAbstractItemView.ExtendedSelection)
        self.attachment_list_tree.setRootIsDecorated(False)
        self.attachment_list_tree.setItemsExpandable(False)
        self.attachment_list_tree.setHeaderHidden(True)
        self.attachment_list_tree.setExpandsOnDoubleClick(False)
        self.attachment_list_tree.setObjectName("attachment_list_tree")
        self.attachment_list_tree.headerItem().setText(0, "1")
        self.attachments_list_layout.addWidget(self.attachment_list_tree)
        self.horizontalLayout_4 = QtGui.QHBoxLayout()
        self.horizontalLayout_4.setSpacing(3)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.add_button = QtGui.QToolButton(self.attachment_list)
        icon4 = QtGui.QIcon()
        icon4.addPixmap(
            QtGui.QPixmap(
                ":/tk_framework_qtwidgets.note_input_widget/plus.png"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.add_button.setIcon(icon4)
        self.add_button.setAutoRaise(True)
        self.add_button.setObjectName("add_button")
        self.horizontalLayout_4.addWidget(self.add_button)
        self.remove_button = QtGui.QToolButton(self.attachment_list)
        icon5 = QtGui.QIcon()
        icon5.addPixmap(
            QtGui.QPixmap(
                ":/tk_framework_qtwidgets.note_input_widget/minus.png"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.remove_button.setIcon(icon5)
        self.remove_button.setAutoRaise(True)
        self.remove_button.setObjectName("remove_button")
        self.horizontalLayout_4.addWidget(self.remove_button)
        spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.horizontalLayout_4.addItem(spacerItem1)
        self.attachments_list_layout.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_3.addWidget(self.attachment_list)
        self.attachment_buttons = QtGui.QVBoxLayout()
        self.attachment_buttons.setSpacing(3)
        self.attachment_buttons.setContentsMargins(5, -1, -1, -1)
        self.attachment_buttons.setObjectName("attachment_buttons")
        self.close_attachments = QtGui.QToolButton(self.attachments_page)
        self.close_attachments.setIcon(icon)
        self.close_attachments.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
        self.close_attachments.setAutoRaise(True)
        self.close_attachments.setObjectName("close_attachments")
        self.attachment_buttons.addWidget(self.close_attachments)
        spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum,
                                        QtGui.QSizePolicy.Expanding)
        self.attachment_buttons.addItem(spacerItem2)
        self.add_attachments = QtGui.QToolButton(self.attachments_page)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.add_attachments.sizePolicy().hasHeightForWidth())
        self.add_attachments.setSizePolicy(sizePolicy)
        self.add_attachments.setText("")
        self.add_attachments.setIcon(icon3)
        self.add_attachments.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
        self.add_attachments.setAutoRaise(True)
        self.add_attachments.setObjectName("add_attachments")
        self.attachment_buttons.addWidget(self.add_attachments)
        self.horizontalLayout_3.addLayout(self.attachment_buttons)
        self.horizontalLayout_2.addLayout(self.horizontalLayout_3)
        self.stacked_widget.addWidget(self.attachments_page)
        self.verticalLayout_5.addWidget(self.stacked_widget)

        self.retranslateUi(NoteInputWidget)
        self.stacked_widget.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(NoteInputWidget)
    def run(self, splash, version, **kwargs):
        """
        Run the engine.

        This method is called from the GUI bootstrap to setup the application
        and to run the Qt event loop.

        :param splash: Splash screen widget we can display messages on.
        :param version: Version of the Shotgun Desktop installer code.
        :param startup_version: Version of the Desktop Startup code.
        """
        self.app_version = version

        # Startup version will not be set if we have an old installer invoking
        # this engine.
        self.startup_version = kwargs.get("startup_version")

        if self.uses_legacy_authentication():
            self._migrate_credentials()

        # We need to initialize current login
        # We know for sure there is a default user, since either the migration was done
        # or we logged in as an actual user with the new installer.
        human_user = ShotgunAuthenticator(
            # We don't want to get the script user, but the human user, so tell the
            # CoreDefaultsManager manager that we are not interested in the script user. Do not use
            # the regular shotgun_authentication.DefaultsManager to get this user because it will
            # not know about proxy information.
            sgtk.util.CoreDefaultsManager(mask_script_user=True)
        ).get_default_user()
        # Cache the user so we can refresh the credentials before launching a background process
        self._user = human_user
        # Retrieve the current logged in user information. This will be used when creating
        # event log entries.
        self._current_login = self._engine.sgtk.shotgun.find_one(
            "HumanUser",
            [["login", "is", human_user.login]],
            ["id", "login"]
        )

        # Initialize Qt app
        from tank.platform.qt import QtGui

        app = QtGui.QApplication.instance()
        if app is None:
            app = QtGui.QApplication(sys.argv)

        # update the app icon
        icon = QtGui.QIcon(":tk-desktop/default_systray_icon")
        app.setWindowIcon(icon)

        splash.set_message("Building UI")

        # setup the global look and feel
        self._engine._initialize_dark_look_and_feel()

        # load custom font
        QtGui.QFontDatabase.addApplicationFont(":/tk-desktop/fonts/OpenSans-Bold.ttf")
        QtGui.QFontDatabase.addApplicationFont(":/tk-desktop/fonts/OpenSans-Regular.ttf")
        QtGui.QFontDatabase.addApplicationFont(":/tk-desktop/fonts/OpenSans-CondLight.ttf")
        QtGui.QFontDatabase.addApplicationFont(":/tk-desktop/fonts/OpenSans-Light.ttf")

        # merge in app specific look and feel
        css_file = os.path.join(self._engine.disk_location, "resources", "desktop_dark.css")
        f = open(css_file)
        css = app.styleSheet() + "\n\n" + f.read()
        f.close()
        app.setStyleSheet(css)

        # desktop_window needs to import shotgun_authentication globally. However, doing so
        # can cause a crash when running Shotgun Desktop installer 1.02 code. We used to
        # not restart Desktop when upgrading the core, which caused the older version of core
        # to be kept in memory and the newer core to not be used until the app was reloaded.
        #
        # Since pre 0.16 cores didn't have a shotgun_authentication module, we
        # would have crashed if this had been imported at init time. Note that earlier
        # in this method we forcefully restarted the application if we noticed
        # that the core was upgraded without restarting. Which means that if we
        # end up here, it's now because we're in a good state.
        from . import desktop_window

        # initialize System Tray
        self.desktop_window = desktop_window.DesktopWindow()

        # make sure we close down our rpc threads
        app.aboutToQuit.connect(self._engine.destroy_engine)

        # hide the splash if it exists
        if splash is not None:
            splash.hide()

        # and run the app
        result = app.exec_()
        return result
    def trigger_register_command(self, name, properties, groups):
        """ GUI side handler for the add_command call. """
        from tank.platform.qt import QtGui

        self._engine.log_debug("register_command(%s, %s)", name, properties)

        command_type = properties.get("type")
        command_icon = properties.get("icon")
        command_tooltip = properties.get("description")

        icon = None
        if command_icon is not None:
            if os.path.exists(command_icon):
                icon = QtGui.QIcon(command_icon)
            else:
                self._engine.log_error(
                    "Icon for command '%s' not found: '%s'" % (name, command_icon))

        title = properties.get("title", name)

        if command_type == "context_menu":
            # Add the command to the project menu
            action = QtGui.QAction(self.desktop_window)
            if icon is not None:
                action.setIcon(icon)
            if command_tooltip is not None:
                action.setToolTip(command_tooltip)
            action.setText(title)

            def action_triggered():
                # make sure to pass in that we are not expecting a response
                # Especially for the engine restart command, the connection
                # itself gets reset and so there isn't a channel to get a
                # response back.
                self.refresh_user_credentials()
                self.proxy.call_no_response("trigger_callback", "__commands", name)
            action.triggered.connect(action_triggered)
            self.desktop_window.add_to_project_menu(action)
        else:
            # Default is to add an icon/label for the command

            # figure out what the button should be labeled
            # default is that the button has no menu and is labeled
            # the display name of the command
            menu_name = None
            button_name = title
            for collapse_rule in self._collapse_rules:
                template = DisplayNameTemplate(collapse_rule["match"])
                match = template.match(title)
                if match is not None:
                    self._engine.log_debug("matching %s against %s" % (title, collapse_rule["match"]))
                    if collapse_rule["menu_label"] == "None":
                        menu_name = None
                    else:
                        menu_name = string.Template(collapse_rule["menu_label"]).safe_substitute(match)
                    button_name = string.Template(collapse_rule["button_label"]).safe_substitute(match)
                    break

            self.desktop_window._project_command_model.add_command(
                name, button_name, menu_name, icon, command_tooltip, groups)
            self.desktop_window._project_command_proxy.invalidate()
예제 #24
0
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(737, 615)
        self.verticalLayout_7 = QtGui.QVBoxLayout(Dialog)
        self.verticalLayout_7.setSpacing(0)
        self.verticalLayout_7.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_7.setObjectName("verticalLayout_7")
        self.main_stack = QtGui.QStackedWidget(Dialog)
        self.main_stack.setObjectName("main_stack")
        self.large_drop_area_frame = QtGui.QWidget()
        self.large_drop_area_frame.setObjectName("large_drop_area_frame")
        self.verticalLayout_3 = QtGui.QVBoxLayout(self.large_drop_area_frame)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.large_drop_area = DropAreaFrame(self.large_drop_area_frame)
        self.large_drop_area.setFrameShape(QtGui.QFrame.StyledPanel)
        self.large_drop_area.setFrameShadow(QtGui.QFrame.Raised)
        self.large_drop_area.setObjectName("large_drop_area")
        self.gridLayout_2 = QtGui.QGridLayout(self.large_drop_area)
        self.gridLayout_2.setObjectName("gridLayout_2")
        spacerItem = QtGui.QSpacerItem(20, 98, QtGui.QSizePolicy.Minimum,
                                       QtGui.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem, 0, 1, 1, 1)
        spacerItem1 = QtGui.QSpacerItem(166, 20, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem1, 1, 0, 1, 1)
        self.horizontalLayout_6 = QtGui.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.label_5 = QtGui.QLabel(self.large_drop_area)
        self.label_5.setMinimumSize(QtCore.QSize(150, 150))
        self.label_5.setMaximumSize(QtCore.QSize(150, 150))
        self.label_5.setText("")
        self.label_5.setPixmap(
            QtGui.QPixmap(":/tk_multi_publish2/icon_256.png"))
        self.label_5.setScaledContents(True)
        self.label_5.setAlignment(QtCore.Qt.AlignCenter)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout_6.addWidget(self.label_5)
        self.verticalLayout = QtGui.QVBoxLayout()
        self.verticalLayout.setSpacing(8)
        self.verticalLayout.setObjectName("verticalLayout")
        spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum,
                                        QtGui.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem2)
        self.large_drop_area_label = QtGui.QLabel(self.large_drop_area)
        self.large_drop_area_label.setStyleSheet("QLabel {\n"
                                                 "    font-size: 24px;\n"
                                                 "}")
        self.large_drop_area_label.setAlignment(QtCore.Qt.AlignCenter)
        self.large_drop_area_label.setObjectName("large_drop_area_label")
        self.verticalLayout.addWidget(self.large_drop_area_label)
        self.label = QtGui.QLabel(self.large_drop_area)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.horizontalLayout_3 = QtGui.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem3)
        self.drop_area_browse = QtGui.QPushButton(self.large_drop_area)
        self.drop_area_browse.setMinimumSize(QtCore.QSize(0, 0))
        self.drop_area_browse.setFocusPolicy(QtCore.Qt.NoFocus)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/browse_white.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.drop_area_browse.setIcon(icon)
        self.drop_area_browse.setIconSize(QtCore.QSize(32, 32))
        self.drop_area_browse.setObjectName("drop_area_browse")
        self.horizontalLayout_3.addWidget(self.drop_area_browse)
        spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem4)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        spacerItem5 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum,
                                        QtGui.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem5)
        self.verticalLayout.setStretch(0, 3)
        self.verticalLayout.setStretch(2, 1)
        self.verticalLayout.setStretch(4, 3)
        self.horizontalLayout_6.addLayout(self.verticalLayout)
        self.gridLayout_2.addLayout(self.horizontalLayout_6, 1, 1, 1, 1)
        spacerItem6 = QtGui.QSpacerItem(179, 20, QtGui.QSizePolicy.Expanding,
                                        QtGui.QSizePolicy.Minimum)
        self.gridLayout_2.addItem(spacerItem6, 1, 2, 1, 1)
        spacerItem7 = QtGui.QSpacerItem(20, 213, QtGui.QSizePolicy.Minimum,
                                        QtGui.QSizePolicy.Expanding)
        self.gridLayout_2.addItem(spacerItem7, 2, 1, 1, 1)
        self.verticalLayout_3.addWidget(self.large_drop_area)
        self.main_stack.addWidget(self.large_drop_area_frame)
        self.main_ui_frame = QtGui.QWidget()
        self.main_ui_frame.setObjectName("main_ui_frame")
        self.verticalLayout_4 = QtGui.QVBoxLayout(self.main_ui_frame)
        self.verticalLayout_4.setSpacing(2)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.main_frame = QtGui.QWidget(self.main_ui_frame)
        self.main_frame.setObjectName("main_frame")
        self.verticalLayout_9 = QtGui.QVBoxLayout(self.main_frame)
        self.verticalLayout_9.setSpacing(0)
        self.verticalLayout_9.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_9.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_9.setObjectName("verticalLayout_9")
        self.splitter = QtGui.QSplitter(self.main_frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.splitter.sizePolicy().hasHeightForWidth())
        self.splitter.setSizePolicy(sizePolicy)
        self.splitter.setOrientation(QtCore.Qt.Horizontal)
        self.splitter.setObjectName("splitter")
        self.frame = DropAreaFrame(self.splitter)
        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtGui.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.verticalLayout_2 = QtGui.QVBoxLayout(self.frame)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setContentsMargins(2, 2, 2, 2)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.items_tree = PublishTreeWidget(self.frame)
        self.items_tree.setAcceptDrops(True)
        self.items_tree.setDragEnabled(True)
        self.items_tree.setDragDropMode(QtGui.QAbstractItemView.InternalMove)
        self.items_tree.setSelectionMode(
            QtGui.QAbstractItemView.ExtendedSelection)
        self.items_tree.setObjectName("items_tree")
        self.items_tree.headerItem().setText(0, "1")
        self.items_tree.header().setVisible(False)
        self.verticalLayout_2.addWidget(self.items_tree)
        self.text_below_item_tree = QtGui.QLabel(self.frame)
        self.text_below_item_tree.setAlignment(QtCore.Qt.AlignCenter)
        self.text_below_item_tree.setObjectName("text_below_item_tree")
        self.verticalLayout_2.addWidget(self.text_below_item_tree)
        self.details_frame = QtGui.QFrame(self.splitter)
        self.details_frame.setObjectName("details_frame")
        self.verticalLayout_5 = QtGui.QVBoxLayout(self.details_frame)
        self.verticalLayout_5.setSpacing(0)
        self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.details_stack = QtGui.QStackedWidget(self.details_frame)
        self.details_stack.setObjectName("details_stack")
        self.details_item = QtGui.QWidget()
        self.details_item.setObjectName("details_item")
        self.verticalLayout_6 = QtGui.QVBoxLayout(self.details_item)
        self.verticalLayout_6.setObjectName("verticalLayout_6")
        self.horizontalLayout_2 = QtGui.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.item_icon = QtGui.QLabel(self.details_item)
        self.item_icon.setMinimumSize(QtCore.QSize(60, 60))
        self.item_icon.setMaximumSize(QtCore.QSize(60, 60))
        self.item_icon.setText("")
        self.item_icon.setScaledContents(True)
        self.item_icon.setAlignment(QtCore.Qt.AlignHCenter
                                    | QtCore.Qt.AlignTop)
        self.item_icon.setObjectName("item_icon")
        self.horizontalLayout_2.addWidget(self.item_icon)
        self.verticalLayout_12 = QtGui.QVBoxLayout()
        self.verticalLayout_12.setSpacing(0)
        self.verticalLayout_12.setObjectName("verticalLayout_12")
        self.item_name = ElidedLabel(self.details_item)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.item_name.sizePolicy().hasHeightForWidth())
        self.item_name.setSizePolicy(sizePolicy)
        self.item_name.setAlignment(QtCore.Qt.AlignLeading
                                    | QtCore.Qt.AlignLeft
                                    | QtCore.Qt.AlignVCenter)
        self.item_name.setObjectName("item_name")
        self.verticalLayout_12.addWidget(self.item_name)
        self.item_type = QtGui.QLabel(self.details_item)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.item_type.sizePolicy().hasHeightForWidth())
        self.item_type.setSizePolicy(sizePolicy)
        self.item_type.setAlignment(QtCore.Qt.AlignLeading
                                    | QtCore.Qt.AlignLeft
                                    | QtCore.Qt.AlignVCenter)
        self.item_type.setObjectName("item_type")
        self.verticalLayout_12.addWidget(self.item_type)
        self.verticalLayout_12.setStretch(0, 1)
        self.verticalLayout_12.setStretch(1, 2)
        self.horizontalLayout_2.addLayout(self.verticalLayout_12)
        self.horizontalLayout_2.setStretch(1, 10)
        self.verticalLayout_6.addLayout(self.horizontalLayout_2)
        self.item_divider_1 = QtGui.QFrame(self.details_item)
        self.item_divider_1.setFrameShape(QtGui.QFrame.HLine)
        self.item_divider_1.setFrameShadow(QtGui.QFrame.Sunken)
        self.item_divider_1.setObjectName("item_divider_1")
        self.verticalLayout_6.addWidget(self.item_divider_1)
        self.context_widget = ContextWidget(self.details_item)
        self.context_widget.setObjectName("context_widget")
        self.verticalLayout_6.addWidget(self.context_widget)
        self.gridLayout_3 = QtGui.QGridLayout()
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.item_description_label = QtGui.QLabel(self.details_item)
        self.item_description_label.setObjectName("item_description_label")
        self.gridLayout_3.addWidget(self.item_description_label, 0, 1, 1, 1)
        self.item_thumbnail_label = QtGui.QLabel(self.details_item)
        self.item_thumbnail_label.setObjectName("item_thumbnail_label")
        self.gridLayout_3.addWidget(self.item_thumbnail_label, 0, 0, 1, 1)
        self.item_comments = QtGui.QPlainTextEdit(self.details_item)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.item_comments.sizePolicy().hasHeightForWidth())
        self.item_comments.setSizePolicy(sizePolicy)
        self.item_comments.setMinimumSize(QtCore.QSize(0, 90))
        self.item_comments.setMaximumSize(QtCore.QSize(16777215, 90))
        self.item_comments.setObjectName("item_comments")
        self.gridLayout_3.addWidget(self.item_comments, 1, 1, 1, 1)
        self.item_thumbnail = Thumbnail(self.details_item)
        self.item_thumbnail.setMinimumSize(QtCore.QSize(160, 90))
        self.item_thumbnail.setMaximumSize(QtCore.QSize(160, 90))
        self.item_thumbnail.setText("")
        self.item_thumbnail.setScaledContents(False)
        self.item_thumbnail.setAlignment(QtCore.Qt.AlignCenter)
        self.item_thumbnail.setObjectName("item_thumbnail")
        self.gridLayout_3.addWidget(self.item_thumbnail, 1, 0, 1, 1)
        self.verticalLayout_6.addLayout(self.gridLayout_3)
        self.item_summary_label = QtGui.QLabel(self.details_item)
        self.item_summary_label.setAlignment(QtCore.Qt.AlignBottom
                                             | QtCore.Qt.AlignLeading
                                             | QtCore.Qt.AlignLeft)
        self.item_summary_label.setObjectName("item_summary_label")
        self.verticalLayout_6.addWidget(self.item_summary_label)
        self.scrollArea = QtGui.QScrollArea(self.details_item)
        self.scrollArea.setWidgetResizable(True)
        self.scrollArea.setObjectName("scrollArea")
        self.scrollAreaWidgetContents = QtGui.QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 420, 100))
        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
        self.verticalLayout_10 = QtGui.QVBoxLayout(
            self.scrollAreaWidgetContents)
        self.verticalLayout_10.setSpacing(0)
        self.verticalLayout_10.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_10.setObjectName("verticalLayout_10")
        self.item_summary = QtGui.QLabel(self.scrollAreaWidgetContents)
        self.item_summary.setText("")
        self.item_summary.setWordWrap(True)
        self.item_summary.setObjectName("item_summary")
        self.verticalLayout_10.addWidget(self.item_summary)
        self.expander_label = QtGui.QLabel(self.scrollAreaWidgetContents)
        self.expander_label.setText("")
        self.expander_label.setObjectName("expander_label")
        self.verticalLayout_10.addWidget(self.expander_label)
        self.verticalLayout_10.setStretch(1, 1)
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
        self.verticalLayout_6.addWidget(self.scrollArea)
        self.item_settings_label = QtGui.QLabel(self.details_item)
        self.item_settings_label.setAlignment(QtCore.Qt.AlignBottom
                                              | QtCore.Qt.AlignLeading
                                              | QtCore.Qt.AlignLeft)
        self.item_settings_label.setObjectName("item_settings_label")
        self.verticalLayout_6.addWidget(self.item_settings_label)
        self.item_settings = SettingsWidget(self.details_item)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.item_settings.sizePolicy().hasHeightForWidth())
        self.item_settings.setSizePolicy(sizePolicy)
        self.item_settings.setObjectName("item_settings")
        self.verticalLayout_6.addWidget(self.item_settings)
        self.verticalLayout_6.setStretch(0, 1)
        self.verticalLayout_6.setStretch(1, 1)
        self.verticalLayout_6.setStretch(2, 1)
        self.verticalLayout_6.setStretch(3, 1)
        self.verticalLayout_6.setStretch(4, 1)
        self.verticalLayout_6.setStretch(5, 5)
        self.verticalLayout_6.setStretch(6, 1)
        self.verticalLayout_6.setStretch(7, 5)
        self.details_stack.addWidget(self.details_item)
        self.details_task = QtGui.QWidget()
        self.details_task.setObjectName("details_task")
        self.verticalLayout_11 = QtGui.QVBoxLayout(self.details_task)
        self.verticalLayout_11.setObjectName("verticalLayout_11")
        self.horizontalLayout_4 = QtGui.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.task_icon = QtGui.QLabel(self.details_task)
        self.task_icon.setMinimumSize(QtCore.QSize(60, 60))
        self.task_icon.setMaximumSize(QtCore.QSize(60, 60))
        self.task_icon.setText("")
        self.task_icon.setScaledContents(True)
        self.task_icon.setObjectName("task_icon")
        self.horizontalLayout_4.addWidget(self.task_icon)
        self.task_name = QtGui.QLabel(self.details_task)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.task_name.sizePolicy().hasHeightForWidth())
        self.task_name.setSizePolicy(sizePolicy)
        self.task_name.setObjectName("task_name")
        self.horizontalLayout_4.addWidget(self.task_name)
        self.verticalLayout_11.addLayout(self.horizontalLayout_4)
        self.scrollArea_2 = QtGui.QScrollArea(self.details_task)
        self.scrollArea_2.setWidgetResizable(True)
        self.scrollArea_2.setObjectName("scrollArea_2")
        self.scrollAreaWidgetContents_2 = QtGui.QWidget()
        self.scrollAreaWidgetContents_2.setGeometry(
            QtCore.QRect(0, 0, 420, 202))
        self.scrollAreaWidgetContents_2.setObjectName(
            "scrollAreaWidgetContents_2")
        self.verticalLayout_13 = QtGui.QVBoxLayout(
            self.scrollAreaWidgetContents_2)
        self.verticalLayout_13.setSpacing(0)
        self.verticalLayout_13.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_13.setObjectName("verticalLayout_13")
        self.task_description = QtGui.QLabel(self.scrollAreaWidgetContents_2)
        self.task_description.setText("")
        self.task_description.setWordWrap(True)
        self.task_description.setOpenExternalLinks(True)
        self.task_description.setObjectName("task_description")
        self.verticalLayout_13.addWidget(self.task_description)
        self.expander_label_2 = QtGui.QLabel(self.scrollAreaWidgetContents_2)
        self.expander_label_2.setText("")
        self.expander_label_2.setObjectName("expander_label_2")
        self.verticalLayout_13.addWidget(self.expander_label_2)
        self.verticalLayout_13.setStretch(1, 1)
        self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_2)
        self.verticalLayout_11.addWidget(self.scrollArea_2)
        self.task_settings_label = QtGui.QLabel(self.details_task)
        self.task_settings_label.setObjectName("task_settings_label")
        self.verticalLayout_11.addWidget(self.task_settings_label)
        self.task_settings = SettingsWidget(self.details_task)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.task_settings.sizePolicy().hasHeightForWidth())
        self.task_settings.setSizePolicy(sizePolicy)
        self.task_settings.setObjectName("task_settings")
        self.verticalLayout_11.addWidget(self.task_settings)
        self.details_stack.addWidget(self.details_task)
        self.details_please_select = QtGui.QWidget()
        self.details_please_select.setObjectName("details_please_select")
        self.verticalLayout_8 = QtGui.QVBoxLayout(self.details_please_select)
        self.verticalLayout_8.setObjectName("verticalLayout_8")
        self.please_select_an_item = QtGui.QLabel(self.details_please_select)
        self.please_select_an_item.setAlignment(QtCore.Qt.AlignCenter)
        self.please_select_an_item.setObjectName("please_select_an_item")
        self.verticalLayout_8.addWidget(self.please_select_an_item)
        self.details_stack.addWidget(self.details_please_select)
        self.verticalLayout_5.addWidget(self.details_stack)
        self.verticalLayout_9.addWidget(self.splitter)
        self.verticalLayout_4.addWidget(self.main_frame)
        self.progress_bar = QtGui.QProgressBar(self.main_ui_frame)
        self.progress_bar.setMaximumSize(QtCore.QSize(16777215, 10))
        self.progress_bar.setProperty("value", 0)
        self.progress_bar.setTextVisible(False)
        self.progress_bar.setObjectName("progress_bar")
        self.verticalLayout_4.addWidget(self.progress_bar)
        self.bottom_frame = QtGui.QFrame(self.main_ui_frame)
        self.bottom_frame.setMaximumSize(QtCore.QSize(16777215, 50))
        self.bottom_frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.bottom_frame.setFrameShadow(QtGui.QFrame.Raised)
        self.bottom_frame.setObjectName("bottom_frame")
        self.horizontalLayout = QtGui.QHBoxLayout(self.bottom_frame)
        self.horizontalLayout.setSpacing(2)
        self.horizontalLayout.setContentsMargins(2, 0, 2, 2)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.browse = QtGui.QToolButton(self.bottom_frame)
        self.browse.setMaximumSize(QtCore.QSize(32, 32))
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/browse.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.browse.setIcon(icon1)
        self.browse.setIconSize(QtCore.QSize(32, 32))
        self.browse.setObjectName("browse")
        self.horizontalLayout.addWidget(self.browse)
        self.refresh = QtGui.QToolButton(self.bottom_frame)
        self.refresh.setMaximumSize(QtCore.QSize(32, 32))
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/refresh.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.refresh.setIcon(icon2)
        self.refresh.setIconSize(QtCore.QSize(32, 32))
        self.refresh.setObjectName("refresh")
        self.horizontalLayout.addWidget(self.refresh)
        self.delete_items = QtGui.QToolButton(self.bottom_frame)
        self.delete_items.setMaximumSize(QtCore.QSize(32, 32))
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/trash.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.delete_items.setIcon(icon3)
        self.delete_items.setIconSize(QtCore.QSize(32, 32))
        self.delete_items.setObjectName("delete_items")
        self.horizontalLayout.addWidget(self.delete_items)
        self.expand_all = QtGui.QToolButton(self.bottom_frame)
        self.expand_all.setMaximumSize(QtCore.QSize(32, 32))
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/expand.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.expand_all.setIcon(icon4)
        self.expand_all.setIconSize(QtCore.QSize(32, 32))
        self.expand_all.setObjectName("expand_all")
        self.horizontalLayout.addWidget(self.expand_all)
        self.collapse_all = QtGui.QToolButton(self.bottom_frame)
        self.collapse_all.setMaximumSize(QtCore.QSize(32, 32))
        icon5 = QtGui.QIcon()
        icon5.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/contract.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.collapse_all.setIcon(icon5)
        self.collapse_all.setIconSize(QtCore.QSize(32, 32))
        self.collapse_all.setObjectName("collapse_all")
        self.horizontalLayout.addWidget(self.collapse_all)
        self.help = QtGui.QToolButton(self.bottom_frame)
        self.help.setMinimumSize(QtCore.QSize(32, 32))
        self.help.setMaximumSize(QtCore.QSize(32, 32))
        icon6 = QtGui.QIcon()
        icon6.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/help.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.help.setIcon(icon6)
        self.help.setIconSize(QtCore.QSize(32, 32))
        self.help.setObjectName("help")
        self.horizontalLayout.addWidget(self.help)
        spacerItem8 = QtGui.QSpacerItem(10, 10, QtGui.QSizePolicy.Fixed,
                                        QtGui.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem8)
        self.progress_status_icon = QtGui.QLabel(self.bottom_frame)
        self.progress_status_icon.setMinimumSize(QtCore.QSize(20, 20))
        self.progress_status_icon.setMaximumSize(QtCore.QSize(20, 20))
        self.progress_status_icon.setText("")
        self.progress_status_icon.setPixmap(
            QtGui.QPixmap(":/tk_multi_publish2/status_success.png"))
        self.progress_status_icon.setScaledContents(True)
        self.progress_status_icon.setObjectName("progress_status_icon")
        self.horizontalLayout.addWidget(self.progress_status_icon)
        self.progress_message = ProgressStatusLabel(self.bottom_frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.progress_message.sizePolicy().hasHeightForWidth())
        self.progress_message.setSizePolicy(sizePolicy)
        self.progress_message.setObjectName("progress_message")
        self.horizontalLayout.addWidget(self.progress_message)
        self.stop_processing = QtGui.QToolButton(self.bottom_frame)
        icon7 = QtGui.QIcon()
        icon7.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/cross.png"),
                        QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.stop_processing.setIcon(icon7)
        self.stop_processing.setIconSize(QtCore.QSize(20, 20))
        self.stop_processing.setObjectName("stop_processing")
        self.horizontalLayout.addWidget(self.stop_processing)
        self.validate = QtGui.QPushButton(self.bottom_frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.validate.sizePolicy().hasHeightForWidth())
        self.validate.setSizePolicy(sizePolicy)
        self.validate.setObjectName("validate")
        self.horizontalLayout.addWidget(self.validate)
        self.publish = QtGui.QPushButton(self.bottom_frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.publish.sizePolicy().hasHeightForWidth())
        self.publish.setSizePolicy(sizePolicy)
        self.publish.setObjectName("publish")
        self.horizontalLayout.addWidget(self.publish)
        self.close = QtGui.QPushButton(self.bottom_frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.close.sizePolicy().hasHeightForWidth())
        self.close.setSizePolicy(sizePolicy)
        self.close.setObjectName("close")
        self.horizontalLayout.addWidget(self.close)
        self.verticalLayout_4.addWidget(self.bottom_frame)
        self.main_stack.addWidget(self.main_ui_frame)
        self.verticalLayout_7.addWidget(self.main_stack)

        self.retranslateUi(Dialog)
        self.main_stack.setCurrentIndex(1)
        self.details_stack.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
        Dialog.setTabOrder(self.item_comments, self.validate)
        Dialog.setTabOrder(self.validate, self.publish)
        Dialog.setTabOrder(self.publish, self.items_tree)
        Dialog.setTabOrder(self.items_tree, self.refresh)
        Dialog.setTabOrder(self.refresh, self.delete_items)
        Dialog.setTabOrder(self.delete_items, self.expand_all)
        Dialog.setTabOrder(self.expand_all, self.collapse_all)
        Dialog.setTabOrder(self.collapse_all, self.help)
        Dialog.setTabOrder(self.help, self.close)
        Dialog.setTabOrder(self.close, self.stop_processing)
        Dialog.setTabOrder(self.stop_processing, self.scrollArea)
        Dialog.setTabOrder(self.scrollArea, self.scrollArea_2)
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(412, 648)
        self.verticalLayout_23 = QtGui.QVBoxLayout(Dialog)
        self.verticalLayout_23.setSpacing(0)
        self.verticalLayout_23.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_23.setObjectName("verticalLayout_23")
        self.main_stack = QtGui.QStackedWidget(Dialog)
        self.main_stack.setObjectName("main_stack")
        self.main_page = QtGui.QWidget()
        self.main_page.setObjectName("main_page")
        self.verticalLayout_17 = QtGui.QVBoxLayout(self.main_page)
        self.verticalLayout_17.setSpacing(4)
        self.verticalLayout_17.setContentsMargins(4, 4, 4, 4)
        self.verticalLayout_17.setObjectName("verticalLayout_17")
        self.top_group = QtGui.QFrame(self.main_page)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.top_group.sizePolicy().hasHeightForWidth())
        self.top_group.setSizePolicy(sizePolicy)
        self.top_group.setFrameShape(QtGui.QFrame.StyledPanel)
        self.top_group.setFrameShadow(QtGui.QFrame.Raised)
        self.top_group.setObjectName("top_group")
        self.verticalLayout_18 = QtGui.QVBoxLayout(self.top_group)
        self.verticalLayout_18.setSpacing(4)
        self.verticalLayout_18.setContentsMargins(6, 6, 6, 6)
        self.verticalLayout_18.setObjectName("verticalLayout_18")
        self.header_stack = QtGui.QStackedWidget(self.top_group)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.header_stack.sizePolicy().hasHeightForWidth())
        self.header_stack.setSizePolicy(sizePolicy)
        self.header_stack.setMinimumSize(QtCore.QSize(0, 42))
        self.header_stack.setMaximumSize(QtCore.QSize(16777215, 42))
        self.header_stack.setObjectName("header_stack")
        self.page = QtGui.QWidget()
        self.page.setObjectName("page")
        self.verticalLayout_24 = QtGui.QVBoxLayout(self.page)
        self.verticalLayout_24.setSpacing(2)
        self.verticalLayout_24.setContentsMargins(2, 0, 2, 0)
        self.verticalLayout_24.setObjectName("verticalLayout_24")
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setContentsMargins(-1, -1, 4, -1)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.navigation_home = QtGui.QToolButton(self.page)
        self.navigation_home.setMinimumSize(QtCore.QSize(30, 30))
        self.navigation_home.setMaximumSize(QtCore.QSize(30, 30))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/tk_multi_infopanel/home.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.navigation_home.setIcon(icon)
        self.navigation_home.setIconSize(QtCore.QSize(30, 30))
        self.navigation_home.setObjectName("navigation_home")
        self.horizontalLayout.addWidget(self.navigation_home)
        self.navigation_prev = QtGui.QToolButton(self.page)
        self.navigation_prev.setMinimumSize(QtCore.QSize(30, 30))
        self.navigation_prev.setMaximumSize(QtCore.QSize(30, 30))
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/tk_multi_infopanel/left_arrow.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.navigation_prev.setIcon(icon1)
        self.navigation_prev.setIconSize(QtCore.QSize(30, 30))
        self.navigation_prev.setObjectName("navigation_prev")
        self.horizontalLayout.addWidget(self.navigation_prev)
        self.navigation_next = QtGui.QToolButton(self.page)
        self.navigation_next.setMinimumSize(QtCore.QSize(30, 30))
        self.navigation_next.setMaximumSize(QtCore.QSize(30, 30))
        icon2 = QtGui.QIcon()
        icon2.addPixmap(QtGui.QPixmap(":/tk_multi_infopanel/right_arrow.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.navigation_next.setIcon(icon2)
        self.navigation_next.setIconSize(QtCore.QSize(30, 30))
        self.navigation_next.setObjectName("navigation_next")
        self.horizontalLayout.addWidget(self.navigation_next)
        self.details_text_header = QtGui.QLabel(self.page)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.details_text_header.sizePolicy().hasHeightForWidth())
        self.details_text_header.setSizePolicy(sizePolicy)
        self.details_text_header.setMinimumSize(QtCore.QSize(0, 30))
        self.details_text_header.setMaximumSize(QtCore.QSize(16777215, 30))
        self.details_text_header.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
        self.details_text_header.setWordWrap(False)
        self.details_text_header.setObjectName("details_text_header")
        self.horizontalLayout.addWidget(self.details_text_header)
        self.set_context = WorkAreaButton(self.page)
        self.set_context.setMinimumSize(QtCore.QSize(30, 30))
        self.set_context.setMaximumSize(QtCore.QSize(30, 30))
        icon3 = QtGui.QIcon()
        icon3.addPixmap(QtGui.QPixmap(":/tk_multi_infopanel/pin.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        icon3.addPixmap(QtGui.QPixmap(":/tk_multi_infopanel/pin_white.png"), QtGui.QIcon.Disabled, QtGui.QIcon.Off)
        self.set_context.setIcon(icon3)
        self.set_context.setIconSize(QtCore.QSize(30, 30))
        self.set_context.setObjectName("set_context")
        self.horizontalLayout.addWidget(self.set_context)
        self.search = QtGui.QToolButton(self.page)
        self.search.setMinimumSize(QtCore.QSize(30, 30))
        self.search.setMaximumSize(QtCore.QSize(30, 30))
        icon4 = QtGui.QIcon()
        icon4.addPixmap(QtGui.QPixmap(":/tk_multi_infopanel/search.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.search.setIcon(icon4)
        self.search.setIconSize(QtCore.QSize(30, 30))
        self.search.setObjectName("search")
        self.horizontalLayout.addWidget(self.search)
        self.label_3 = QtGui.QLabel(self.page)
        self.label_3.setMinimumSize(QtCore.QSize(10, 0))
        self.label_3.setMaximumSize(QtCore.QSize(10, 16777215))
        self.label_3.setText("")
        self.label_3.setObjectName("label_3")
        self.horizontalLayout.addWidget(self.label_3)
        self.current_user = QtGui.QToolButton(self.page)
        self.current_user.setMinimumSize(QtCore.QSize(30, 30))
        self.current_user.setMaximumSize(QtCore.QSize(30, 30))
        self.current_user.setFocusPolicy(QtCore.Qt.NoFocus)
        icon5 = QtGui.QIcon()
        icon5.addPixmap(QtGui.QPixmap(":/tk_multi_infopanel/default_user_thumb.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.current_user.setIcon(icon5)
        self.current_user.setIconSize(QtCore.QSize(30, 30))
        self.current_user.setObjectName("current_user")
        self.horizontalLayout.addWidget(self.current_user)
        self.verticalLayout_24.addLayout(self.horizontalLayout)
        self.header_stack.addWidget(self.page)
        self.page_2 = QtGui.QWidget()
        self.page_2.setObjectName("page_2")
        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.page_2)
        self.horizontalLayout_2.setSpacing(2)
        self.horizontalLayout_2.setContentsMargins(2, 0, 2, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label = QtGui.QLabel(self.page_2)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        self.label.setMinimumSize(QtCore.QSize(30, 30))
        self.label.setMaximumSize(QtCore.QSize(30, 30))
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap(":/tk_multi_infopanel/search.png"))
        self.label.setScaledContents(True)
        self.label.setObjectName("label")
        self.horizontalLayout_2.addWidget(self.label)
        self.search_input = GlobalSearchWidget(self.page_2)
        self.search_input.setObjectName("search_input")
        self.horizontalLayout_2.addWidget(self.search_input)
        self.cancel_search = QtGui.QPushButton(self.page_2)
        self.cancel_search.setObjectName("cancel_search")
        self.horizontalLayout_2.addWidget(self.cancel_search)
        self.header_stack.addWidget(self.page_2)
        self.verticalLayout_18.addWidget(self.header_stack)
        self.line = QtGui.QFrame(self.top_group)
        self.line.setFrameShape(QtGui.QFrame.HLine)
        self.line.setFrameShadow(QtGui.QFrame.Sunken)
        self.line.setObjectName("line")
        self.verticalLayout_18.addWidget(self.line)
        self.horizontalLayout_4 = QtGui.QHBoxLayout()
        self.horizontalLayout_4.setSpacing(0)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.verticalLayout_7 = QtGui.QVBoxLayout()
        self.verticalLayout_7.setSpacing(0)
        self.verticalLayout_7.setContentsMargins(-1, 4, -1, -1)
        self.verticalLayout_7.setObjectName("verticalLayout_7")
        self.details_thumb = ShotgunPlaybackLabel(self.top_group)
        self.details_thumb.setMinimumSize(QtCore.QSize(96, 75))
        self.details_thumb.setMaximumSize(QtCore.QSize(96, 75))
        self.details_thumb.setText("")
        self.details_thumb.setPixmap(QtGui.QPixmap(":/tk_multi_infopanel/rect_512x400.png"))
        self.details_thumb.setScaledContents(True)
        self.details_thumb.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.details_thumb.setObjectName("details_thumb")
        self.verticalLayout_7.addWidget(self.details_thumb)
        spacerItem = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Ignored)
        self.verticalLayout_7.addItem(spacerItem)
        self.verticalLayout_7.setStretch(1, 1)
        self.horizontalLayout_4.addLayout(self.verticalLayout_7)
        self.details_text_middle = QtGui.QLabel(self.top_group)
        self.details_text_middle.setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop)
        self.details_text_middle.setWordWrap(True)
        self.details_text_middle.setObjectName("details_text_middle")
        self.horizontalLayout_4.addWidget(self.details_text_middle)
        self.verticalLayout_22 = QtGui.QVBoxLayout()
        self.verticalLayout_22.setSpacing(0)
        self.verticalLayout_22.setContentsMargins(-1, -1, 6, -1)
        self.verticalLayout_22.setObjectName("verticalLayout_22")
        self.action_button = QtGui.QPushButton(self.top_group)
        self.action_button.setMaximumSize(QtCore.QSize(16, 16))
        self.action_button.setFocusPolicy(QtCore.Qt.NoFocus)
        self.action_button.setObjectName("action_button")
        self.verticalLayout_22.addWidget(self.action_button)
        self.label_2 = QtGui.QLabel(self.top_group)
        self.label_2.setText("")
        self.label_2.setObjectName("label_2")
        self.verticalLayout_22.addWidget(self.label_2)
        self.verticalLayout_22.setStretch(1, 1)
        self.horizontalLayout_4.addLayout(self.verticalLayout_22)
        self.horizontalLayout_4.setStretch(1, 1)
        self.verticalLayout_18.addLayout(self.horizontalLayout_4)
        self.verticalLayout_17.addWidget(self.top_group)
        self.page_stack = QtGui.QStackedWidget(self.main_page)
        self.page_stack.setObjectName("page_stack")
        self.entity_page = QtGui.QWidget()
        self.entity_page.setObjectName("entity_page")
        self.verticalLayout = QtGui.QVBoxLayout(self.entity_page)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.entity_tab_widget = QtGui.QTabWidget(self.entity_page)
        self.entity_tab_widget.setFocusPolicy(QtCore.Qt.NoFocus)
        self.entity_tab_widget.setObjectName("entity_tab_widget")
        self.verticalLayout.addWidget(self.entity_tab_widget)
        self.page_stack.addWidget(self.entity_page)
        self.note_page = QtGui.QWidget()
        self.note_page.setObjectName("note_page")
        self.verticalLayout_5 = QtGui.QVBoxLayout(self.note_page)
        self.verticalLayout_5.setSpacing(0)
        self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.note_reply_widget = ReplyListWidget(self.note_page)
        self.note_reply_widget.setObjectName("note_reply_widget")
        self.verticalLayout_5.addWidget(self.note_reply_widget)
        self.page_stack.addWidget(self.note_page)
        self.verticalLayout_17.addWidget(self.page_stack)
        self.main_stack.addWidget(self.main_page)
        self.verticalLayout_23.addWidget(self.main_stack)

        self.retranslateUi(Dialog)
        self.main_stack.setCurrentIndex(0)
        self.header_stack.setCurrentIndex(0)
        self.page_stack.setCurrentIndex(0)
        self.entity_tab_widget.setCurrentIndex(-1)
        QtCore.QMetaObject.connectSlotsByName(Dialog)
    def run(self, splash, version, **kwargs):
        """
        Run the engine.

        This method is called from the GUI bootstrap to setup the application
        and to run the Qt event loop.

        :param splash: Splash screen widget we can display messages on. Can be ``None``
        :param version: Version of the Shotgun Desktop installer code.
        :param startup_version: Version of the Desktop Startup code. Can be omitted.
        :param startup_descriptor: Descriptor of the Desktop Startup code. Can be omitted.
        """
        self.app_version = version

        # Startup version will not be set if we have an old installer invoking
        # this engine.
        self.startup_version = kwargs.get("startup_version")
        self.startup_descriptor = kwargs.get("startup_descriptor")
        server = kwargs.get("server")

        try:
            # Log usage statistics about the Shotgun Desktop executable and the desktop startup.
            #
            # First we update `host_info` property so subsequent metrics can benefit
            # having the updated information. A special case is made for for Desktop
            # as we do want both versiond but don't want to create another metric field.
            # We are then combining both versions into single version string.
            self._engine._host_info["version"] = "%s / %s" % (
                self.app_version, self.startup_version)

            # Actually log the metric
            self._engine.log_metric("Launched Software")

        except Exception as e:
            logger.exception("Unexpected error logging a metric")
            # DO NOT raise exception. It's reasonnable to log an error about it but
            # we don't want to break normal execution for metric related logging.

        if self.uses_legacy_authentication():
            self._migrate_credentials()

        # We need to initialize current login
        # We know for sure there is a default user, since either the migration was done
        # or we logged in as an actual user with the new installer.
        human_user = ShotgunAuthenticator(
            # We don't want to get the script user, but the human user, so tell the
            # CoreDefaultsManager manager that we are not interested in the script user. Do not use
            # the regular shotgun_authentication.DefaultsManager to get this user because it will
            # not know about proxy information.
            sgtk.util.CoreDefaultsManager(mask_script_user=True
                                          )).get_default_user()
        # Cache the user so we can refresh the credentials before launching a background process
        self._user = human_user
        # Retrieve the current logged in user information. This will be used when creating
        # event log entries.
        self._current_login = self._engine.sgtk.shotgun.find_one(
            "HumanUser", [["login", "is", human_user.login]], ["id", "login"])

        # Initialize Qt app
        from tank.platform.qt import QtGui

        app = QtGui.QApplication.instance()
        if app is None:
            app = QtGui.QApplication(sys.argv)

        # update the app icon
        icon = QtGui.QIcon(":tk-desktop/default_systray_icon")
        app.setWindowIcon(icon)

        if splash:
            splash.set_message("Building UI")

        # setup the global look and feel
        self._engine._initialize_dark_look_and_feel()

        # load custom font
        QtGui.QFontDatabase.addApplicationFont(
            ":/tk-desktop/fonts/OpenSans-Bold.ttf")
        QtGui.QFontDatabase.addApplicationFont(
            ":/tk-desktop/fonts/OpenSans-Regular.ttf")
        QtGui.QFontDatabase.addApplicationFont(
            ":/tk-desktop/fonts/OpenSans-CondLight.ttf")
        QtGui.QFontDatabase.addApplicationFont(
            ":/tk-desktop/fonts/OpenSans-Light.ttf")

        # merge in app specific look and feel
        css_file = os.path.join(self._engine.disk_location, "resources",
                                "desktop_dark.css")
        f = open(css_file)
        css = app.styleSheet() + "\n\n" + f.read()
        f.close()
        app.setStyleSheet(css)

        # If server is passed down to this method, it means we are running an older version of the
        # desktop startup code, which runs its own browser integration.
        #
        # Sadly, we can't tear down the previous server and restart it. Attempting to tear_down() and
        # instantiate a new server will raise an error.ReactorNotRestartable exception. So we'll start
        # our websocket integration only if there is no server running from the desktop startup.
        # Note that the server argument is set regardless of whether the server launched or crashed,
        # so we have to actually get its value instead of merely checking for existence.
        if server is None:
            # Initialize all of this after the style-sheet has been applied so any prompt are also
            # styled after the Shotgun Desktop's visual-style.
            if splash:
                splash.set_message("Initializing browser integration.")
            try:
                desktop_server_framework = sgtk.platform.get_framework(
                    "tk-framework-desktopserver")
                desktop_server_framework.launch_desktop_server(
                    self._user.host, self._current_login["id"], parent=splash)
            except Exception:
                logger.exception(
                    "Unexpected error while trying to launch the browser integration:"
                )
            else:
                logger.debug("Browser integration was launched successfully.")

        # hide the splash if it exists
        if splash is not None:
            splash.hide()

        # desktop_window needs to import shotgun_authentication globally. However, doing so
        # can cause a crash when running Shotgun Desktop installer 1.02 code. We used to
        # not restart Desktop when upgrading the core, which caused the older version of core
        # to be kept in memory and the newer core to not be used until the app was reloaded.
        #
        # Since pre 0.16 cores didn't have a shotgun_authentication module, we
        # would have crashed if this had been imported at init time. Note that earlier
        # in this method we forcefully restarted the application if we noticed
        # that the core was upgraded without restarting. Which means that if we
        # end up here, it's now because we're in a good state.
        from . import desktop_window

        # initialize System Tray
        self.desktop_window = desktop_window.DesktopWindow()

        # We need for the dialog to exist for messages to get to the UI console.
        if kwargs.get("server") is not None:
            logger.warning(
                "You are running an older version of the Shotgun Desktop which is not fully compatible "
                "with the Shotgun Integrations. Please install the latest version."
            )

        # run the commands that are configured to be executed at startup
        self._run_startup_commands()

        # make sure we close down our rpc threads
        app.aboutToQuit.connect(self._engine.destroy_engine)

        # and run the app
        result = app.exec_()
        return result
예제 #27
0
    def setupUi(self, ItemWidget):
        ItemWidget.setObjectName("ItemWidget")
        ItemWidget.resize(290, 45)
        ItemWidget.setMinimumSize(QtCore.QSize(0, 45))
        self.verticalLayout = QtGui.QVBoxLayout(ItemWidget)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setContentsMargins(2, 2, 2, 2)
        self.verticalLayout.setObjectName("verticalLayout")
        self.frame = QtGui.QFrame(ItemWidget)
        self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtGui.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayout = QtGui.QHBoxLayout(self.frame)
        self.horizontalLayout.setSpacing(8)
        self.horizontalLayout.setContentsMargins(4, 2, 2, 2)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.expand_placeholder = QtGui.QWidget(self.frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.expand_placeholder.sizePolicy().hasHeightForWidth())
        self.expand_placeholder.setSizePolicy(sizePolicy)
        self.expand_placeholder.setMinimumSize(QtCore.QSize(16, 16))
        self.expand_placeholder.setMaximumSize(QtCore.QSize(16, 16))
        self.expand_placeholder.setObjectName("expand_placeholder")
        self.horizontalLayout.addWidget(self.expand_placeholder)
        self.expand_indicator = QtGui.QToolButton(self.frame)
        self.expand_indicator.setMinimumSize(QtCore.QSize(16, 16))
        self.expand_indicator.setMaximumSize(QtCore.QSize(16, 16))
        self.expand_indicator.setText("")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/tk_multi_publish2/down_arrow.png"),
                       QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.expand_indicator.setIcon(icon)
        self.expand_indicator.setObjectName("expand_indicator")
        self.horizontalLayout.addWidget(self.expand_indicator)
        self.icon = QtGui.QLabel(self.frame)
        self.icon.setMinimumSize(QtCore.QSize(32, 32))
        self.icon.setMaximumSize(QtCore.QSize(30, 30))
        self.icon.setText("")
        self.icon.setScaledContents(True)
        self.icon.setObjectName("icon")
        self.horizontalLayout.addWidget(self.icon)
        self.header = QtGui.QLabel(self.frame)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,
                                       QtGui.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.header.sizePolicy().hasHeightForWidth())
        self.header.setSizePolicy(sizePolicy)
        self.header.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
        self.header.setObjectName("header")
        self.horizontalLayout.addWidget(self.header)
        self.handle_stack = QtGui.QStackedWidget(self.frame)
        self.handle_stack.setMinimumSize(QtCore.QSize(22, 22))
        self.handle_stack.setMaximumSize(QtCore.QSize(22, 22))
        self.handle_stack.setObjectName("handle_stack")
        self.drag = QtGui.QWidget()
        self.drag.setObjectName("drag")
        self.horizontalLayout_2 = QtGui.QHBoxLayout(self.drag)
        self.horizontalLayout_2.setSpacing(0)
        self.horizontalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.drag_handle = QtGui.QLabel(self.drag)
        self.drag_handle.setMinimumSize(QtCore.QSize(16, 16))
        self.drag_handle.setMaximumSize(QtCore.QSize(16, 16))
        self.drag_handle.setCursor(QtCore.Qt.OpenHandCursor)
        self.drag_handle.setText("")
        self.drag_handle.setPixmap(
            QtGui.QPixmap(":/tk_multi_publish2/drag_handle.png"))
        self.drag_handle.setScaledContents(True)
        self.drag_handle.setObjectName("drag_handle")
        self.horizontalLayout_2.addWidget(self.drag_handle)
        self.handle_stack.addWidget(self.drag)
        self.lock = QtGui.QWidget()
        self.lock.setObjectName("lock")
        self.horizontalLayout_3 = QtGui.QHBoxLayout(self.lock)
        self.horizontalLayout_3.setSpacing(0)
        self.horizontalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.locked_handle = QtGui.QLabel(self.lock)
        self.locked_handle.setMinimumSize(QtCore.QSize(16, 16))
        self.locked_handle.setMaximumSize(QtCore.QSize(16, 16))
        self.locked_handle.setText("")
        self.locked_handle.setScaledContents(True)
        self.locked_handle.setObjectName("locked_handle")
        self.horizontalLayout_3.addWidget(self.locked_handle)
        self.handle_stack.addWidget(self.lock)
        self.horizontalLayout.addWidget(self.handle_stack)
        self.status = QtGui.QToolButton(self.frame)
        self.status.setMinimumSize(QtCore.QSize(30, 30))
        self.status.setMaximumSize(QtCore.QSize(30, 30))
        icon1 = QtGui.QIcon()
        icon1.addPixmap(
            QtGui.QPixmap(":/tk_multi_publish2/status_validate.png"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.status.setIcon(icon1)
        self.status.setIconSize(QtCore.QSize(24, 24))
        self.status.setObjectName("status")
        self.horizontalLayout.addWidget(self.status)
        self.checkbox = QtGui.QCheckBox(self.frame)
        self.checkbox.setText("")
        self.checkbox.setObjectName("checkbox")
        self.horizontalLayout.addWidget(self.checkbox)
        self.horizontalLayout.setStretch(3, 10)
        self.verticalLayout.addWidget(self.frame)

        self.retranslateUi(ItemWidget)
        self.handle_stack.setCurrentIndex(1)
        QtCore.QMetaObject.connectSlotsByName(ItemWidget)
예제 #28
0
    def add_command_to_menu(self, menu, enabled=True, icon=None):
        """
        Adds the command to the menu.

        :param menu:    A handle to the menu to add the command to.
        :param enabled: Whether the command is to be enabled once it
                        is added to the menu. Defaults to True.
        :param icon:    The path to an image to use as the icon for the
                        command.
        """
        icon = icon or self.properties.get("icon")
        action = menu.addAction(self.name)
        action.setEnabled(enabled)
        if icon:
            from sgtk.platform.qt import QtGui

            action.setIcon(QtGui.QIcon(icon))

        def handler():
            # Populate special action context, which is read by apps and hooks.
            # In hiero, the sender parameter for hiero.core.events.EventType.kShowContextMenu
            # is supposed to always of class binview:
            #
            # http://docs.thefoundry.co.uk/hiero/10/hieropythondevguide/api/api_ui.html?highlight=sender#hiero.ui.BinView
            #
            # In reality, however, it seems it returns the following items:
            # ui.Hiero.Python.TimelineEditor object at 0x11ab15248
            # ui.Hiero.Python.SpreadsheetView object at 0x11ab152d8>
            # ui.Hiero.Python.BinView
            #
            # These objects all have a selection property that returns a list of objects.
            # We extract the selected objects and set the engine "last clicked" state:

            # Set the engine last clicked selection state.
            if self.sender:
                self.engine._last_clicked_selection = self.sender.selection()
            else:
                # Main menu.
                self.engine._last_clicked_selection = []

            # Set the engine last clicked selection area.
            if self.event_type == "kBin":
                self.engine._last_clicked_area = self.engine.HIERO_BIN_AREA
            elif self.event_type == "kTimeline":
                self.engine._last_clicked_area = self.engine.HIERO_TIMELINE_AREA
            elif self.event_type == "kSpreadsheet":
                self.engine._last_clicked_area = self.engine.HIERO_SPREADSHEET_AREA
            else:
                self.engine._last_clicked_area = None

            self.engine.logger.debug("")
            self.engine.logger.debug(
                "--------------------------------------------")
            self.engine.logger.debug("A menu item was clicked!")
            self.engine.logger.debug("Event Type: %s / %s", self.event_type,
                                     self.event_subtype)
            self.engine.logger.debug("Selected Objects:")

            for x in self.engine._last_clicked_selection:
                self.engine.logger.debug("- %r", x)
            self.engine.logger.debug(
                "--------------------------------------------")

            # Fire the callback.
            self.callback()

        action.triggered.connect(handler)
예제 #29
0
    def execute_command(self, cmd_key, args):
        """
        Executes a given command.
        """
        cb = self.commands[cmd_key]["callback"]

        # make sure the number of parameters to the command are correct
        cb_arg_spec = inspect.getargspec(cb)
        cb_arg_list = cb_arg_spec[0]
        cb_var_args = cb_arg_spec[1]

        if hasattr(cb, "__self__"):
            # first argument to cb will be class instance:
            cb_arg_list = cb_arg_list[1:]

        # ensure the correct/minimum number of arguments have been passed:
        have_expected_args = False
        if cb_var_args:
            have_expected_args = (len(args) >= len(cb_arg_list))
        else:
            have_expected_args = (len(args) == len(cb_arg_list))

        if not have_expected_args:
            expected_args = list(cb_arg_list)
            if cb_var_args:
                expected_args.append("*%s" % cb_var_args)
            raise TankError(
                "Cannot run command! Expected command arguments (%s)" %
                ", ".join(expected_args))

        if not self._has_qt:
            # QT not available - just run the command straight
            return cb(*args)
        else:
            from tank.platform.qt import QtCore, QtGui

            # we got QT capabilities. Start a QT app and fire the command into the app
            tk_shell = self.import_module("tk_shell")
            t = tk_shell.Task(self, cb, args)

            # start up our QApp now, if none is already running
            qt_application = None
            if not QtGui.qApp:
                # We need to clear Qt library paths on Linux if KDE is the active environment.
                # This resolves issues with mismatched Qt libraries between the OS and the
                # application being launched if it is a DCC that comes with a bundled Qt.
                if sys.platform == "linux2" and os.environ.get(
                        "KDE_FULL_SESSION") is not None:
                    QtGui.QApplication.setLibraryPaths([])

                qt_application = QtGui.QApplication([])
                qt_application.setWindowIcon(QtGui.QIcon(self.icon_256))
                self._initialize_dark_look_and_feel()

            # if we didn't start the QApplication here, let the responsability
            # to run the exec loop and quit to the initial creator of the QApplication
            if qt_application:
                # when the QApp starts, initialize our task code
                QtCore.QTimer.singleShot(0, t.run_command)
                # and ask the main app to exit when the task emits its finished signal
                t.finished.connect(qt_application.quit)

                # start the application loop. This will block the process until the task
                # has completed - this is either triggered by a main window closing or
                # byt the finished signal being called from the task class above.
                qt_application.exec_()
            else:
                # we can run the command now, as the QApp is already started
                t.run_command()
예제 #30
0
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(479, 800)
        self.verticalLayout_17 = QtGui.QVBoxLayout(Dialog)
        self.verticalLayout_17.setObjectName("verticalLayout_17")
        self.top_group = QtGui.QFrame(Dialog)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Maximum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.top_group.sizePolicy().hasHeightForWidth())
        self.top_group.setSizePolicy(sizePolicy)
        self.top_group.setFrameShape(QtGui.QFrame.StyledPanel)
        self.top_group.setFrameShadow(QtGui.QFrame.Raised)
        self.top_group.setObjectName("top_group")
        self.verticalLayout_18 = QtGui.QVBoxLayout(self.top_group)
        self.verticalLayout_18.setSpacing(4)
        self.verticalLayout_18.setContentsMargins(6, 6, 6, 6)
        self.verticalLayout_18.setObjectName("verticalLayout_18")
        self.header_stack = QtGui.QStackedWidget(self.top_group)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred,
                                       QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.header_stack.sizePolicy().hasHeightForWidth())
        self.header_stack.setSizePolicy(sizePolicy)
        self.header_stack.setObjectName("header_stack")
        self.navigation_page = QtGui.QWidget()
        self.navigation_page.setObjectName("navigation_page")
        self.horizontalLayout = QtGui.QHBoxLayout(self.navigation_page)
        self.horizontalLayout.setSpacing(2)
        self.horizontalLayout.setContentsMargins(2, 0, 2, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.navigation_home = QtGui.QToolButton(self.navigation_page)
        self.navigation_home.setMinimumSize(QtCore.QSize(30, 30))
        self.navigation_home.setMaximumSize(QtCore.QSize(30, 30))
        self.navigation_home.setObjectName("navigation_home")
        self.horizontalLayout.addWidget(self.navigation_home)
        self.navigation_prev = QtGui.QToolButton(self.navigation_page)
        self.navigation_prev.setMinimumSize(QtCore.QSize(30, 30))
        self.navigation_prev.setMaximumSize(QtCore.QSize(30, 30))
        self.navigation_prev.setObjectName("navigation_prev")
        self.horizontalLayout.addWidget(self.navigation_prev)
        self.navigation_next = QtGui.QToolButton(self.navigation_page)
        self.navigation_next.setMinimumSize(QtCore.QSize(30, 30))
        self.navigation_next.setMaximumSize(QtCore.QSize(30, 30))
        self.navigation_next.setObjectName("navigation_next")
        self.horizontalLayout.addWidget(self.navigation_next)
        self.details_text_header = QtGui.QLabel(self.navigation_page)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored,
                                       QtGui.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.details_text_header.sizePolicy().hasHeightForWidth())
        self.details_text_header.setSizePolicy(sizePolicy)
        self.details_text_header.setAlignment(QtCore.Qt.AlignLeading
                                              | QtCore.Qt.AlignLeft
                                              | QtCore.Qt.AlignVCenter)
        self.details_text_header.setWordWrap(False)
        self.details_text_header.setObjectName("details_text_header")
        self.horizontalLayout.addWidget(self.details_text_header)
        self.search = QtGui.QToolButton(self.navigation_page)
        self.search.setMinimumSize(QtCore.QSize(30, 30))
        self.search.setMaximumSize(QtCore.QSize(30, 30))
        self.search.setObjectName("search")
        self.horizontalLayout.addWidget(self.search)
        self.current_user = QtGui.QPushButton(self.navigation_page)
        self.current_user.setMinimumSize(QtCore.QSize(30, 30))
        self.current_user.setMaximumSize(QtCore.QSize(30, 30))
        self.current_user.setFocusPolicy(QtCore.Qt.NoFocus)
        icon = QtGui.QIcon()
        icon.addPixmap(
            QtGui.QPixmap(":/tk_multi_infopanel/default_user_thumb.png"),
            QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.current_user.setIcon(icon)
        self.current_user.setIconSize(QtCore.QSize(30, 30))
        self.current_user.setAutoDefault(False)
        self.current_user.setFlat(False)
        self.current_user.setObjectName("current_user")
        self.horizontalLayout.addWidget(self.current_user)
        self.header_stack.addWidget(self.navigation_page)
        self.search_page = QtGui.QWidget()
        self.search_page.setObjectName("search_page")
        self.horizontalLayout_3 = QtGui.QHBoxLayout(self.search_page)
        self.horizontalLayout_3.setSpacing(2)
        self.horizontalLayout_3.setContentsMargins(2, 0, 2, 0)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label = QtGui.QLabel(self.search_page)
        self.label.setText("")
        self.label.setPixmap(QtGui.QPixmap(":/tk_multi_infopanel/search.png"))
        self.label.setObjectName("label")
        self.horizontalLayout_3.addWidget(self.label)
        self.search_input = GlobalSearchWidget(self.search_page)
        self.search_input.setObjectName("search_input")
        self.horizontalLayout_3.addWidget(self.search_input)
        self.cancel_search = QtGui.QPushButton(self.search_page)
        self.cancel_search.setObjectName("cancel_search")
        self.horizontalLayout_3.addWidget(self.cancel_search)
        self.header_stack.addWidget(self.search_page)
        self.verticalLayout_18.addWidget(self.header_stack)
        self.line = QtGui.QFrame(self.top_group)
        self.line.setFrameShape(QtGui.QFrame.HLine)
        self.line.setFrameShadow(QtGui.QFrame.Sunken)
        self.line.setObjectName("line")
        self.verticalLayout_18.addWidget(self.line)
        self.horizontalLayout_4 = QtGui.QHBoxLayout()
        self.horizontalLayout_4.setSpacing(0)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.verticalLayout_7 = QtGui.QVBoxLayout()
        self.verticalLayout_7.setSpacing(0)
        self.verticalLayout_7.setContentsMargins(-1, 4, -1, -1)
        self.verticalLayout_7.setObjectName("verticalLayout_7")
        self.details_thumb = ShotgunPlaybackLabel(self.top_group)
        self.details_thumb.setMinimumSize(QtCore.QSize(96, 75))
        self.details_thumb.setMaximumSize(QtCore.QSize(96, 75))
        self.details_thumb.setText("")
        self.details_thumb.setPixmap(
            QtGui.QPixmap(":/tk_multi_infopanel/rect_512x400.png"))
        self.details_thumb.setScaledContents(True)
        self.details_thumb.setAlignment(QtCore.Qt.AlignLeading
                                        | QtCore.Qt.AlignLeft
                                        | QtCore.Qt.AlignTop)
        self.details_thumb.setObjectName("details_thumb")
        self.verticalLayout_7.addWidget(self.details_thumb)
        spacerItem = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Minimum,
                                       QtGui.QSizePolicy.Ignored)
        self.verticalLayout_7.addItem(spacerItem)
        self.verticalLayout_7.setStretch(1, 1)
        self.horizontalLayout_4.addLayout(self.verticalLayout_7)
        self.details_text_middle = QtGui.QLabel(self.top_group)
        self.details_text_middle.setAlignment(QtCore.Qt.AlignLeading
                                              | QtCore.Qt.AlignLeft
                                              | QtCore.Qt.AlignTop)
        self.details_text_middle.setWordWrap(True)
        self.details_text_middle.setObjectName("details_text_middle")
        self.horizontalLayout_4.addWidget(self.details_text_middle)
        self.verticalLayout_22 = QtGui.QVBoxLayout()
        self.verticalLayout_22.setSpacing(0)
        self.verticalLayout_22.setContentsMargins(-1, -1, 6, -1)
        self.verticalLayout_22.setObjectName("verticalLayout_22")
        self.action_button = QtGui.QPushButton(self.top_group)
        self.action_button.setMaximumSize(QtCore.QSize(16, 16))
        self.action_button.setFocusPolicy(QtCore.Qt.NoFocus)
        self.action_button.setObjectName("action_button")
        self.verticalLayout_22.addWidget(self.action_button)
        self.label_2 = QtGui.QLabel(self.top_group)
        self.label_2.setText("")
        self.label_2.setObjectName("label_2")
        self.verticalLayout_22.addWidget(self.label_2)
        self.verticalLayout_22.setStretch(1, 1)
        self.horizontalLayout_4.addLayout(self.verticalLayout_22)
        self.horizontalLayout_4.setStretch(1, 1)
        self.verticalLayout_18.addLayout(self.horizontalLayout_4)
        self.verticalLayout_17.addWidget(self.top_group)
        self.page_stack = QtGui.QStackedWidget(Dialog)
        self.page_stack.setObjectName("page_stack")
        self.entity_page = QtGui.QWidget()
        self.entity_page.setObjectName("entity_page")
        self.verticalLayout = QtGui.QVBoxLayout(self.entity_page)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setObjectName("verticalLayout")
        self.entity_tab_widget = QtGui.QTabWidget(self.entity_page)
        self.entity_tab_widget.setFocusPolicy(QtCore.Qt.NoFocus)
        self.entity_tab_widget.setObjectName("entity_tab_widget")
        self.entity_activity_tab = QtGui.QWidget()
        self.entity_activity_tab.setObjectName("entity_activity_tab")
        self.verticalLayout_16 = QtGui.QVBoxLayout(self.entity_activity_tab)
        self.verticalLayout_16.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_16.setObjectName("verticalLayout_16")
        self.entity_activity_stream = ActivityStreamWidget(
            self.entity_activity_tab)
        self.entity_activity_stream.setObjectName("entity_activity_stream")
        self.verticalLayout_16.addWidget(self.entity_activity_stream)
        self.entity_tab_widget.addTab(self.entity_activity_tab, "")
        self.entity_note_tab = QtGui.QWidget()
        self.entity_note_tab.setObjectName("entity_note_tab")
        self.verticalLayout_2 = QtGui.QVBoxLayout(self.entity_note_tab)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.entity_note_view = QtGui.QListView(self.entity_note_tab)
        self.entity_note_view.setVerticalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.entity_note_view.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.entity_note_view.setUniformItemSizes(True)
        self.entity_note_view.setObjectName("entity_note_view")
        self.verticalLayout_2.addWidget(self.entity_note_view)
        self.entity_tab_widget.addTab(self.entity_note_tab, "")
        self.entity_version_tab = QtGui.QWidget()
        self.entity_version_tab.setObjectName("entity_version_tab")
        self.verticalLayout_3 = QtGui.QVBoxLayout(self.entity_version_tab)
        self.verticalLayout_3.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.entity_version_view = QtGui.QListView(self.entity_version_tab)
        self.entity_version_view.setVerticalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.entity_version_view.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.entity_version_view.setUniformItemSizes(True)
        self.entity_version_view.setObjectName("entity_version_view")
        self.verticalLayout_3.addWidget(self.entity_version_view)
        self.pending_versions_only = QtGui.QCheckBox(self.entity_version_tab)
        self.pending_versions_only.setObjectName("pending_versions_only")
        self.verticalLayout_3.addWidget(self.pending_versions_only)
        self.entity_tab_widget.addTab(self.entity_version_tab, "")
        self.entity_publish_tab = QtGui.QWidget()
        self.entity_publish_tab.setObjectName("entity_publish_tab")
        self.verticalLayout_4 = QtGui.QVBoxLayout(self.entity_publish_tab)
        self.verticalLayout_4.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.entity_publish_view = QtGui.QListView(self.entity_publish_tab)
        self.entity_publish_view.setVerticalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.entity_publish_view.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.entity_publish_view.setUniformItemSizes(True)
        self.entity_publish_view.setObjectName("entity_publish_view")
        self.verticalLayout_4.addWidget(self.entity_publish_view)
        self.latest_publishes_only = QtGui.QCheckBox(self.entity_publish_tab)
        self.latest_publishes_only.setChecked(True)
        self.latest_publishes_only.setObjectName("latest_publishes_only")
        self.verticalLayout_4.addWidget(self.latest_publishes_only)
        self.entity_tab_widget.addTab(self.entity_publish_tab, "")
        self.entity_tasks_tab = QtGui.QWidget()
        self.entity_tasks_tab.setObjectName("entity_tasks_tab")
        self.verticalLayout_8 = QtGui.QVBoxLayout(self.entity_tasks_tab)
        self.verticalLayout_8.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_8.setObjectName("verticalLayout_8")
        self.entity_task_view = QtGui.QListView(self.entity_tasks_tab)
        self.entity_task_view.setVerticalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.entity_task_view.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.entity_task_view.setUniformItemSizes(True)
        self.entity_task_view.setObjectName("entity_task_view")
        self.verticalLayout_8.addWidget(self.entity_task_view)
        self.entity_tab_widget.addTab(self.entity_tasks_tab, "")
        self.entity_info_tab = QtGui.QWidget()
        self.entity_info_tab.setObjectName("entity_info_tab")
        self.verticalLayout_9 = QtGui.QVBoxLayout(self.entity_info_tab)
        self.verticalLayout_9.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_9.setObjectName("verticalLayout_9")
        self.entity_info_widget = AllFieldsWidget(self.entity_info_tab)
        self.entity_info_widget.setObjectName("entity_info_widget")
        self.verticalLayout_9.addWidget(self.entity_info_widget)
        self.entity_tab_widget.addTab(self.entity_info_tab, "")
        self.verticalLayout.addWidget(self.entity_tab_widget)
        self.page_stack.addWidget(self.entity_page)
        self.publish_page = QtGui.QWidget()
        self.publish_page.setObjectName("publish_page")
        self.verticalLayout_6 = QtGui.QVBoxLayout(self.publish_page)
        self.verticalLayout_6.setSpacing(0)
        self.verticalLayout_6.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_6.setObjectName("verticalLayout_6")
        self.publish_tab_widget = QtGui.QTabWidget(self.publish_page)
        self.publish_tab_widget.setFocusPolicy(QtCore.Qt.NoFocus)
        self.publish_tab_widget.setObjectName("publish_tab_widget")
        self.publish_history_tab = QtGui.QWidget()
        self.publish_history_tab.setObjectName("publish_history_tab")
        self.verticalLayout_15 = QtGui.QVBoxLayout(self.publish_history_tab)
        self.verticalLayout_15.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_15.setObjectName("verticalLayout_15")
        self.publish_history_view = QtGui.QListView(self.publish_history_tab)
        self.publish_history_view.setVerticalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.publish_history_view.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.publish_history_view.setUniformItemSizes(True)
        self.publish_history_view.setObjectName("publish_history_view")
        self.verticalLayout_15.addWidget(self.publish_history_view)
        self.publish_tab_widget.addTab(self.publish_history_tab, "")
        self.publish_upstream_tab = QtGui.QWidget()
        self.publish_upstream_tab.setObjectName("publish_upstream_tab")
        self.verticalLayout_13 = QtGui.QVBoxLayout(self.publish_upstream_tab)
        self.verticalLayout_13.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_13.setObjectName("verticalLayout_13")
        self.publish_upstream_view = QtGui.QListView(self.publish_upstream_tab)
        self.publish_upstream_view.setVerticalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.publish_upstream_view.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.publish_upstream_view.setUniformItemSizes(True)
        self.publish_upstream_view.setObjectName("publish_upstream_view")
        self.verticalLayout_13.addWidget(self.publish_upstream_view)
        self.publish_tab_widget.addTab(self.publish_upstream_tab, "")
        self.publish_downstream_tab = QtGui.QWidget()
        self.publish_downstream_tab.setObjectName("publish_downstream_tab")
        self.verticalLayout_14 = QtGui.QVBoxLayout(self.publish_downstream_tab)
        self.verticalLayout_14.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_14.setObjectName("verticalLayout_14")
        self.publish_downstream_view = QtGui.QListView(
            self.publish_downstream_tab)
        self.publish_downstream_view.setVerticalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.publish_downstream_view.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.publish_downstream_view.setUniformItemSizes(True)
        self.publish_downstream_view.setObjectName("publish_downstream_view")
        self.verticalLayout_14.addWidget(self.publish_downstream_view)
        self.publish_tab_widget.addTab(self.publish_downstream_tab, "")
        self.publish_info_tab = QtGui.QWidget()
        self.publish_info_tab.setObjectName("publish_info_tab")
        self.verticalLayout_19 = QtGui.QVBoxLayout(self.publish_info_tab)
        self.verticalLayout_19.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_19.setObjectName("verticalLayout_19")
        self.publish_info_widget = AllFieldsWidget(self.publish_info_tab)
        self.publish_info_widget.setObjectName("publish_info_widget")
        self.verticalLayout_19.addWidget(self.publish_info_widget)
        self.publish_tab_widget.addTab(self.publish_info_tab, "")
        self.verticalLayout_6.addWidget(self.publish_tab_widget)
        self.page_stack.addWidget(self.publish_page)
        self.version_page = QtGui.QWidget()
        self.version_page.setObjectName("version_page")
        self.verticalLayout_10 = QtGui.QVBoxLayout(self.version_page)
        self.verticalLayout_10.setSpacing(0)
        self.verticalLayout_10.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_10.setObjectName("verticalLayout_10")
        self.version_tab_widget = QtGui.QTabWidget(self.version_page)
        self.version_tab_widget.setFocusPolicy(QtCore.Qt.NoFocus)
        self.version_tab_widget.setObjectName("version_tab_widget")
        self.version_activity_tab = QtGui.QWidget()
        self.version_activity_tab.setObjectName("version_activity_tab")
        self.verticalLayout_20 = QtGui.QVBoxLayout(self.version_activity_tab)
        self.verticalLayout_20.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_20.setObjectName("verticalLayout_20")
        self.version_activity_stream = ActivityStreamWidget(
            self.version_activity_tab)
        self.version_activity_stream.setObjectName("version_activity_stream")
        self.verticalLayout_20.addWidget(self.version_activity_stream)
        self.version_tab_widget.addTab(self.version_activity_tab, "")
        self.version_note_tab = QtGui.QWidget()
        self.version_note_tab.setObjectName("version_note_tab")
        self.verticalLayout_11 = QtGui.QVBoxLayout(self.version_note_tab)
        self.verticalLayout_11.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_11.setObjectName("verticalLayout_11")
        self.version_note_view = QtGui.QListView(self.version_note_tab)
        self.version_note_view.setVerticalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.version_note_view.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.version_note_view.setUniformItemSizes(True)
        self.version_note_view.setObjectName("version_note_view")
        self.verticalLayout_11.addWidget(self.version_note_view)
        self.version_tab_widget.addTab(self.version_note_tab, "")
        self.version_publish_tab = QtGui.QWidget()
        self.version_publish_tab.setObjectName("version_publish_tab")
        self.verticalLayout_12 = QtGui.QVBoxLayout(self.version_publish_tab)
        self.verticalLayout_12.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_12.setObjectName("verticalLayout_12")
        self.version_publish_view = QtGui.QListView(self.version_publish_tab)
        self.version_publish_view.setVerticalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.version_publish_view.setHorizontalScrollMode(
            QtGui.QAbstractItemView.ScrollPerPixel)
        self.version_publish_view.setUniformItemSizes(True)
        self.version_publish_view.setObjectName("version_publish_view")
        self.verticalLayout_12.addWidget(self.version_publish_view)
        self.version_tab_widget.addTab(self.version_publish_tab, "")
        self.version_info_tab = QtGui.QWidget()
        self.version_info_tab.setObjectName("version_info_tab")
        self.verticalLayout_21 = QtGui.QVBoxLayout(self.version_info_tab)
        self.verticalLayout_21.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_21.setObjectName("verticalLayout_21")
        self.version_info_widget = AllFieldsWidget(self.version_info_tab)
        self.version_info_widget.setObjectName("version_info_widget")
        self.verticalLayout_21.addWidget(self.version_info_widget)
        self.version_tab_widget.addTab(self.version_info_tab, "")
        self.verticalLayout_10.addWidget(self.version_tab_widget)
        self.page_stack.addWidget(self.version_page)
        self.note_page = QtGui.QWidget()
        self.note_page.setObjectName("note_page")
        self.verticalLayout_5 = QtGui.QVBoxLayout(self.note_page)
        self.verticalLayout_5.setSpacing(0)
        self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.note_reply_widget = ReplyListWidget(self.note_page)
        self.note_reply_widget.setObjectName("note_reply_widget")
        self.verticalLayout_5.addWidget(self.note_reply_widget)
        self.page_stack.addWidget(self.note_page)
        self.verticalLayout_17.addWidget(self.page_stack)

        self.retranslateUi(Dialog)
        self.header_stack.setCurrentIndex(0)
        self.page_stack.setCurrentIndex(0)
        self.entity_tab_widget.setCurrentIndex(2)
        self.publish_tab_widget.setCurrentIndex(3)
        self.version_tab_widget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Dialog)