Example #1
0
class Ui_Main(QtGui.QMainWindow, ui_main.Ui_MainWindow):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent=parent)
        self.ui_settings_dict = {}
        self.created = False

        self.create_debuglog_widget()

        if env_mode.is_offline():
            self.create_ui_main_offline()
        else:
            self.create_ui_main()

    def create_project_dock(self, project_code, close_project=True, raise_tab=False):
        if project_code not in self.projects_docks.keys():
            project = env_inst.projects.get(project_code)
            if project:
                if not project.is_template():
                    dock_widget = QtGui.QDockWidget(self)
                    dock_widget.setObjectName(project_code)
                    dock_widget.setWindowTitle(project.info.get('title'))
                    dock_widget.setMinimumWidth(200)
                    dock_widget.setFeatures(
                        QtGui.QDockWidget.DockWidgetMovable | QtGui.QDockWidget.DockWidgetClosable)

                    main_tabs_widget = Ui_mainTabs(project_code, dock_widget)
                    dock_widget.setWidget(main_tabs_widget)

                    self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, dock_widget)
                    for dock in self.projects_docks.values():
                        self.tabifyDockWidget(dock, dock_widget)

                    self.projects_docks[project_code] = dock_widget

                    dock_widget.show()
                    dock_widget.raise_()
            else:
                print('No project with code: {0}'.format(project_code))

        elif close_project:
            self.projects_docks[project_code].widget().close()
            self.projects_docks[project_code].close()
            self.projects_docks[project_code].deleteLater()
            del self.projects_docks[project_code]
            env_inst.cleanup(project_code)

        if raise_tab:
            project_dock = self.projects_docks.get(project_code)
            if project_dock:
                project_dock.show()
                project_dock.raise_()

    def create_ui_main_offline(self):
        self.projects_docks = collections.OrderedDict()

        env_inst.ui_main = self

        self.setupUi(self)
        self.setWindowTitle('TACTIC handler (OFFLINE)')

        # instance attributes
        self.menu = None
        self.menu_bar_actions()
        self.menuProject.setEnabled(False)
        self.readSettings()
        self.setIcon()

        self.customize_ui()

    def create_ui_main(self):
        self.projects_docks = collections.OrderedDict()

        env_inst.ui_main = self

        self.setupUi(self)
        self.setWindowTitle('TACTIC Handler')
        self.customize_ui()

        # instance attributes
        self.menu = None
        self.mainwidget.deleteLater()
        self.query_projects()
        self.menu_bar_actions()
        self.menuProject.setEnabled(True)
        self.readSettings()
        self.setIcon()
        self.create_script_editor_widget()
        # self.create_messages_widget()

        self.created = True

    @staticmethod
    def execute_after_all_ui_started():
        # This func is executed after all ui started. File execute_after_start can contain any useful code that
        # should be executed after ui loaded

        from execute_after_start import execute

        execute()

        env_api.start_api_server_app()

    def create_debuglog_widget(self):
        env_inst.ui_debuglog = Ui_debugLogWidget(self)
        env_inst.ui_debuglog.setWindowState(QtCore.Qt.WindowMinimized)

        env_inst.ui_debuglog.show()
        env_inst.ui_debuglog.hide()
        env_inst.ui_debuglog.setWindowState(QtCore.Qt.WindowNoState)

    def create_script_editor_widget(self):
        env_inst.ui_script_editor = Ui_ScriptEditForm(self)

    def create_messages_widget(self):
        env_inst.ui_messages = Ui_messagesWidget(self)

    def create_info_label(self):
        self.label_layout = QtGui.QVBoxLayout(self.menubar)
        self.label_layout.setContentsMargins(0, 0, 6, 0)

        self.info_label = QtGui.QLabel()
        self.info_label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
        self.info_label.setText('')
        self.label_layout.addWidget(self.info_label)

    def set_status_text(self, text=''):
        self.setStatusTip(text)

    def set_info_status_text(self, status_text=''):
        self.info_label.setText(status_text)

    def check_for_update(self):
        if uf.check_need_update():
            self.info_label.setText('<span style=" font-size:8pt; color:#ff0000;">Need update</span>')

    def setIcon(self):
        icon = Qt4Gui.QIcon(':/ui_main/gliph/tactic_favicon.ico')
        self.setWindowIcon(icon)

    def customize_ui(self):
        if env_mode.get_mode() == 'standalone':
            self.actionDock_undock.setVisible(False)

        self.actionExit.setIcon(gf.get_icon('window-close', icons_set='mdi'))
        self.actionConfiguration.setIcon(gf.get_icon('settings', icons_set='mdi'))
        self.actionSave_Preferences.setIcon(gf.get_icon('content-save', icons_set='mdi'))
        self.actionReloadCache.setIcon(gf.get_icon('reload', icons_set='mdi'))
        self.actionApply_to_all_Tabs.setIcon(gf.get_icon('hexagon-multiple', icons_set='mdi'))
        self.actionScriptEditor.setIcon(gf.get_icon('script', icons_set='mdi'))
        self.actionDebug_Log.setIcon(gf.get_icon('bug', icons_set='mdi'))
        self.actionUpdate.setIcon(gf.get_icon('update', icons_set='mdi'))
        self.create_info_label()

    def menu_bar_actions(self):
        """
        Actions for the main menu bar
        """

        def close_routine():
            if env_mode.get_mode() == 'maya':

                self.close()

                from thlib.ui_classes.ui_maya_dock import close_all_instances
                close_all_instances()

                # Removing path from sys, so we can run other instance from different path
                import sys
                sys.path.remove(env_mode.get_current_path())

            if env_mode.get_mode() == 'standalone':

                self.close()

        self.actionExit.triggered.connect(close_routine)

        self.actionConfiguration.triggered.connect(self.open_config_dialog)

        self.actionApply_to_all_Tabs.triggered.connect(self.apply_current_view)
        self.actionReloadCache.triggered.connect(self.reload_cache)

        self.actionUpdate.triggered.connect(self.update_self)
        self.actionScriptEditor.triggered.connect(self.open_script_editor)
        self.actionDebug_Log.triggered.connect(lambda: env_inst.ui_debuglog.show())

        # User Menu items
        self.actionMessages.triggered.connect(lambda: env_inst.ui_messages.show())
        self.actionEdit_My_Account.triggered.connect(self.edit_my_account)

        self.actionDock_undock.triggered.connect(self.undock_window)

    def undock_window(self):
        env_inst.ui_maya_dock.toggle_docking()

    def edit_my_account(self):

        print 'Edit my Account'
        from thlib.ui_classes.ui_addsobject_classes import Ui_addTacticSobjectWidget

        login_stype = env_inst.get_stype_by_code('sthpw/login')
        # parent_stype = self.parent_sobject.get_stype()
        # search_key = self.parent_sobject.get_search_key()

        # print search_key

        add_sobject = Ui_addTacticSobjectWidget(
            stype=login_stype,
            parent_stype=None,
            # search_key=search_key,
            parent_search_key=None,
            # view='edit',
            parent=self,
        )

        add_sobject.show()

    # def create_ui_float_notify(self):
    #     self.float_notify = ui_float_notify_classes.Ui_floatNotifyWidget(self)
    #     self.float_notify.show()
    #     self.float_notify.setSizeGripEnabled(True)

    def open_script_editor(self):
        env_inst.ui_script_editor.show()

    def update_self(self):
        if env_mode.is_online():
            self.update_dialog = Ui_updateDialog(self)

            self.update_dialog.show()

    def reload_cache(self):
        tc.get_all_projects_and_logins(True)
        for project in env_inst.projects.values():
            project.query_search_types(True)

        if env_mode.get_mode() == 'maya':
            self.restart_ui_main()
        else:
            self.close()
            gf.restart_app()

    def open_config_dialog(self):
        conf_dialog = ui_conf_classes.Ui_configuration_dialogWidget(parent=self)
        conf_dialog.show()

    def restart_for_update_ui_main(self):

        if env_mode.get_mode() == 'maya':
            # import main_maya
            # thread = main_maya.main.restart()
            from thlib.ui_classes.ui_maya_dock import close_all_instances
            close_all_instances()
            # self.restart_ui_main()
        else:
            self.close()
            gf.restart_app()

        # if env_mode.get_mode() == 'standalone':
        #     import main_standalone
        #     thread = main_standalone.restart()
        #     thread.finished.connect(self.close)
        # if env_mode.get_mode() == 'maya':
        #     import main_maya
        #     thread = main_maya.main.restart()
        #     thread.finished.connect(main_maya.main.close_all_instances)

    def restart_ui_main(self, server_preset=None):
        if server_preset:
            new_server_preset = env_server.get_cur_srv_preset()
            env_server.set_cur_srv_preset(server_preset)

        # Closing main app itself
        self.close()

        # Closing server api
        env_api.close_server()

        if server_preset:
            env_server.set_cur_srv_preset(new_server_preset)

        if env_mode.is_online():
            self.create_ui_main()
        else:
            self.create_ui_main_offline()

        self.show()
        return self

    def apply_current_view(self):
        # TODO may be need to be rewriten to use env instance
        if env_inst.get_current_project():
            current_project_widget = self.projects_docks[env_inst.get_current_project()].widget()

            current_project_widget.ui_checkin_checkout.apply_current_view_to_all()

            # widget_name = current_project_widget.main_tabWidget.currentWidget().objectName()

            # if widget_name == 'checkInOutTab':
            #     current_project_widget.ui_checkin_checkout.apply_current_view_to_all()
            #
            # if widget_name == 'checkOutTab':
            #     current_project_widget.ui_checkout.apply_current_view_to_all()
            #
            # if widget_name == 'checkInTab':
            #     current_project_widget.ui_checkin.apply_current_view_to_all()

    def fill_projects_to_menu(self):

        all_projects_dicts = []

        for project_name, project in env_inst.projects.items():
            if project.get_code() != 'sthpw':
                all_projects_dicts.append(project.info)

        projects_by_categories = gf.group_dict_by(all_projects_dicts, 'category')

        for cat_name, projects in projects_by_categories.items():
            if cat_name:
                cat_name = gf.prettify_text(cat_name, True)
            else:
                cat_name = 'No Category'
            if cat_name != 'Template':
                category = self.menuProject.addMenu(cat_name)

            for e, project in enumerate(projects):
                if not project.get('is_template'):
                    project_code = project.get('code')

                    menu_action = QtGui.QAction(self)
                    menu_action.setCheckable(True)

                    if self.opened_projects:
                        if project_code in self.opened_projects:
                            menu_action.setChecked(True)
                    menu_action.setText(project.get('title'))
                    # Don't know why lambda did not work here
                    menu_action.triggered.connect(partial(self.create_project_dock, project_code))
                    category.addAction(menu_action)

    def restore_opened_projects(self):
        if self.ui_settings_dict:
            self.opened_projects = self.ui_settings_dict.get('opened_projects')
        else:
            self.opened_projects = None
        if not isinstance(self.opened_projects, list):
            if self.opened_projects:
                self.opened_projects = [self.opened_projects]

        if self.opened_projects:
            for project in self.opened_projects:
                if project:
                    self.create_project_dock(project)

            current_project_code = self.ui_settings_dict.get('current_active_project')

            if current_project_code:
                if self.projects_docks.get(current_project_code):
                    self.projects_docks[current_project_code].show()
                    self.projects_docks[current_project_code].raise_()

    def get_settings_dict(self):

        settings_dict = {}

        if self.windowState() == QtCore.Qt.WindowMaximized:
            state = True
            if self.ui_settings_dict:
                settings_dict['pos'] = self.ui_settings_dict['pos']
                settings_dict['size'] = self.ui_settings_dict['size']
            else:
                settings_dict['pos'] = self.pos().toTuple()
                settings_dict['size'] = self.size().toTuple()
        else:
            state = False
            settings_dict['pos'] = self.pos().toTuple()
            settings_dict['size'] = self.size().toTuple()
        settings_dict['windowState'] = state

        if self.projects_docks.keys():
            settings_dict['opened_projects'] = self.projects_docks.keys()
            if env_inst.get_current_project():
                settings_dict['current_active_project'] = str(env_inst.get_current_project())
        else:
            settings_dict['opened_projects'] = ''
            settings_dict['current_active_project'] = ''

        return settings_dict

    def set_settings_from_dict(self, settings_dict=None):

        if not settings_dict:
            settings_dict = {
                'pos': self.pos().toTuple(),
                'size': self.size().toTuple(),
                'windowState': False,
                'opened_projects': '',
                'current_active_project': '',
            }

        self.move(settings_dict['pos'][0], settings_dict['pos'][1])
        self.resize(settings_dict['size'][0], settings_dict['size'][1])

        if settings_dict['windowState']:
            self.setWindowState(QtCore.Qt.WindowMaximized)

    def readSettings(self):
        self.ui_settings_dict = env_read_config(filename='ui_settings', unique_id='ui_main', long_abs_path=True)
        self.set_settings_from_dict(self.ui_settings_dict)

    def writeSettings(self):
        env_write_config(self.get_settings_dict(), filename='ui_settings', unique_id='ui_main', long_abs_path=True)

    def closeEvent(self, event):

        # Closing server api
        env_api.close_server(self)

        for dock in self.projects_docks.values():
            # project_code = dock.widget().project.get_code()
            dock.widget().close()
            dock.close()
            dock.deleteLater()
            del dock
            # env_inst.cleanup(project_code)

        self.writeSettings()

        event.accept()

    def query_projects_finished(self, result=None):
        if result:
            self.restore_opened_projects()
            self.fill_projects_to_menu()
            env_inst.ui_main.set_info_status_text('')

            self.execute_after_all_ui_started()

    def query_projects(self):
        env_inst.ui_main.set_info_status_text(
            '<span style=" font-size:8pt; color:#00ff00;">Getting projects</span>')

        def get_all_projects_and_logins_agent():
            return tc.get_all_projects_and_logins()

        env_inst.set_thread_pool(None, 'server_query/server_thread_pool')

        projects_items_worker = gf.get_thread_worker(
            get_all_projects_and_logins_agent,
            env_inst.get_thread_pool('server_query/server_thread_pool'),
            result_func=self.query_projects_finished,
            error_func=gf.error_handle
        )
        projects_items_worker.start()
Example #2
0
class Ui_Main(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent=parent)
        self.ui_settings_dict = {}
        self.created = False
        self.app_closing = True

        self.create_ui_raw()

        if env_mode.is_offline():
            self.create_ui_main_offline()
        else:
            self.create_ui_main()

    def create_ui_raw(self):
        self.setObjectName("MainWindow")
        self.setWindowModality(QtCore.Qt.ApplicationModal)
        self.resize(820, 800)
        self.setMinimumSize(QtCore.QSize(600, 600))
        self.setStyleSheet(
            """
            QSplitter::handle {
                border: 0px;
                background: transparent;
                margin: 0px 0px 0px 0px;
            }
    
            QSplitter::handle:horizontal {
                width: 4px;
            }
    
            QSplitter::handle:vertical {
                height: 4px;
            }
    
            QSplitter::handle:pressed {
                border: 0px;
                background: rgb(128,128,128);
            }
            QSplitter::handle:hover {
                border: 0px;
                background: rgb(128,128,128);
            }
            QMainWindow::separator
            {
                width: 4px;
                border: 0px;
                background: transparent;
            }
            QMainWindow::separator:hover {
                border: 0px;
                background: rgb(128,128,128);
            }
            """
            "QTabWidget::pane {\n"
            "    border: 0px;\n"
            "}\n"
            "QTabBar::tab {\n"
            "    background: transparent;\n"
            "    border: 2px solid transparent;\n"
            "    border-top-right-radius: 0px;\n"
            "    border-top-left-radius: 0px;\n"
            "    border-bottom-right-radius: 3px;\n"
            "    border-bottom-left-radius: 3px;\n"
            "    padding: 4px;\n"
            "}\n"
            "QTabBar::tab:selected, QTabBar::tab:hover {\n"
            "    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgba(255, 255, 255, 32), stop: 1 rgba(255, 255, 255, 48));\n"
            "}\n"
            "QTabBar::tab:selected {\n"
            "    border-color: transparent;\n"
            "}\n"
            "QTabBar::tab:!selected {\n"
            "    margin-top: 0px;\n"
            "}\n"
            "QDockWidget::title{\n"
            "    padding: 6px;\n"
            "    font-size: 10pt;\n"
            "    border: 1px;\n"
            "    border-radius: 0px;\n"
            "    padding-left: 10px;\n"
            "    background-color: rgb(72, 72, 72);\n"
            "}\n"
            "QDockWidget::close-button, QDockWidget::float-button {\n"
            "    padding: 0px;\n"
            "    color: rgb(0,0,128);\n"
            "    border: none;\n"
            "}\n"
            "\n"
            "QDockWidget {\n"
            "    border: 0px ;\n"
            "    border-radius: 0px;\n"
            "    font-size: 10pt;\n"
            "}\n"
            "QGroupBox {\n"
            "    background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgba(175, 175, 175, 16), stop: 1 rgba(0, 0, 0, 0));\n"
            "    border: 0px;\n"
            "    border-radius: 4px;\n"
            "    padding: 0px 8px;\n"
            "}\n"
            "\n"
            "QGroupBox::title {\n"
            "    subcontrol-origin: margin;\n"
            "    subcontrol-position: left top; \n"
            "    padding: 2 6px;\n"
            "    background-color: transparent;\n"
            "    border-bottom: 2px solid qlineargradient(spread:pad, x1:0, y1:0, x2:1, y2:0, stop:0 rgba(128, 128, 128, 64), stop:1 rgba(128, 128,128, 0));\n"
            "}\n"
            "")
        self.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates))
        self.setWindowFilePath("")
        self.mainwidget = QtGui.QWidget(self)
        self.mainwidget.setObjectName("mainwidget")
        self.setCentralWidget(self.mainwidget)
        self.statusBar().close()

    def create_central_widget(self):

        self.central_widget = QtGui.QWidget()

        self.main_layout = QtGui.QVBoxLayout()
        self.main_layout.setSpacing(0)
        self.main_layout.setContentsMargins(0, 0, 0, 0)
        self.central_widget.setLayout(self.main_layout)

        self.setCentralWidget(self.central_widget)

    def create_top_bar(self):

        self.top_bar_widget = Ui_topBarWidget()

        self.main_layout.addWidget(self.top_bar_widget)
        self.main_layout.setStretch(0, 0)

        self.top_bar_widget.projects_chooser_button.clicked.connect(self.show_projects_cooser)

    def get_top_bar_widget(self):
        return self.top_bar_widget

    def create_projects_chooser(self):

        self.projects_chooser_widget_bg = QtGui.QFrame(self)
        self.projects_chooser_widget_bg.setStyleSheet("QFrame { border: 0px; background-color: black;}")
        self.projects_chooser_widget_bg.setHidden(True)
        effect = QtGui.QGraphicsDropShadowEffect(self)
        effect.setOffset(0, 0)
        effect.setColor(Qt4Gui.QColor(0, 0, 0, 128))
        effect.setBlurRadius(64)
        self.projects_chooser_widget_bg.setGraphicsEffect(effect)

        self.projects_chooser_widget = Ui_projectsChooserWidget(self)
        self.projects_chooser_widget.set_bg_widget(self.projects_chooser_widget_bg)

        self.projects_chooser_widget.setMinimumWidth(800)
        self.projects_chooser_widget.setMaximumWidth(800)
        self.projects_chooser_widget.setMinimumHeight(400)
        self.projects_chooser_widget.setMaximumHeight(1600)

        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
        self.projects_chooser_widget.setSizePolicy(sizePolicy)

        grid_layout = QtGui.QGridLayout()
        grid_layout.setContentsMargins(0, 0, 0, 0)

        grid_layout.addWidget(self.projects_chooser_widget, 1, 1, 1, 1)

        spacerItem = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Minimum)
        grid_layout.addItem(spacerItem, 1, 0, 1, 1)
        spacerItem1 = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Minimum)
        grid_layout.addItem(spacerItem1, 1, 2, 1, 1)
        spacerItem2 = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Ignored)
        grid_layout.addItem(spacerItem2, 0, 0, 1, 3)
        spacerItem3 = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Ignored)
        grid_layout.addItem(spacerItem3, 2, 0, 1, 3)

        self.main_layout.addLayout(grid_layout)

    def show_projects_cooser(self):

        if self.projects_chooser_widget.isVisible():
            self.projects_chooser_widget.setHidden(True)

            current_project = env_inst.get_current_project()
            if current_project:
                current_project_dock = self.projects_docks.get(current_project)
                current_project_dock.setHidden(False)
            else:
                self.projects_chooser_widget.setHidden(False)
        else:
            for opened_project in self.projects_docks.values():
                opened_project.setHidden(True)

            self.projects_chooser_widget.setHidden(False)

    def create_project_dock(self, project_code, dummy=None):

        if project_code not in list(self.projects_docks.keys()):

            for opened_project in self.projects_docks.values():
                opened_project.setHidden(True)

            project = env_inst.projects.get(project_code)

            if project:
                if not project.is_template():
                    main_tabs_widget = Ui_mainTabs(project_code, self)
                    self.projects_docks[project_code] = main_tabs_widget

                    self.projects_chooser_widget.setHidden(True)
                    self.main_layout.addWidget(main_tabs_widget, 1)

                    self.top_bar_widget.set_current_project(project)
            else:
                print('No project with code: {0}'.format(project_code))
        else:
            for opened_project in self.projects_docks.values():
                opened_project.setHidden(True)

            project = env_inst.projects.get(project_code)

            if project:
                project_dock = self.projects_docks.get(project_code)
                project_dock.setHidden(False)
                self.projects_chooser_widget.setHidden(True)

                self.top_bar_widget.set_current_project(project)

    def create_ui_main_offline(self):
        self.setWindowTitle('TACTIC-handler (OFFLINE)')

        self.projects_docks = collections.OrderedDict()

        env_inst.ui_main = self

        self.create_debuglog_widget()

        # instance attributes
        self.menu = None

        self.create_central_widget()
        self.create_top_bar()
        self.create_projects_chooser()

        self.menu_bar_actions()

        self.readSettings()
        self.setIcon()

        self.created = True

    def create_ui_main(self):

        env_inst.start_pools()

        self.setWindowTitle('TACTIC-Handler')

        self.projects_docks = collections.OrderedDict()

        env_inst.ui_main = self

        self.create_debuglog_widget()

        # instance attributes
        self.menu = None

        self.create_central_widget()
        self.create_top_bar()
        self.create_projects_chooser()

        self.query_projects()

        self.menu_bar_actions()

        self.readSettings()

        # if env_mode.get_mode() == 'standalone':
        #     self.create_tray()

        self.setIcon()

        self.create_script_editor_widget()
        # self.create_messages_widget()

        self.created = True

    @staticmethod
    def execute_after_all_ui_started():
        # This func is executed after all ui started. File execute_after_start can contain any useful code that
        # should be executed after ui loaded

        from execute_after_start import execute

        execute()

        # env_api.start_api_server_app()

    def create_debuglog_widget(self):
        env_inst.ui_debuglog = Ui_debugLogWidget(self)
        env_inst.ui_debuglog.setWindowState(QtCore.Qt.WindowMinimized)

        env_inst.ui_debuglog.show()
        env_inst.ui_debuglog.hide()
        env_inst.ui_debuglog.setWindowState(QtCore.Qt.WindowNoState)

    def create_script_editor_widget(self):
        env_inst.ui_script_editor = Ui_ScriptEditForm(self)

    def create_messages_widget(self):
        env_inst.ui_messages = Ui_messagesWidget(self)

    def set_info_status_text(self, status_text=''):
        self.top_bar_widget.set_info_status_text(status_text)

    # def check_for_update(self):
    #     if uf.check_need_update():
    #         self.info_label.setText('<span style=" font-size:8pt; color:#ff0000;">Need update</span>')

    def create_tray(self):
        self.tray_icon = QtGui.QSystemTrayIcon(self)
        self.tray_icon.activated.connect(self.tray_activated)

        icon = Qt4Gui.QIcon(':/ui_main/gliph/tactic_favicon.ico')
        self.tray_icon.setIcon(icon)

        self.tray_menu = QtGui.QMenu(self)

        self.show_main_window = QtGui.QAction('Show Main Window', self, triggered=self.show)
        self.tray_menu.addAction(self.show_main_window)
        self.tray_menu.addSeparator()

        self.close_app_action = QtGui.QAction('Exit', self, triggered=self.close_app)
        self.tray_menu.addAction(self.close_app_action)

        self.tray_icon.setContextMenu(self.tray_menu)

        self.tray_icon.show()

    def setIcon(self):
        icon = Qt4Gui.QIcon(':/ui_main/gliph/tactic_favicon.ico')
        self.setWindowIcon(icon)

    def tray_activated(self, reason):

        if reason in [QtGui.QSystemTrayIcon.DoubleClick, QtGui.QSystemTrayIcon.Trigger]:
            self.show()

    def close_app(self):
        self.close()
        self.deleteLater()

    # def customize_ui(self):
    #     if env_mode.get_mode() == 'standalone':
    #         self.actionDock_undock.setVisible(False)
    #
    #     self.actionExit.setIcon(gf.get_icon('window-close', icons_set='mdi'))
    #     self.actionConfiguration.setIcon(gf.get_icon('settings', icons_set='mdi'))
    #     self.actionSave_Preferences.setIcon(gf.get_icon('content-save', icons_set='mdi'))
    #     self.actionReloadCache.setIcon(gf.get_icon('reload', icons_set='mdi'))
    #     self.actionApply_to_all_Tabs.setIcon(gf.get_icon('hexagon-multiple', icons_set='mdi'))
    #     self.actionScriptEditor.setIcon(gf.get_icon('script', icons_set='mdi'))
    #     self.actionDebug_Log.setIcon(gf.get_icon('bug', icons_set='mdi'))
    #     self.actionUpdate.setIcon(gf.get_icon('update', icons_set='mdi'))
    #
    #     self.statusBar().close()

    def menu_bar_actions(self):
        """
        Actions for the main menu bar
        """

        def close_routine():

            self.app_closing = True

            if env_mode.get_mode() == 'maya':

                self.close()

                from thlib.ui_classes.ui_maya_dock import close_all_instances
                close_all_instances()

                # Removing path from sys, so we can run other instance from different path
                import sys
                sys.path.remove(env_mode.get_current_path())

            if env_mode.get_mode() == 'standalone':

                self.close()

        self.top_bar_widget.actionExit.triggered.connect(close_routine)

        self.top_bar_widget.actionConfiguration.triggered.connect(self.open_config_dialog)

        self.top_bar_widget.actionApply_to_all_Tabs.triggered.connect(self.apply_current_view)
        self.top_bar_widget.actionReloadCache.triggered.connect(self.reload_cache)

        self.top_bar_widget.actionUpdate.triggered.connect(self.update_self)
        self.top_bar_widget.actionScriptEditor.triggered.connect(self.open_script_editor)
        self.top_bar_widget.actionDebug_Log.triggered.connect(lambda: env_inst.ui_debuglog.show())

        # User Menu items
        # self.top_bar_widget.actionMessages.triggered.connect(lambda: env_inst.ui_messages.show())
        # self.top_bar_widget.actionEdit_My_Account.triggered.connect(self.edit_my_account)

        self.top_bar_widget.actionDock_undock.triggered.connect(self.undock_window)

    def undock_window(self):
        env_inst.ui_maya_dock.toggle_docking()

    def edit_my_account(self):

        print('Edit my Account')
        from thlib.ui_classes.ui_addsobject_classes import Ui_addTacticSobjectWidget

        login_stype = env_inst.get_stype_by_code('sthpw/login')
        # parent_stype = self.parent_sobject.get_stype()
        # search_key = self.parent_sobject.get_search_key()

        # print search_key

        add_sobject = Ui_addTacticSobjectWidget(
            stype=login_stype,
            parent_stype=None,
            # search_key=search_key,
            parent_search_key=None,
            # view='edit',
            parent=self,
        )

        add_sobject.show()

    # def create_ui_float_notify(self):
    #     self.float_notify = ui_float_notify_classes.Ui_floatNotifyWidget(self)
    #     self.float_notify.show()
    #     self.float_notify.setSizeGripEnabled(True)

    def open_script_editor(self):
        env_inst.ui_script_editor.show()

    def update_self(self):
        if env_mode.is_online():
            self.update_dialog = Ui_updateDialog(self)

            self.update_dialog.show()

    def reload_cache(self):
        tc.get_all_projects_and_logins(True)
        for project in env_inst.projects.values():
            project.query_search_types(True)

        if env_mode.get_mode() == 'maya':
            self.restart_ui_main()
        else:
            self.close()
            gf.restart_app()

    def open_config_dialog(self):
        conf_dialog = ui_conf_classes.Ui_configuration_dialogWidget(parent=self)
        conf_dialog.show()

    def restart_for_update_ui_main(self):

        if env_mode.get_mode() == 'maya':
            # import main_maya
            # thread = main_maya.main.restart()
            from thlib.ui_classes.ui_maya_dock import close_all_instances
            close_all_instances()
            # self.restart_ui_main()
        else:
            self.close()
            gf.restart_app()

        # if env_mode.get_mode() == 'standalone':
        #     import main_standalone
        #     thread = main_standalone.restart()
        #     thread.finished.connect(self.close)
        # if env_mode.get_mode() == 'maya':
        #     import main_maya
        #     thread = main_maya.main.restart()
        #     thread.finished.connect(main_maya.main.close_all_instances)

    def restart_ui_main(self, server_preset=None):
        if server_preset:
            new_server_preset = env_server.get_cur_srv_preset()
            env_server.set_cur_srv_preset(server_preset)

        # Closing main app itself
        self.close()

        # Closing server api
        # env_api.close_server()

        if server_preset:
            env_server.set_cur_srv_preset(new_server_preset)

        if env_mode.is_online():
            self.create_ui_main()
        else:
            self.create_ui_main_offline()

        self.show()
        return self

    def apply_current_view(self):

        if env_inst.get_current_project():
            current_project_widget = self.projects_docks[env_inst.get_current_project()]

            current_project_widget.ui_checkin_checkout.apply_current_view_to_all()

    def fill_projects_to_projects_chooser(self):
        self.projects_chooser_widget.initial_fill()

    def restore_opened_projects(self):
        if self.ui_settings_dict:
            self.opened_projects = self.ui_settings_dict.get('opened_projects')
        else:
            self.opened_projects = None
        if not isinstance(self.opened_projects, list):
            if self.opened_projects:
                self.opened_projects = [self.opened_projects]

        if self.opened_projects:

            current_project_code = self.ui_settings_dict.get('current_active_project')
            self.create_project_dock(current_project_code)

            if current_project_code:
                if self.projects_docks.get(current_project_code):
                    self.projects_docks[current_project_code].show()
                    self.projects_docks[current_project_code].raise_()

    def create_repo_sync_queue_ui(self):
        env_inst.ui_repo_sync_queue = Ui_repoSyncQueueWidget(parent=self)

    def get_settings_dict(self):

        settings_dict = {}

        if self.windowState() == QtCore.Qt.WindowMaximized:
            state = True
            if self.ui_settings_dict:
                settings_dict['pos'] = self.ui_settings_dict['pos']
                settings_dict['size'] = self.ui_settings_dict['size']
            else:
                settings_dict['pos'] = self.pos().toTuple()
                settings_dict['size'] = self.size().toTuple()
        else:
            state = False
            settings_dict['pos'] = self.pos().toTuple()
            settings_dict['size'] = self.size().toTuple()
        settings_dict['windowState'] = state

        if list(self.projects_docks.keys()):
            settings_dict['opened_projects'] = list(self.projects_docks.keys())
            if env_inst.get_current_project():
                settings_dict['current_active_project'] = str(env_inst.get_current_project())
        else:
            settings_dict['opened_projects'] = ''
            settings_dict['current_active_project'] = ''

        return settings_dict

    def set_settings_from_dict(self, settings_dict=None):

        ref_settings_dict = {
            'pos': self.pos().toTuple(),
            'size': self.size().toTuple(),
            'windowState': False,
            'opened_projects': '',
            'current_active_project': '',
        }

        settings = gf.check_config(ref_settings_dict, settings_dict)

        self.move(settings['pos'][0], settings['pos'][1])
        self.resize(settings['size'][0], settings['size'][1])

        if settings['windowState']:
            self.setWindowState(QtCore.Qt.WindowMaximized)

    def readSettings(self):
        self.ui_settings_dict = env_read_config(filename='ui_settings', unique_id='ui_main', long_abs_path=True)
        self.set_settings_from_dict(self.ui_settings_dict)

    def writeSettings(self):
        env_write_config(self.get_settings_dict(), filename='ui_settings', unique_id='ui_main', long_abs_path=True)

    def closeEvent(self, event):

        if self.app_closing:

            for dock in self.projects_docks.values():
                dock.close()
                dock.deleteLater()
                del dock
                # env_inst.cleanup(project_code)

            self.writeSettings()

            # Closing server api
            # env_api.close_server(self)

            # Waiting for all threads finished
            env_inst.exit_pools()

            event.accept()
        else:
            event.ignore()
            self.hide()
            self.tray_icon.showMessage('Tactic Handler Is in tray',
                                       'File > Exit to quit.',
                                       QtGui.QSystemTrayIcon.Information, 500)

    def query_projects_finished(self, result=None):

        if result:
            self.create_repo_sync_queue_ui()

            self.restore_opened_projects()
            self.fill_projects_to_projects_chooser()
            env_inst.ui_main.set_info_status_text('')

            self.execute_after_all_ui_started()

    def query_projects(self):
        env_inst.ui_main.set_info_status_text(
            '<span style=" font-size:8pt; color:#00ff00;">Getting projects</span>')

        worker = env_inst.server_pool.add_task(tc.get_all_projects_and_logins)
        worker.result.connect(self.query_projects_finished)
        worker.error.connect(gf.error_handle)
        worker.start()
class Ui_Main(QtGui.QMainWindow, ui_main.Ui_MainWindow):
    def __init__(self, parent=None):
        super(self.__class__, self).__init__(parent=parent)
        self.ui_settings_dict = {}
        self.created = False

        self.create_debuglog_widget()

        if env_mode.is_offline():
            self.create_ui_main_offline()
        else:
            self.create_ui_main()

    def create_project_dock(self,
                            project_code,
                            close_project=True,
                            raise_tab=False):
        if project_code not in self.projects_docks.keys():
            project = env_inst.projects.get(project_code)
            if project:
                if not project.is_template():
                    dock_widget = QtGui.QDockWidget(self)
                    dock_widget.setObjectName(project_code)
                    # print project.info['title'].replace('_', ' ').capitalize()
                    dock_widget.setWindowTitle(project.info.get('title'))
                    dock_widget.setMinimumWidth(200)
                    dock_widget.setFeatures(
                        QtGui.QDockWidget.DockWidgetMovable
                        | QtGui.QDockWidget.DockWidgetClosable)

                    main_tabs_widget = Ui_mainTabs(project_code, dock_widget)
                    dock_widget.setWidget(main_tabs_widget)

                    self.addDockWidget(QtCore.Qt.LeftDockWidgetArea,
                                       dock_widget)
                    for dock in self.projects_docks.values():
                        self.tabifyDockWidget(dock, dock_widget)

                    self.projects_docks[project_code] = dock_widget

                    dock_widget.setStyleSheet(
                        '#complex_testing_phase_four > QTabBar::tab {background: transparent;border: 2px solid transparent;'
                        'border-top-left-radius: 3px;border-top-right-radius: 3px;border-bottom-left-radius: 0px;border-bottom-right-radius: 0px;padding: 4px;}'
                        '#complex_testing_phase_four > QTabBar::tab:selected, #complex_testing_phase_four > QTabBar::tab:hover {'
                        'background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 rgba(255, 255, 255, 48), stop: 1 rgba(255, 255, 255, 32));}'
                        '#complex_testing_phase_four > QTabBar::tab:selected {border-color: transparent;}'
                        '#complex_testing_phase_four > QTabBar::tab:!selected {margin-top: 0px;}'
                    )

                    dock_widget.show()
                    dock_widget.raise_()
            else:
                print('No project with code: {0}'.format(project_code))

        elif close_project:
            self.projects_docks[project_code].widget().close()
            self.projects_docks[project_code].close()
            self.projects_docks[project_code].deleteLater()
            del self.projects_docks[project_code]
            env_inst.cleanup(project_code)

        if raise_tab:
            project_dock = self.projects_docks.get(project_code)
            if project_dock:
                project_dock.show()
                project_dock.raise_()

    def create_ui_main_offline(self):
        self.projects_docks = collections.OrderedDict()

        env_inst.ui_main = self

        self.setupUi(self)
        self.setWindowTitle('TACTIC handler (OFFLINE)')

        # instance attributes
        self.menu = None
        self.menu_bar_actions()
        self.menuProject.setEnabled(False)
        self.readSettings()
        self.setIcon()

        self.customize_ui()

    def create_ui_main(self):
        self.projects_docks = collections.OrderedDict()

        env_inst.ui_main = self

        self.setupUi(self)
        self.setWindowTitle('TACTIC Handler')
        self.customize_ui()

        # instance attributes
        self.menu = None
        self.mainwidget.deleteLater()
        self.query_projects()
        self.menu_bar_actions()
        self.menuProject.setEnabled(True)
        self.readSettings()
        self.setIcon()
        self.created = True
        self.create_messages_widget()

    def create_debuglog_widget(self):
        env_inst.ui_debuglog = ui_misc_classes.Ui_debugLogWidget(self)

    def create_messages_widget(self):
        env_inst.ui_messages = ui_misc_classes.Ui_messagesWidget(self)

    def create_info_label(self):
        self.label_layout = QtGui.QVBoxLayout(self.menubar)
        self.label_layout.setContentsMargins(0, 0, 6, 0)

        self.info_label = QtGui.QLabel()
        self.info_label.setAlignment(QtCore.Qt.AlignRight
                                     | QtCore.Qt.AlignVCenter)
        self.info_label.setText('')
        self.label_layout.addWidget(self.info_label)

    def set_status_text(self, text=''):
        self.setStatusTip(text)

    def set_info_status_text(self, status_text=''):
        self.info_label.setText(status_text)

    def check_for_update(self):
        if uf.check_need_update():
            self.info_label.setText(
                '<span style=" font-size:8pt; color:#ff0000;">Need update</span>'
            )

    def setIcon(self):
        icon = Qt4Gui.QIcon(':/ui_main/gliph/tactic_favicon.ico')
        self.setWindowIcon(icon)

    def customize_ui(self):
        if env_mode.get_mode() == 'standalone':
            self.actionDock_undock.setVisible(False)

        self.actionExit.setIcon(gf.get_icon('close'))
        self.actionConfiguration.setIcon(gf.get_icon('wrench'))
        self.create_info_label()

    def menu_bar_actions(self):
        """
        Actions for the main menu bar
        """
        def close_routine():
            if env_mode.get_mode() == 'maya':
                from thlib.ui_classes.ui_maya_dock import close_all_instances
                close_all_instances()
                self.close()
            if env_mode.get_mode() == 'standalone':
                self.close()

        self.actionExit.triggered.connect(close_routine)

        self.actionConfiguration.triggered.connect(self.open_config_dialog)

        self.actionApply_to_all_Tabs.triggered.connect(self.apply_current_view)

        self.actionUpdate.triggered.connect(self.update_self)
        self.actionServerside_Script.triggered.connect(
            self.create_server_side_script_editor)
        self.actionDebug_Log.triggered.connect(
            lambda: env_inst.ui_debuglog.show())

        # User Menu items
        self.actionMessages.triggered.connect(
            lambda: env_inst.ui_messages.show())
        self.actionEdit_My_Account.triggered.connect(self.edit_my_account)

        self.actionDock_undock.triggered.connect(self.undock_window)

    def undock_window(self):
        env_inst.ui_maya_dock.toggle_docking()

    def edit_my_account(self):

        import thlib.tactic_widgets as tw
        import thlib.ui_classes.ui_tactic_widgets_classes as twc

        wd = {
            u'input_prefix': u'insert',
            u'element_titles':
            [u'Preview', u'Name', u'Description', u'Keywords'],
            u'title': u'',
            u'element_names':
            [u'preview', u'name', u'description', u'keywords'],
            u'kwargs': {
                u'search_type': u'melnitsapipeline/episode',
                u'code': u'',
                u'title_width': u'',
                u'parent_key': None,
                u'title': u'',
                u'default': u'',
                u'search_key': u'',
                u'input_prefix': u'insert',
                u'config_base': u'',
                u'single': u'',
                u'cbjs_edit_path': u'',
                u'access': u'',
                u'width': u'',
                u'show_header': u'',
                u'cbjs_cancel': u'',
                u'mode': u'insert',
                u'cbjs_insert_path': u'',
                u'ignore': u'',
                u'show_action': u'',
                u'search_id': u'',
                u'view': u'insert'
            },
            u'element_descriptions':
            [None, u'Name', u'Description', u'Keywords'],
            u'mode': u'insert',
            u'security_denied': False
        }
        tactic_edit_widget = tw.TacticEditWdg(wd)
        tactic_edit_widget.set_stype(
            env_inst.get_current_stypes()['tactichandler/bug'])

        input_widgets_list = []

        class Item(object):
            def __init__(self):
                self.get_pipeline = None
                self.type = 'fake'

        self.item = Item()

        # class item(object):
        def get_pipeline():
            return None

        self.item.get_pipeline = get_pipeline
        # self.item.get_pipeline = get_pipeline
        edit_window = twc.QtTacticEditWidget(tactic_widget=tactic_edit_widget,
                                             qt_widgets=input_widgets_list,
                                             stype=self.item,
                                             parent=self)

        edit_window.show()

        self.dlg = QtGui.QDialog(self)
        self.l = QtGui.QVBoxLayout()
        self.l.addWidget(edit_window)
        self.dlg.setLayout(self.l)
        self.dlg.show()

        import ui_addsobject_classes
        # edit_current_account = ui_addsobject_classes.Ui_addTacticSobjectWidget(
        #     stype=env_inst.get_current_stypes().values()[0],
        #     view='edit',
        #     parent=self,
        # )
        # edit_current_account.setWindowTitle(u'Editing User Account')
        # edit_current_account.show()

    def create_ui_float_notify(self):
        self.float_notify = ui_float_notify_classes.Ui_floatNotifyWidget(self)
        self.float_notify.show()
        self.float_notify.setSizeGripEnabled(True)

    def create_server_side_script_editor(self):
        if env_mode.is_online():
            self.serverside_script_editor = Ui_serverScriptEditForm(self)
            self.serverside_script_editor.show()

    def update_self(self):
        if env_mode.is_online():
            self.update_dialog = Ui_updateDialog(self)

            self.update_dialog.show()

    def open_config_dialog(self):
        conf_dialog = ui_conf_classes.Ui_configuration_dialogWidget(
            parent=self)
        conf_dialog.show()

    def restart_for_update_ui_main(self):
        if env_mode.get_mode() == 'standalone':
            import main_standalone
            thread = main_standalone.restart()
            thread.finished.connect(self.close)
        if env_mode.get_mode() == 'maya':
            import main_maya
            thread = main_maya.main.restart()
            thread.finished.connect(main_maya.main.close_all_instances)

    def restart_ui_main(self):
        self.close()
        self.projects_docks = collections.OrderedDict()

        if env_mode.is_online():
            self.create_ui_main()
        else:
            self.create_ui_main_offline()

        self.show()
        return self

    def apply_current_view(self):
        # TODO may be need to be rewriten to use env instance
        if env_inst.get_current_project():
            current_project_widget = self.projects_docks[
                env_inst.get_current_project()].widget()

            current_project_widget.ui_checkin_checkout.apply_current_view_to_all(
            )

            # widget_name = current_project_widget.main_tabWidget.currentWidget().objectName()

            # if widget_name == 'checkInOutTab':
            #     current_project_widget.ui_checkin_checkout.apply_current_view_to_all()
            #
            # if widget_name == 'checkOutTab':
            #     current_project_widget.ui_checkout.apply_current_view_to_all()
            #
            # if widget_name == 'checkInTab':
            #     current_project_widget.ui_checkin.apply_current_view_to_all()

    def fill_projects_to_menu(self):

        all_projects_dicts = []

        for project_name, project in env_inst.projects.iteritems():
            all_projects_dicts.append(project.info)

        projects_by_categories = gf.group_dict_by(all_projects_dicts,
                                                  'category')

        for cat_name, projects in projects_by_categories.iteritems():
            if cat_name:
                cat_name = gf.prettify_text(cat_name, True)
            else:
                cat_name = 'No Category'
            if cat_name != 'Template':
                category = self.menuProject.addMenu(cat_name)

            for e, project in enumerate(projects):
                if not project.get('is_template'):
                    project_code = project.get('code')

                    menu_action = QtGui.QAction(self)
                    menu_action.setCheckable(True)

                    if self.opened_projects:
                        if project_code in self.opened_projects:
                            menu_action.setChecked(True)
                    menu_action.setText(project.get('title'))
                    # Don't know why lambda did not work here
                    menu_action.triggered.connect(
                        partial(self.create_project_dock, project_code))
                    category.addAction(menu_action)

    def restore_opened_projects(self):
        if self.ui_settings_dict:
            self.opened_projects = self.ui_settings_dict.get('opened_projects')
        else:
            self.opened_projects = None
        if not isinstance(self.opened_projects, list):
            if self.opened_projects:
                self.opened_projects = [self.opened_projects]

        if self.opened_projects:
            for project in self.opened_projects:
                if project:
                    self.create_project_dock(project)

            current_project_code = self.ui_settings_dict.get(
                'current_active_project')

            if current_project_code:
                if self.projects_docks.get(current_project_code):
                    self.projects_docks[current_project_code].show()
                    self.projects_docks[current_project_code].raise_()

    def get_settings_dict(self):

        settings_dict = {}

        if self.windowState() == QtCore.Qt.WindowMaximized:
            state = True
            if self.ui_settings_dict:
                settings_dict['pos'] = self.ui_settings_dict['pos']
                settings_dict['size'] = self.ui_settings_dict['size']
            else:
                settings_dict['pos'] = self.pos().toTuple()
                settings_dict['size'] = self.size().toTuple()
        else:
            state = False
            settings_dict['pos'] = self.pos().toTuple()
            settings_dict['size'] = self.size().toTuple()
        settings_dict['windowState'] = state

        if self.projects_docks.keys():
            settings_dict['opened_projects'] = self.projects_docks.keys()
            if env_inst.get_current_project():
                settings_dict['current_active_project'] = str(
                    env_inst.get_current_project())
        else:
            settings_dict['opened_projects'] = ''
            settings_dict['current_active_project'] = ''

        return settings_dict

    def set_settings_from_dict(self, settings_dict=None):

        if not settings_dict:
            settings_dict = {
                'pos': self.pos().toTuple(),
                'size': self.size().toTuple(),
                'windowState': False,
                'opened_projects': '',
                'current_active_project': '',
            }

        self.move(settings_dict['pos'][0], settings_dict['pos'][1])
        self.resize(settings_dict['size'][0], settings_dict['size'][1])

        if settings_dict['windowState']:
            self.setWindowState(QtCore.Qt.WindowMaximized)

    def readSettings(self):
        self.ui_settings_dict = env_read_config(filename='ui_settings',
                                                unique_id='ui_main',
                                                long_abs_path=True)
        self.set_settings_from_dict(self.ui_settings_dict)

    def writeSettings(self):
        env_write_config(self.get_settings_dict(),
                         filename='ui_settings',
                         unique_id='ui_main',
                         long_abs_path=True)

    def closeEvent(self, event):
        for dock in self.projects_docks.values():
            # project_code = dock.widget().project.get_code()
            dock.widget().close()
            dock.close()
            dock.deleteLater()
            del dock
            # env_inst.cleanup(project_code)
        self.writeSettings()
        event.accept()

    def query_projects_finished(self, result=None):
        if result:
            self.restore_opened_projects()
            self.fill_projects_to_menu()
            env_inst.ui_main.set_info_status_text('')

            # self.create_ui_float_notify()

    def query_projects(self):
        env_inst.ui_main.set_info_status_text(
            '<span style=" font-size:8pt; color:#00ff00;">Getting projects</span>'
        )

        def get_all_projects_and_logins_agent():
            return tc.get_all_projects_and_logins()

        env_inst.set_thread_pool(None, 'server_query/server_thread_pool')

        projects_items_worker = gf.get_thread_worker(
            get_all_projects_and_logins_agent,
            env_inst.get_thread_pool('server_query/server_thread_pool'),
            result_func=self.query_projects_finished,
            error_func=gf.error_handle)
        projects_items_worker.start()