diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0127b5a --- /dev/null +++ b/.gitignore @@ -0,0 +1,223 @@ +# Created by .ignore support plugin (hsz.mobi) +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/dictionaries +.idea/**/shelf + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# CMake +cmake-build-debug/ +cmake-build-release/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests +### Python template +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +### macOS template +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +### Linux template +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* +### Windows template +# Windows thumbnail cache files +Thumbs.db +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..5172753 --- /dev/null +++ b/LICENSE @@ -0,0 +1,146 @@ +SHOTGUN PIPELINE TOOLKIT SOURCE CODE LICENSE + +Version: 7/07/2013 + +Shotgun Software Inc. ("Company") provides the Shotgun Pipeline Toolkit, +software, including source code, in this package or repository folder (the +"Shotgun Toolkit Code") subject to your acceptance of and compliance with +the following terms and conditions (the "License Terms"). By accessing, +downloading, copying, using or modifying any of the Shotgun Toolkit Code, +you agree to these License Terms. + +Eligibility + +The following license to the Shotgun Toolkit Code is valid only if and while +you are a customer of Company in good standing with either: (a) a current, +paid-up (or free-for-evaluation) subscription or fixed-term license for +Company's Shotgun Platform; or (b) a perpetual license and current, paid-up +maintenance and support contract for the Shotgun Platform. + +Shotgun Toolkit Code License + +Subject to the eligibility criteria above and your compliance with these +License Terms, Company grants to you a non-exclusive, limited license to +reproduce, use, and make derivative works of (including by compiling object +code versions of) the Shotgun Toolkit Code solely for your non-commercial or +internal business purposes in connection with your authorized use of the +Shotgun Platform. + +Company reserves all rights in the Shotgun Toolkit Code not expressly granted +above. These License Terms do not grant or require Company to grant, by +implication, estoppel, or otherwise, any other licenses or rights with respect +to the Shotgun Toolkit Code or any of Company's other software or intellectual +property rights. You agree not to take any action with respect to the Shotgun +Toolkit Code that is not expressly authorized above. + +You must keep intact (and, in the case of copies, reproduce) all copyright +and other proprietary notices, including all references to and copies of these +License Terms, as originally included on, in, or with the Shotgun Toolkit +Code. You must ensure that all derivative works you make of the Shotgun +Toolkit Code contain or are accompanied by comparable and conspicuous notices +that the underlying Shotgun Toolkit Code is the confidential information of +Company and is subject to Company's copyrights and these License Terms. + +No Redistribution or Disclosure + +You acknowledge that the Shotgun Toolkit Code is and contains proprietary and +trade-secret information of Company. You may not distribute, disclose to any +third party, operate for the benefit of third parties (for example, on a +hosted basis), or otherwise commercially exploit the Shotgun Toolkit Code or +any portion or derivative work thereof without Company's separate and express +written consent. For purposes of this restriction, third parties do not +include your employees or agents acting on your behalf who are bound to abide +by these License Terms. + +No Warranties or Support + +The Shotgun Toolkit Code is provided "AS IS" and with all faults. Company +makes no warranties whatsoever, whether express, implied, or otherwise, +concerning the Shotgun Toolkit Code. Company has no obligation to provide +maintenance or technical support for the Shotgun Toolkit Code (unless +otherwise expressly agreed in a separate written agreement between you and +Company). + +Liability + +You agree to be solely responsible for your use and modifications of the +Shotgun Toolkit Code, and for any harm or liability arising out of such use +or modifications, including but not limited to any liability for infringement +of third-party intellectual property rights. + +To the fullest extent permitted under applicable law, you agree that: (a) +Company will not be liable under these License Terms or otherwise for any +direct, indirect, incidental, special, consequential, or exemplary damages, +including but not limited to damages for loss of profits, goodwill, use, data +or other intangible losses, in relation to the Shotgun Toolkit Code or your +use or inability to use the Shotgun Toolkit Code, even if Company has been +advised of the possibility of such damages; and (b) in any event, Company's +aggregate liability under these License Terms or in connection with the +Shotgun Toolkit Code, regardless of the form of action and under any theory +(whether in contract, tort, statutory, or otherwise), will not exceed the +greater of $50 or the amount (if any) that you actually paid for access to +the Shotgun Toolkit Code. + +Ownership + +Company retains sole and exclusive ownership of the Shotgun Toolkit Code and +all copyright and other intellectual property rights therein. You will own any +derivative works you make to the Shotgun Toolkit Code, subject to: (a) the +preceding sentence; and (b) the provisions below regarding ownership of any +code you elect to contribute to Company. + +Contributions + +The following terms apply to any derivative works of the Shotgun Toolkit Code +(or any other materials) that you choose to contribute to Company. + +For good and valuable consideration, receipt of which is acknowledged, you +hereby transfer and assign to Company your entire right, title, and interest +(including all rights under copyright) in: (a) any software code, +documentation, and/or other materials that you deliver to Company for +inclusion in, improvement of, use with, or documentation of Company's software +program(s), including but not limited to any code, documentation, and/or other +materials identified in a contribution form you submit to Company in an +applicable form designated by Company; and (b) any future revisions of such +code, documentation, and/or other materials that you make hereafter. The code, +documentation, other materials, and future revisions described above are +collectively referred to below as the "Contribution." + +As used below, the "Company Programs" means and includes the Company software +program(s) identified on any contribution form you submit to Company, and any +other software into which Company incorporates or with which Company uses or +distributes the Contribution or any version or portion thereof. + +Company grants you a non-exclusive right to continue to modify, make +derivative works of, reproduce, and use the Contribution for your +non-commercial or internal business purposes, and to further Company's +development of Company Programs. This grant does not: (a) limit Company's +rights, (b) grant you any rights with respect to the Company Programs; nor +(c) permit you to distribute, operate for the benefit of third parties (for +example, on a hosted basis), or otherwise commercially exploit the +Contribution. + +You acknowledge that if Company elects to distribute the Contribution or any +version or portion thereof, it may do so on any basis that it chooses +(including under any proprietary or open-source licensing terms), without +further compensation to you. + +You agree that if you have or acquire hereafter any patent or interface +copyright or other intellectual property interest dominating the Contribution +or any Company Programs (or use thereof), such dominating interest will not be +used to undermine the effect of the assignment set forth above. Accordingly, +Company and its direct and indirect licensees are licensed to make, use, sell, +distribute, and otherwise exploit, in the Company Programs and their future +versions and derivative works, without royalty or limitation, the subject +matter of the dominating interest. This license provision will be binding on +you and on any assignees of, or other successors to, the dominating interest. + +You hereby represent and warrant that you are the sole copyright holder for +the Contribution and that you have the right and power to enter into this +contract. You shall indemnify and hold harmless Company and its officers, +employees, and agents against any and all claims, actions or damages +(including attorney's reasonable fees) asserted by or paid to any party on +account of a breach or alleged breach of the foregoing warranty. You make no +other express or implied warranty (including without limitation any warranty +of merchantability or fitness for a particular purpose) regarding the +Contribution. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..24c6345 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Bug-Reporter App +A Shotgun app for submit ticket for reporting bugs and request. + diff --git a/app.py b/app.py new file mode 100644 index 0000000..d6ed97d --- /dev/null +++ b/app.py @@ -0,0 +1,38 @@ +# Copyright (c) 2013 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + + +from sgtk.platform import Application + +class BugReporter(Application): + """ + An App that can be used to submit a bug ticket to support team in Shotgun. + """ + def init_app(self): + """ + Called as the application is being initialized + """ + # first, we use the special import_module command to access the app module + # that resides inside the python folder in the app. This is where the actual UI + # and business logic of the app is kept. By using the import_module command, + # toolkit's code reload mechanism will work properly. + app_payload = self.import_module("app") + + # now register a *command*, which is normally a menu entry of some kind on a Shotgun + # menu (but it depends on the engine). The engine will manage this command and + # whenever the user requests the command, it will call out to the callback. + + # first, set up our callback, calling out to a method inside the app module contained + # in the python folder of the app + menu_callback = lambda : app_payload.dialog.show_dialog(self) + + # now register the command with the engine + self.engine.register_command("Report Bugs!", menu_callback) + diff --git a/icon_256.png b/icon_256.png new file mode 100644 index 0000000..cbef9e6 Binary files /dev/null and b/icon_256.png differ diff --git a/info.yml b/info.yml new file mode 100644 index 0000000..1895498 --- /dev/null +++ b/info.yml @@ -0,0 +1,39 @@ +# Copyright (c) 2013 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +# Metadata defining the behaviour and requirements for this engine + +# expected fields in the configuration file for this engine +configuration: + cc: + type: str + default_value: "" + description: A comma-separated list of Shotgun user names to CC by default. + +# this app works in all engines - it does not contain +# any host application specific commands +supported_engines: + +# the Shotgun fields that this engine needs in order to operate correctly +requires_shotgun_fields: + +# More verbose description of this item +display_name: "Shotgun Toolkit Bug Reporter" +description: "An App that can be used to quickly submit a new bug ticket to the support team." + +# Required minimum versions for this item to run +requires_shotgun_version: +requires_core_version: "v0.14.28" +requires_engine_version: + +# the frameworks required to run this app +frameworks: + - {"name": "tk-framework-qtwidgets", "version": "v2.x.x", "minimum_version": "v2.7.0"} + \ No newline at end of file diff --git a/python/__init__.py b/python/__init__.py new file mode 100644 index 0000000..47c324a --- /dev/null +++ b/python/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) 2013 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +from . import app \ No newline at end of file diff --git a/python/app/__init__.py b/python/app/__init__.py new file mode 100644 index 0000000..65d854b --- /dev/null +++ b/python/app/__init__.py @@ -0,0 +1,11 @@ +# Copyright (c) 2013 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +from . import dialog diff --git a/python/app/dialog.py b/python/app/dialog.py new file mode 100644 index 0000000..22cc884 --- /dev/null +++ b/python/app/dialog.py @@ -0,0 +1,152 @@ +# Copyright (c) 2013 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + +import sgtk +import os +import sys +import threading +import tempfile +import re + +# by importing QT from sgtk rather than directly, we ensure that +# the code will be compatible with both PySide and PyQt. +from sgtk.platform.qt import QtCore, QtGui +from .ui.dialog import Ui_Dialog + +screen_grab = sgtk.platform.import_framework("tk-framework-qtwidgets", "screen_grab") +shotgun_fields = sgtk.platform.import_framework("tk-framework-qtwidgets", "shotgun_fields") + +def show_dialog(app_instance): + """ + Shows the main dialog window. + """ + # in order to handle UIs seamlessly, each toolkit engine has methods for launching + # different types of windows. By using these methods, your windows will be correctly + # decorated and handled in a consistent fashion by the system. + + # we pass the dialog class to this method and leave the actual construction + # to be carried out by toolkit. + app_instance.engine.show_dialog("Report Bugs!", app_instance, AppDialog) + + +class AppDialog(QtGui.QWidget): + """ + Main application dialog window + """ + + def __init__(self): + """ + Constructor + """ + # first, call the base class and let it do its thing. + QtGui.QWidget.__init__(self) + + # now load in the UI that was created in the UI designer + self.ui = Ui_Dialog() + self.ui.setupUi(self) + + # most of the useful accessors are available through the Application class instance + # it is often handy to keep a reference to this. You can get it via the following method: + self._app = sgtk.platform.current_bundle() + + # via the self._app handle we can for example access: + # - The engine, via self._app.engine + # - A Shotgun API instance, via self._app.shotgun + # - A tk API instance, via self._app.tk + + self.ui.buttons.accepted.connect(self.create_ticket) + self.ui.buttons.rejected.connect(self.close) + self.ui.screen_grab.clicked.connect(self.screen_grab) + + self._screenshot = None + self._cc_widget = None + + # The ShotgunFieldManager is a factory used to build widgets for fields + # associated with an entity type in Shotgun. It pulls down the schema from + # Shotgun asynchronously when the initialize method is called, so before + # we do that we need to hook up the signal it emits when it's done to our + # method that gets the widget we want and adds it to the UI. + self._field_manager = shotgun_fields.ShotgunFieldManager(parent=self) + self._field_manager.initialized.connect(self._get_shotgun_fields) + self._field_manager.initialize() + + def _get_shotgun_fields(self): + """ + Populates the CC list Shotgun field widget. + """ + # Get a list of user entities from Shotgun representing the default + # list that we'll pull from the "cc" config setting for the app. + raw_cc = self._app.get_setting("cc", "") + users = self._app.shotgun.find( + "HumanUser", + [["login", "in", re.split(r"[,\s]+", raw_cc)]], + fields=("id", "type", "name") + ) + + # Create the widget that the user will use to view the default CC + # list, plus enter in any additional users if the choose to do so. + self._cc_widget = self._field_manager.create_widget( + "Ticket", + "addressings_cc", + parent=self, + ) + + # Add our list of default users to the CC widget and then add the + # widget to the appropriate layout. + self._cc_widget.set_value(users) + self.ui.cc_layout.addWidget(self._cc_widget) + + def screen_grab(self): + """ + Triggers a screen grab to be initiated. + """ + pixmap = screen_grab.ScreenGrabber.screen_capture() + self._screenshot = pixmap + self.ui.screenshot.setPixmap(pixmap.scaled(100, 100)) + + def create_ticket(self): + """ + Creates a new Ticket entity in Shotgun from the contents of the dialog. + """ + # Create the new Ticket entity, pulling the project from the current + # context, and the title, ticket body, and cc list from the UI. + result = self._app.shotgun.create( + "Ticket", + dict( + project=self._app.context.project, + title=self.ui.ticket_title.text(), + description=self.ui.ticket_body.toPlainText(), + addressings_cc=self._cc_widget.get_value(), + ) + ) + + # If we have a screenshot that was recorded, we write that to disk as a + # png file and then upload it to Shotgun, associating it with the Ticket + # entity we just created. + if self._screenshot: + path = tempfile.mkstemp(suffix=".png")[1] + file_obj = QtCore.QFile(path) + file_obj.open(QtCore.QIODevice.WriteOnly) + self._screenshot.save(file_obj, "PNG") + self._app.shotgun.upload( + "Ticket", + result["id"], + path, + "attachments", + ) + + QtGui.QMessageBox.information( + self, + "Ticket successfully created!", + "Ticket #%s successfully submitted!" % result["id"], + ) + self.close() + + diff --git a/python/app/ui/__init__.py b/python/app/ui/__init__.py new file mode 100644 index 0000000..76c4060 --- /dev/null +++ b/python/app/ui/__init__.py @@ -0,0 +1,10 @@ +# Copyright (c) 2013 Shotgun Software Inc. +# +# CONFIDENTIAL AND PROPRIETARY +# +# This work is provided "AS IS" and subject to the Shotgun Pipeline Toolkit +# Source Code License included in this distribution package. See LICENSE. +# By accessing, using, copying or modifying this work you indicate your +# agreement to the Shotgun Pipeline Toolkit Source Code License. All rights +# not expressly granted therein are reserved by Shotgun Software Inc. + diff --git a/python/app/ui/dialog.py b/python/app/ui/dialog.py new file mode 100644 index 0000000..eaf2314 --- /dev/null +++ b/python/app/ui/dialog.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- + +# Form implementation generated from reading ui file 'dialog.ui' +# +# by: pyside-uic 0.2.15 running on PySide 1.2.2 +# +# WARNING! All changes made in this file will be lost! + +from tank.platform.qt import QtCore, QtGui + +class Ui_Dialog(object): + def setupUi(self, Dialog): + Dialog.setObjectName("Dialog") + Dialog.resize(431, 392) + self.verticalLayout = QtGui.QVBoxLayout(Dialog) + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.label = QtGui.QLabel(Dialog) + self.label.setObjectName("label") + self.horizontalLayout_2.addWidget(self.label) + self.ticket_title = QtGui.QLineEdit(Dialog) + self.ticket_title.setObjectName("ticket_title") + self.horizontalLayout_2.addWidget(self.ticket_title) + self.verticalLayout.addLayout(self.horizontalLayout_2) + self.cc_layout = QtGui.QHBoxLayout() + self.cc_layout.setContentsMargins(-1, 0, -1, -1) + self.cc_layout.setObjectName("cc_layout") + self.cc_label = QtGui.QLabel(Dialog) + self.cc_label.setObjectName("cc_label") + self.cc_layout.addWidget(self.cc_label) + self.verticalLayout.addLayout(self.cc_layout) + self.ticket_body = QtGui.QPlainTextEdit(Dialog) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(1) + sizePolicy.setHeightForWidth(self.ticket_body.sizePolicy().hasHeightForWidth()) + self.ticket_body.setSizePolicy(sizePolicy) + self.ticket_body.setObjectName("ticket_body") + self.verticalLayout.addWidget(self.ticket_body) + self.lower_layout = QtGui.QHBoxLayout() + self.lower_layout.setSpacing(5) + self.lower_layout.setContentsMargins(-1, 0, -1, -1) + self.lower_layout.setObjectName("lower_layout") + self.screenshot = QtGui.QLabel(Dialog) + self.screenshot.setMinimumSize(QtCore.QSize(50, 50)) + self.screenshot.setMaximumSize(QtCore.QSize(50, 50)) + self.screenshot.setStyleSheet("border: 1px solid grey") + self.screenshot.setText("") + self.screenshot.setAlignment(QtCore.Qt.AlignCenter) + self.screenshot.setObjectName("screenshot") + self.lower_layout.addWidget(self.screenshot) + self.screen_grab = QtGui.QPushButton(Dialog) + self.screen_grab.setMaximumSize(QtCore.QSize(16777215, 16777215)) + self.screen_grab.setObjectName("screen_grab") + self.lower_layout.addWidget(self.screen_grab) + self.verticalLayout.addLayout(self.lower_layout) + self.buttons = QtGui.QDialogButtonBox(Dialog) + self.buttons.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) + self.buttons.setObjectName("buttons") + self.verticalLayout.addWidget(self.buttons) + + self.retranslateUi(Dialog) + QtCore.QMetaObject.connectSlotsByName(Dialog) + + def retranslateUi(self, Dialog): + Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Report a bug!", None, QtGui.QApplication.UnicodeUTF8)) + self.label.setText(QtGui.QApplication.translate("Dialog", "Subject:", None, QtGui.QApplication.UnicodeUTF8)) + self.cc_label.setText(QtGui.QApplication.translate("Dialog", "CC:", None, QtGui.QApplication.UnicodeUTF8)) + self.screen_grab.setText(QtGui.QApplication.translate("Dialog", "Take a screenshot!", None, QtGui.QApplication.UnicodeUTF8)) + +from . import resources_rc diff --git a/python/app/ui/resources_rc.py b/python/app/ui/resources_rc.py new file mode 100644 index 0000000..cb87edd --- /dev/null +++ b/python/app/ui/resources_rc.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- + +# Resource object code +# +# by: The Resource Compiler for PySide (Qt v4.8.7) +# +# WARNING! All changes made in this file will be lost! + +from tank.platform.qt import QtCore + +qt_resource_data = "\x00\x00\x19\x90\x89PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x00M\x00\x00\x00L\x08\x06\x00\x00\x00(U:\x15\x00\x00\x04$iCCPICC Profile\x00\x008\x11\x85U\xdfo\xdbT\x14>\x89oR\xa4\x16? XG\x87\x8a\xc5\xafUS[\xb9\x1b\x1a\xad\xc6\x06I\x93\xa5\xedJ\x16\xa5\xe9\xd8*$\xe4:7\x89\xa9\x1b\x07\xdb\xe9\xb6\xaaO{\x817\x06\xfc\x01@\xd9\x03\x0fH\xa7kk?\xec\x0e<\xca\x06\xbb\xf8\xce\xed\xbekkt\xfcq\xf3\x8d\xdd\x8bm\xc76\xb0n\xc6\xb6\xc2\xf8\xd8\xaf\xb1-\xfcmR\x02;`z\x8a\x96\xa1\xca\xf0v\xc2\x09x#\x1d=\x5c\x01\xd3%\x0d\xebo\xe0Y\xd0\xdaR\xda\xb1\xa3\xa5\xea\xf9\x81\xd0#&\xc1?\xc8>\xcc\xd2\xb9\xe1\xd0\xaa\xfe\xa2\xfe\xa9n\xa8_\xa8\x17\xd4\xdf;j\x84\x19;\xa6$}*}+\xfd(}'}/\xfdL\x8atY\xba\x22\xfd$]\x95\xbe\x91.\x059\xbb\xef\xbd\x9f%\xd8{\xaf_a\x13\xdd\x8a]h\xd5k\x9f5'SN\xca{\xe4\x17\xe5\x94\xfc\xbc\xfc\xb2<\x1b\xb0\x14\xb9_\x1e\x93\xa7\xe4\xbd\xf0\xec\x09\xf6\xcd\x0c\xfd\x1d\xbd\x18t\x0a\xb3jM\xb5{-\xf1\x04\x184\x0f%\x06\x9d\x06\xd7\xc6T\xc5\x84\xabt\x16Y\xdb\x9f\x93\xa6R6\xc8\xc6\xd8\xf4#\xa7v\x5c\x9c\xe5\x96\x8ax:\x9e\x8a'H\x89\xef\x8bO\xc4\xc7\xe23\x02\xb7\x9e\xbc\xf8^\xf8&\xb0\xa6\x03\xf5\xfe\x93\x130::\xe0m,L%\xc83\xe2\x9d:qVE\xf4\x0at\x9b\xd0\xcd]~\x06\xdf\x0e\xa2I\xabv\xd66\xca\x15W\xd9\xaf\xaa\xaf)\x09|\xca\xb82]\xd5G\x87\x15\xcd4\x15\xcf\xe5(6w\xb8\xbd\xc2\x8b\xa3$\xbe\x83\x22\x8e\xe8A\xde\xfb\xbeEv\xdd\x0cm\xee[D\x87\xff\xc2;\xebVh[\xa8\x13}\xed\x10\xf5\xbf\x1a\xda\x86\xf0N|\xe63\xa2\x8b\x07\xf5\xba\xbd\xe2\xe7\xa3H\xe4\x06\x91S:\xb0\xdf\xfb\x1d\xe9K\xe2\xddt\xb7\xd1x\x80\xf7U\xcf'D;\x1f7\x1a\xff\xae7\x1a;_\x22\xff\x16\xd1e\xf3?Y\x00qxl\x1b+\x13\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x15\x12IDATx\x01\xed\x9c\x09\x94\x15ev\xc7\xab\xea\xed\x8f^\xe8f\x07em\x14e\x11\x0f\x02\x01\xa1\xbb\x05\x141\xa8d\x94\x83\xa8\x18\x97\x13\x8f\x991:\xe8\x19\x97\x99\xe38N\x9cq\xd4q\x99hLBfF4\xca\x8c\xc11\x9e@tp\x90\xd3\x0b\x88\x08\x18$\x8a\x86\x1ddm\x18\xb6^\xde^\x95\xdf\xad~\xf5\xac\xb7\xf5{\xaf\x17\x14Lq\x8a\xfa\xea\xfb\xeew\xbf{\xff\xdf\xbd\xf7\xdb\xea\xb5j\x18\x86\xf2\xffWa\x088\x0b#\xef|\xea}\xfb\xf6\xf9v\xee\xdcY\x01\xe7~\xdcE\x1a\xb7\xae\xeb>M\xd3\x02\xba\xa249\x0c\xa31\xa6\xaa\x87\x86\x0e\x1d\xba\xfd\x9cs\xce\x09t\xbe\x04\x85sTO\xa7\xa5\x09@\xbb\xb7o\x9f\xa88\x9dUF,6\x05\x1b\x1f\xa1\xaa\xea\x00dPs\x89\x0e\x1dd\xc6~EU?\x07\xd05J4Z;\xb8\xa2b\xdd\xd7\x01d\x97\x83\xb6y\xf3\xe6n\xa7\x8e\x1f\xbf\x06\x80nD\xe1+P\xdcm\x07\x080\xc2\x94\xed$\xefK\x05\xab\x82\xa6\xc9\xb42\xac\x8d\xf7\x22\xde\x8b);\x17T\x87f\xaa\x0b\xcd{\x94-))+\xfb\xcf1c\xc64\xdbywU\xba\xcb@\xab\xab\xab\xbb\x00\xe6?0Tu\x1e\x8a\xf9E\x01\x00\xd2\x01h\x93\xaa\xebu1E\xa9\xf5\xfb\xfd\x9fL\x980a\x0fExb\xceK\xfb\xe8\xa3\x8f\x06\xb5\xb4\xb4\x5c\xe4P\x94*C\xd3*\x01k,@\xe2\xd1\xe6\xd5\xcc\xfb\xbf\xd3\xde\xd3\x95\x95\x95\x9f\xe7\xe4\xd6\x01\x82N\x07m\xf5\xea\xd5\x13\xf5X\xec\x87\x00t5\x0a\xf1\xa0\x09E\xf9\x80\xf4\x12,h\xe9\xd4\xa9S\x8ft@\xde\xa4\xaa\xf5\xf5\xf5\xbd\x88\x7fsi\xe3F\x00\x9b\x9ch\xcf0\x96i\x0e\xc7\xcf\xa7L\x99\xb2.\xa9B'\xbdt\x1ah\xeb\xd7\xaf\xef\x1bliy\x0as\xbaY\x84G\xbe\x00\x16\xf6[\x7fQ\xd1\xb3\x97\x5cr\x89\xb8_\x97^\x1b6l\x18\xda\xd2\xd4t\x1f\xed\xdfNC>\xe9,\xda\x7f\xcd\xeb\xf7?0~\xfc\xf8C\x9d\xd9xg\x80\xa6\xd2\xe3\xf7\x1a\xba\xfeS\x04\x93\xf8\x13\x04\xb1g\x15M{\xbe3\xad*_\xa5\xc5\xfa\x14]_\x88u/\xa4\x8e\x97\xbbQ\xd5\xb4\x1f#\xcb\xafH\x93\xdd\xf1\xabC\xa0}\xf0\xc1\x07\xbd\xa3\xd1\xe8\xbf\xd1\xa3W\x88(H\xf4\xb6\xcf\xe7\xbb\x8f8\xb5\xab\xe3\xa2u\x8c\x03\xf1oH \x10x\x96\x0e\x9ccrR\xd5\xf7\x9cN\xe7\x82\xc9\x93'7t\x8c3\xb1\x19Wj\x17\x0f\x02\xfd4\xc0z\x9d\xca}q\x85#\xb8\xc5m\xf4\xe6\x7f\xb5\x8bY\x17V\x22\xc6\xce\xc6\x0b~\x8b\x9e\xbdh\xe6\x10r\xde\xc4@\xb1\xaa#MZ#OA<\x10d\x01\x80\xad\xa0\x92\x00\xb6\x0aA.\xfa&\x02&J1\x18,\x17\xf9L9\x91W\xe46\xe5/H\xe3d\xe2\x82-\x8d\x98\xf1\x03\x1a~\xd2\x0c\xf6\xaa\xfa\x0bz\xedG\xb0\xccg\xca\x90\xdc\xf2\xe9\x7f\xd3\xf0\x8e\x9f!\xfbC\xe6 \xa1\xaa\x0f\xd2\xd1O\xb7G\x8c\x82,mMm\xedc\x98\xfaS4$\xc3\xe3=\x00\xf60\xe93\x010\xc1F\x17yEn\x91_\xf4\x10}\xa4\xa0\xd0+oK\xa3\x97\xbeGS/\xd2@\x14s\xbf\x19\x01\xde(\xb4\xb1o\x0a=\xba\xc8\x84\xfb5\xe4q\xa2\xcb\xdd\xe8\xf2\x8f\x85\xc8\x96\x17h\xf555\xd73\x85x\x03\x97\xd4h\xe4V\x1ay\xa5\x90F\xbe\x89\xb4\x00\xf7\xd7\x00\xb7\x18W\xd5\x99\xa2\xcc\x9bZ]\xfdf\xber\xe6\x04\x8d\x186\x06S\x96\x99\xb5WS\xd5\x87\xa6TV>\x99/\xf3o:\xdd\xea\xba\xba\x07u\xc3\xf8\x05r\x06\x99\xcbM$\xc6m\xceG\xe66c\x9a,\xb6\xb1.qC/\xb1\xe0_\xcf&\xc0\x04\x1c\xd1G\xf4\x12\xfdDO\xd1W\xf2s]m\x82v\xf2\xf8\xf1\x170\xe1\x11\xcc\xe4>\x1d2l\xd8\xbd\xb9\x98\x9d\x89\xe5\xa2\x97\xe8'z\x9a\xfa\xe6\xa1DV\xd0\x98\xcb\x5c\x09\xb3\xdb\x88a-,\xb4\xe7}\x1d\xfbVy\xc8\xdfa\x12\xd1K\xf4\x13=E_\xd1;\x17\xd3\x8c\xa0m\xd9\xb2\xc5\xcdN\x85\xac\xd5\x14\xcd0\x1e\xc1\xd7\xb7\xe4bt&\x97\x8b~\xa2\xa7\xe8 z\x8b\xfem\xe9\x93\x11\xb4?\x1f9\xf2}*\x9d\xc7\xc8\xf2\xb9\xaf\xa8\xe8\x85\xb6\x18\x9c-e\xa2\xa7\xe8+z\xc7\xf5\xcf\xaaZ\xda\xe8\xb9r\xe5\xcaR\xb7\xcb\xb5\x97\x1a%\xecI]\xce2de\xd6\xdagY\x01\xae9\x03K\xfb\x13j\x9d\x0aG\x22\x03g\xcc\x98q2\x93\x8ai\x96\xe6v\xbb\xff\x16\xc2\x12F\x95\x95\xdf&\xc0\x04\x1c\xd1W\xf4\x16\xfd\xe38Hv\xda\x95\x04\xda\xf6\xed\xdb=\x8c\x22\xe6(\xa9:\x1cg\xcd|,M\xeb62\x12z\x83\x83\x89G\x06\xda$\xd0\x0e\x1c8p\x034}\x19I>\xfe\xb6Y\x99\x85\x8d\xa97\xfa\x0b\x0eq<\xac\xa2\xc43\xe9\xdc\x93\x00w3\xc3.+&\xad\xa0\xb5X\x82[\x91J\xdc\xd6\xfb\xc6\x8d\x1b]\x9c\x14]\xecP\xd5\xcb@}T$\x14\x1a\xe8t8J\x14\x87\xc3\x85\xcb\xab\xa4\x15\xf8\xb2o\x1f\xe3\x9f\x1a\x86W\xa3\x11\x8d\xeew\xba\x5c\x1b5\xa7\xf3\xad\x15+V\xec}\xf4\xd1G\xf3\xda1\x81\xb6\xbc\xb8\xb8xR,\x16\x9b\xce\x12o,\x03W\xdf\x98a\xf4\xa4\x83\xca\x1d\x9a\xc6a\x15\xbb\xab\x9a\x16\xc2\x22\x8es\xb4s\x0c\xa6\x879\x80\xf9\xcc\xe1p\xd4\xb8\xc2\xe15\xe3\xab\xab\x05\xcc\xac\x00\xd2\xe9\xdd\xe1#u\x1c^\x9fo\xc0\xc4\x89\x13\x85>q%@cQ~7\x0d\xbc\x00\xa7\xb7\xab\xaa\xaa\xfe*A\x91#\xf1\xd8c\x8fi3g\xce\x1c\x88\x02wbNW9\x9c\xce>\x8c@%\xf4\xba\x87!\xdcT \x95\x05K\x16pUu\xf4\x0b\x12\x1fN\xd2\xeeZ\xd6\x80\xafb\x91+s\x9c]:V\xadZUE\x90\xbe\x09\x00&\x22|\xffH4Zb\xb6\x03\xcfT\x14\xc87\x9b\xe6\x19\xc5\x18\x9ay6@\xbf\x13+\xbf\xb6\xa2\xa2\x22\x94*\x97\xfd\xbd\xb6\xb6\xf6?\xa8=\x876\xfe\x8e\xc5\xbc\xec\xee$\xae\x84{\x22\xf8\xe5\x92\x8b0o%Js'4v<\x86\xd3#\x8f\xbb\x1c\x8ej\x86\xe9\x9eF8\x9c\x10^\xc0\xc9vat\x9a\xa1G\xfd\xb8\x81\x1f\x85f\x11G\xcf9y\xf2d1\x16\xfb\x16.\xdb\x92Zo\xe9\xd2\xa5E\xbd{\xf7^\x00\xb0\x0bb\xd1\xe8(=\x1a-\x82\xbb\x89J\xb6v\xac|\x9eN\xeeRx\x96Ra\xb0\xd7\xebM\x8a\xe5\xa9m\xc9\xbb\xe0@\xe7\xcf\x89\xe3\x92\x114:A\x9d*\x8d\xf0\xac\xcd\xc4$S\xde\xc6\x9a\x9ar\x98\xdf\x87)_E\x0f\xfa\xa5\xbe\x1d&\xc0\x90\xf8(\x02\x98\xd5\xb1>vat\xbc\xb5\x95\xca\xfc\x9f4y>\xa7\xa6]\xcc\xbc\xf0\xf6`0(\xae \xc3~\x82\x15\xee\xe2\xed\xd3\xa7\xcf]^\x8f\xe7\xf6h(4\x1c\xabt&\x0a3\x09\x96!\xcfj\x93\x223\xe6e I\xca\xb2p\x10\x5c(\x90\xceI4i\x22\xce\xf6\xcfh\x98\x96A\xb0\xfb\xd2K/\xdd\x9bT;\xcb\xcb\xbb\xef\xbe\xebidj\x03(\xb7\x00\x86_\xc0\xb0_\xf0\x92\xd7cF$\xb2<\x14\x0e\xbf\x18\x0d\x87_\xa6\xe7>&?\x028vR\x13\xc4\xa8\xae\xbb\xe01\x059n`\x929\xc4F\xa0\x11\xfbfz\x5c\xae\xbb\x89Y#\x88]\x19\x01\x93\x8e\xf1\xb8\xdd\x0a\xae\xcb\xa7\x22NEb\xa8\xa4=\x1e\x8fB\xc8P\xd8\xd6\xb2\xb1\xcc\x9d\x14\x1c\x04\x0f\xc1E\xf0\xb1\xd70\xdd\x93\xd0?\x1e7\x91\xfc5\xf6\xc2\xb6\xd2\xbeP\xc8\xe7\xe9\xde\xbd\x0a\x0b\xf1\x06C\xc9\xe1A8\x01\xcc)\xe2\xdc\xe3\x98\xdak<#\xaa\xd3\xa9J\xbcC\x88\x9b\x89\x13\xf79\xddn\x9f\xf0\x17p\xc9\x935\x9f\xc2\x1c\xc9\xc9\x87-\xe3\xa2\x91\xc8X\x8avJ9\x9b\x85#=~\xff|\x06\x91s\x015Ms\xe9\x00\xf8\x09\x8f]\xe1Ph#f\xbd\x09_<\xa6\xb8\x5cJ4\x16\xeb\x89\x1b\x0f\xa1\x8d\x91X\xe7\x08@,\xe6\x99\xc6C\xda\xc9r\x09\x1e\x83\x05\x1f\x9e\x89\xbd6\x13\xb4\x98\xa6\x0d\xa7U\xb1\xc1/\xb2TN\xcb\x0ex<.w4Z\xa1#\x5c\xda\xd5\xda\x01\x81\xe6\xe6\xe6\xd5W^ye\xe23\x04\x06\x8d\x93\x97]v\xd9\xeb(\xd9\x87\x18x\x01\xf1\xaf\x81\xb6\x1b\x18q\xf7ciG\xc9?\x8a55`)[\x85\xe7\xee\xdd\xbb\xbd(<\x1d\xd9\xaa\x01,-\x0e\x89E\x81\xfan\x00[\x0c`o\x97\x94\x94\xec\xff\xe4\x93OB\x17]t\x11\x9f\x8a0\xd7hhp\x94\x97\x97;eP\x82f\x18\xfe5\x8d\xe7,&\xad\x06\xbb\x1bB\xd2\xe6%x\x88O\x9a\xf8\xd8([\x07\x02\xc3\x18.y8\xd86[Y\x9bI\x02\xb2\xd0\xbb\x92\x1d-^\x85\x0e@\xd1\x12>p\xb9u]}}\xc8WZ\xbaCF\xc5\xf8\x94b\xeb\x8a\xa5K\x1f\xec>p\xa0+\xa8\xeb1gcc\xecH,\x16\x1d0`@\xac\xb4\xb44\xc6`\xa0/_\xbe<\xc6\xce\x83r`\xf7\xee\x0a\xa7\xc73\x19^\xbdQ6I\x9ex\x9c\xdc\xa4\xc4b?mln\xae\xfd\xf0\xc3\x0fO\x08\x7f\x06\x91\x04\x9d=M\x5c<\xca\xdcqs\x8f\x1e=~\xc3t*\xd95\x125\x92\x13\x09<\xe2\xf8X\xa5&h *\xbd A{\xbbU\x90\xeb\x89\x05HT\xdf'\x81>\xf5\x12^X\x86\x8f\x01\xe2oB\xb1\xd8\xbc\xd0\xf1\xe3{\x89S\xbb\xa2zt\xaf\x1a3\xbe\x04\xb0\x1d\xe1px\xd7\x89\x13'\xf6\xce\x993'm>h)\xcb\xfc\xce\xe7\xf5N\xd0#\x91>2\x10\xd8/qU:H\xa6+\xa3\xb1\xbc\xd1L\x88\xcd\xf9\x93\xd0\xa5\xd2\xda\xeb\xe5\x93\x16<\x04r\xc1\xc7NoJ\x89\xd5l\xa0e\x19\xa5.\xa0g{\xda\x09\xb2\xa4\x0d\xc0:\x88k(j\x12\x13\xff\xc5\xc4#\x83\xceI\xa0I9\xf1\xe19*\x84\xf9\xeab\xae|\x0e\x9f\xa1\xceY\x9b%\xfa2u\xbe^\xf4\xe7\x1b\x93\xe7\xb3)\x9a\x06\x1a\xf3\xaf\xfd\xf8\xe9KT\x94\xd3\x8b\x17\xb2U<+\xf3\xd17\xae\xf7K&\x0eY\x94L\x03M\xe8B\x9c\xf2P\xb9\x81\xe1\xbarum\xed\xfc,u\xcf\xaal\xd1S\xf4\x15\xbdE\xff\xb6\x94\xcb\x08\x9a|k\xcaD\xf3!\xa9\xc8\xfc\xe69\xf9\x0c\xab-&gz\x99\xe8'z\x8a\x1e\xa2w\xb6om-=3\x82&\x85|\x11\xb8\x98Y\xe2J\x90\xef\x13\x0e\x06_\x13~V\xa5\xb3\xec\xa9\x8a~\xa2\xa7\xe8+z\xe7\xd2/+hT4\xf8\xd1\xfc\x82\xb8\x9b\xce\xa8\xad\xaf5-/\x17\xc33\xad\x5c\xf4\xc2-g\x88\x9e\xa2\xaf\xe8\x9dK\x87\xb6@S\xcc\xbf2\xa0\xaa\xb7\xc0\x90\x8f\xc9\xd4\xc7\xf9\xcd\xfau\xb9\x18\x9eI\xe5\xa2\x8f\xe8%\xfa1\xc7\xb8%\xdf\xbf\xaa\xd0&h\x02\x00\x0b\xe8\x15@\xffC\x96)\x1a\xbb\x15\xaf\xaf\xae\xa9\xa9>\x93\x80\xc9&\xab\xe8!\xfa\x88^\xa2\x9f\xe8\x99\x8d65?i\xed\x99Zh\x7fg]\xfa+V\x0a\xf7\xd0\xc0I\x8e\xd8\xae\x984u\xaa\x9c\x04\x9d\x91\xd7\xda\xfa\xfa\x09\x9ce\xc8\x9f\xdb)\xc5\xc2\xfe\x81\xf5\xe5\xbd\x85(\x927h0U\xebkk\x96`\xc77\x90nf\x94\xb9\xae\x90\xde)D\xa8\xae\xa4e\x02;\x93]\x96?\xd0F7\xbe\x8c\xfb\xfd\xd4\xaa\xea\x1bI\xe7\x8ccv\x99r\xba\xa7\x8d\xd8\xa0\x81\x05\xf4\xceb\xf2\xe4w\xa0\xcb\xd8\xf2\x96\xc0y\xc6\x5c\x22\xaf\xc8\x8d\xc0\x00\xa6\xbc,\xfa\x90.\x080Q\xb6\x10K\x13z\xf3\xc2U\x9f\xc0U[GSU}i\xe0\xc0\x81\xf7\x17\xb2\xfff\xf19]Os\x7fl\xef\xdeg\x90\xf9\xbbf\x9b\xad\x7f\xe5\xe1\xe1\xf6\xb6\xdf.\xd0\xa41\xcc\xfc.\x84x\x9e\x9e\x93\x0fU6\xb3\x018\x8f\x05\xee\x17\xed\x15\xa4\xab\xea\xb1\xd7?\x82S\x17\xf9\xfd\xfd\x18\xe4\x0c\x11\xc3\xbeOX\xf9\xe7\x8e\xb4\xd7n\xd0\xa4Q\x86\xec\xb1\x9cH\xbdARvjC\x80\xf8\x0c\x1f\x97\xfc\x8c}.\xd9K\xfbZ/6(\xfd\x9c\xbb\xfe\x08\x90\xee\x97\x8eE\x98\xad,\xc2\xe7\xf1gs\x92N\x96\xda#d\x87@\x93\x069\xcb,\xe2\xe0\xf89\xf6\xea\xef@8B\x05\x9f5\xa8\xea\xc3\x8cH\xbf'\x1d\x13\x9a\xd3|9\x08\x1f7\xd0\x81O\xd0\xee\xb92\x07c\x83\xfd7\xfc\xe4h!\xbb\xc4I\xdfd\xb4W\xae\x0e\x83f5L\x90\x95\xbf\x9b\xf6\x22\xef\x97\xc4\xf3v\x12a\x9f\x196l\xd8\xcb\xa7\xe3\xa7\xdc\xf2\xa7\x13w\xec\xd8q\x1b\xbdv?\xed\x0f\x8d\xcb\xb0\x81\x03\x8a\xbbY\x1a\xad\x8b\xbfw\xca\xa3\xd3@\x8bK\xa3\x11\xebnaH\x97 {^[i\xef\x09\xda{\x95\xf7\xcel\xcfd\xdf\xd9\xa0\xc5eV4\x5cd\x0e/\x0f\xe0&\x89\x83\x09\x5c\xe5\x00\xef\xefs~WG\xba\x0e\x0b\x90\xe3\xfeB\x86|\x15\x8b\x1eN\x18\xa8d\xaf\xaf\x9200\x9dt\x7f\xabQ\xde\xc5\xa2\x9e\x224\xbc\xcd\xb3\xd3\xc1\xb2\xda\xe9*\xd0,\xfe\x0a\xdf\xd1\x8e\xe4xn>`\xcd'\xd3r\x9b\xd6rN\xafq\xa7\xed\x00 \xe0}\xc9\x81F\x13\x025\x92\x0ep\xfb8\x11*\xe6\x98N\xbe\x99;\x17\xa0\x87\x83n\x05|\xe4+%\xfb\xb5\x13\xb0~G'\x88%o\xb1\x17tU\xba\xcbA\xb3\x0b\xceh;\x8a\xe3\xbc*\x14\xacB\xf9K\x93\xac\xc4N\xd8F\xda\xb4VU]C\xddZN\xebj\x19\x0d?m\x83\xbcK\x8aN+h\xa9\x1a\xf0\xcb\x91\x12\xbe\xd7\x15w\x93O\xbc\xfa\x22L\x91X\x17\xa7@\xe6\x1f\x07\x16\xab\xe3\xbd\x89\xb2C\x80\xb5\xado\xdf\xbe\xdb\xf8\xc9a\xd2\x07v\xa9 Building " $2 + + # compile ui to python + $1 $2 > $UI_PYTHON_PATH/$3.py + + # replace PySide imports with tank.platform.qt and remove line containing Created by date + sed -i "" -e "s/from PySide import/from tank.platform.qt import/g" -e "/# Created:/d" $UI_PYTHON_PATH/$3.py +} + +function build_ui { + build_qt "pyside-uic --from-imports" "$1.ui" "$1" +} + +function build_res { + build_qt "pyside-rcc" "$1.qrc" "$1_rc" +} + + +# build UI's: +echo "building user interfaces..." +build_ui dialog +# add any additional .ui files you want converted here! + +# build resources +echo "building resources..." +build_res resources \ No newline at end of file diff --git a/resources/dialog.ui b/resources/dialog.ui new file mode 100644 index 0000000..b41ad93 --- /dev/null +++ b/resources/dialog.ui @@ -0,0 +1,116 @@ + + + Dialog + + + + 0 + 0 + 431 + 392 + + + + Report a bug! + + + + + + + + Subject: + + + + + + + + + + + + 0 + + + + + CC: + + + + + + + + + + 0 + 1 + + + + + + + + 5 + + + 0 + + + + + + 50 + 50 + + + + + 50 + 50 + + + + border: 1px solid grey + + + + + + Qt::AlignCenter + + + + + + + + 16777215 + 16777215 + + + + Take a screenshot! + + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + diff --git a/resources/resources.qrc b/resources/resources.qrc new file mode 100644 index 0000000..87cde17 --- /dev/null +++ b/resources/resources.qrc @@ -0,0 +1,5 @@ + + + sg_logo.png + + diff --git a/resources/sg_logo.png b/resources/sg_logo.png new file mode 100644 index 0000000..69308db Binary files /dev/null and b/resources/sg_logo.png differ diff --git a/style.qss b/style.qss new file mode 100644 index 0000000..6b676ad --- /dev/null +++ b/style.qss @@ -0,0 +1,21 @@ +/******************************************************************************************** + +QT Stylesheet for the app. This file will be read every time an app dialog is created via +the show_dialog, show_modal or show_panel methods. + +Certain keywords will be resolved, for example {{SG_HIGHLIGHT_COLOR}}. +For a full list of keywords, call the app.style_constants property at runtime. + +For more info about QT stylesheets, please see http://doc.qt.io/qt-4.8/stylesheet.html + +********************************************************************************************/ + + +/* Example: + +QListView, QTableView, QScrollArea { + border: 2px solid {{SG_HIGHLIGHT_COLOR}}; +} + +*/ +