def create_options_toolbar(self): self.collapsable_options_toolbar = Ui_horizontalCollapsableWidget() buttons_layout = QtGui.QHBoxLayout() buttons_layout.setSpacing(0) buttons_layout.setContentsMargins(0, 0, 0, 0) self.collapsable_options_toolbar.set_direction('right') self.collapsable_options_toolbar.setLayout(buttons_layout) self.collapsable_options_toolbar.setCollapsed(True) self.auto_save_check_box = QtGui.QCheckBox('Autosave') self.auto_save_check_box.setChecked(False) self.filter_process_check_box = QtGui.QCheckBox('Filter') self.filter_process_check_box.setChecked(False) self.process_combo_box = Ui_coloredComboBox() self.process_combo_box.setEnabled(False) QtCore.QObject.connect(self.filter_process_check_box, QtCore.SIGNAL("toggled(bool)"), self.process_combo_box.setEnabled) buttons_layout.addWidget(self.filter_process_check_box) buttons_layout.addWidget(self.process_combo_box) buttons_layout.addWidget(self.auto_save_check_box) self.main_layout.addWidget(self.collapsable_options_toolbar, 0, 1, 1, 1)
def create_right_collapsable_toolbar(self): self.right_collapsable_toolbar = Ui_horizontalCollapsableWidget() self.right_collapsable_toolbar.setCollapsed(False) self.right_buttons_layout = QtGui.QHBoxLayout() self.right_buttons_layout.setSpacing(0) self.right_buttons_layout.setContentsMargins(0, 0, 0, 0) self.right_collapsable_toolbar.setLayout(self.right_buttons_layout) self.refresh_serverside_scripts_button = QtGui.QToolButton() self.refresh_serverside_scripts_button.setToolButtonStyle( QtCore.Qt.ToolButtonIconOnly) self.refresh_serverside_scripts_button.setAutoRaise(True) self.refresh_serverside_scripts_button.setMinimumSize( QtCore.QSize(24, 24)) self.refresh_serverside_scripts_button.setMaximumSize( QtCore.QSize(24, 24)) self.refresh_serverside_scripts_button.setIcon( gf.get_icon('refresh', icons_set='mdi')) self.refresh_serverside_scripts_button.setToolTip( 'Refresh all Scripts Tree from Server') self.right_buttons_layout.addWidget( self.refresh_serverside_scripts_button)
def create_toolbar(self): self.collapsable_toolbar = Ui_horizontalCollapsableWidget() buttons_layout = QtGui.QHBoxLayout() buttons_layout.setSpacing(0) buttons_layout.setContentsMargins(0, 0, 0, 0) self.collapsable_toolbar.set_direction('right') self.collapsable_toolbar.setLayout(buttons_layout) self.collapsable_toolbar.setCollapsed(False) self.save_button = QtGui.QToolButton() self.save_button.setAutoRaise(True) self.save_button.setIcon( gf.get_icon('content-save', icons_set='mdi', scale_factor=1)) self.save_button.setToolTip('Save Current Changes') self.refresh_button = QtGui.QToolButton() self.refresh_button.setAutoRaise(True) self.refresh_button.setIcon( gf.get_icon('refresh', icons_set='mdi', scale_factor=1.3)) self.refresh_button.setToolTip('Refresh Current Tasks') buttons_layout.addWidget(self.save_button) buttons_layout.addWidget(self.refresh_button) self.main_layout.addWidget(self.collapsable_toolbar, 0, 0, 1, 1)
def create_collapsable_toolbar(self): self.collapsable_toolbar = Ui_horizontalCollapsableWidget() self.collapsable_toolbar.setText('Quick Config') self.buttons_layout = QtGui.QHBoxLayout() self.buttons_layout.setSpacing(0) self.buttons_layout.setContentsMargins(0, 0, 0, 0) self.collapsable_toolbar.setLayout(self.buttons_layout) self.collapsable_toolbar.setCollapsed(True) self.expandingLayout.addWidget(self.collapsable_toolbar)
def create_left_collapsable_toolbar(self): self.left_collapsable_toolbar = Ui_horizontalCollapsableWidget() self.left_collapsable_toolbar.setCollapsed(False) self.left_buttons_layout = QtGui.QHBoxLayout() self.left_buttons_layout.setSpacing(0) self.left_buttons_layout.setContentsMargins(0, 0, 0, 0) self.left_collapsable_toolbar.setLayout(self.left_buttons_layout) self.add_new_script_button = QtGui.QToolButton() self.add_new_script_button.setToolButtonStyle( QtCore.Qt.ToolButtonIconOnly) self.add_new_script_button.setAutoRaise(True) self.add_new_script_button.setMinimumSize(QtCore.QSize(24, 24)) self.add_new_script_button.setMaximumSize(QtCore.QSize(24, 24)) self.add_new_script_button.setIcon( gf.get_icon('plus-box', icons_set='mdi')) self.add_new_script_button.setToolTip('Create New Script') self.cleanup_output_button = QtGui.QToolButton() self.cleanup_output_button.setToolButtonStyle( QtCore.Qt.ToolButtonIconOnly) self.cleanup_output_button.setAutoRaise(True) self.cleanup_output_button.setMinimumSize(QtCore.QSize(24, 24)) self.cleanup_output_button.setMaximumSize(QtCore.QSize(24, 24)) self.cleanup_output_button.setIcon( gf.get_icon('eraser', icons_set='mdi')) self.cleanup_output_button.setToolTip('Clean-up Output Window') self.save_current_script_button = QtGui.QToolButton() self.save_current_script_button.setToolButtonStyle( QtCore.Qt.ToolButtonIconOnly) self.save_current_script_button.setAutoRaise(True) self.save_current_script_button.setMinimumSize(QtCore.QSize(24, 24)) self.save_current_script_button.setMaximumSize(QtCore.QSize(24, 24)) self.save_current_script_button.setIcon( gf.get_icon('content-save', icons_set='mdi')) self.save_current_script_button.setToolTip( 'Save current Script to Sever') self.left_buttons_layout.addWidget(self.add_new_script_button) self.left_buttons_layout.addWidget(self.save_current_script_button) self.left_buttons_layout.addWidget(self.cleanup_output_button)
def create_options_toolbar(self): self.collapsable_options_toolbar = Ui_horizontalCollapsableWidget() buttons_layout = QtGui.QHBoxLayout() buttons_layout.setSpacing(9) buttons_layout.setContentsMargins(0, 0, 0, 0) self.collapsable_options_toolbar.set_direction('right') self.collapsable_options_toolbar.setLayout(buttons_layout) self.collapsable_options_toolbar.setCollapsed(True) self.auto_save_check_box = QtGui.QCheckBox('Autosave') self.auto_save_check_box.setChecked(False) self.definition_label = QtGui.QLabel('Definition: ') self.definition_combo_box = QtGui.QComboBox() buttons_layout.addWidget(self.definition_label) buttons_layout.addWidget(self.definition_combo_box) buttons_layout.addWidget(self.auto_save_check_box) self.main_layout.addWidget(self.collapsable_options_toolbar, 0, 1, 1, 1)
class Ui_dropPlateWidget(QtGui.QWidget, ui_drop_plate.Ui_dropPlate): def __init__(self, parent=None): super(self.__class__, self).__init__(parent=parent) self.tree_items = [] self.setupUi(self) self.setAcceptDrops(True) self.create_ui() self.create_config_widget() self.controls_actions() def threads_fill_items(self, kwargs, exec_after_added=None): worker = env_inst.local_pool.add_task(self.get_files_objects, kwargs) worker.result.connect(self.append_items_to_tree) if exec_after_added: worker.finished.connect(exec_after_added) worker.error.connect(gf.error_handle) worker.start() def create_ui(self): self.clearPushButton.setIcon(gf.get_icon('trash')) self.configPushButton.setIcon(gf.get_icon('settings', icons_set='mdi')) self.create_progress_bar_widget() self.create_collapsable_toolbar() self.setAcceptDrops(True) if env_mode.get_mode() == 'standalone': sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) self.setSizePolicy(sizePolicy) self.setMinimumWidth(300) self.move_controls_to_collapsable_toolbar() self.customize_ui() def customize_ui(self): self.dropTreeWidget.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) self.dropTreeWidget.setDragDropMode(QtGui.QAbstractItemView.DragOnly) self.dropTreeWidget.setStyleSheet(gf.get_qtreeview_style()) def create_progress_bar_widget(self): self.progressBar = QtGui.QProgressBar() self.progressBar.setMaximum(100) self.progressBarLayout.addWidget(self.progressBar) self.progressBar.setTextVisible(True) self.progressBar.setVisible(False) def create_config_widget(self): self.config_widget = Ui_matchingTemplateConfigWidget(self) def create_collapsable_toolbar(self): self.collapsable_toolbar = Ui_horizontalCollapsableWidget() self.collapsable_toolbar.setText('Quick Config') self.buttons_layout = QtGui.QHBoxLayout() self.buttons_layout.setSpacing(0) self.buttons_layout.setContentsMargins(0, 0, 0, 0) self.collapsable_toolbar.setLayout(self.buttons_layout) self.collapsable_toolbar.setCollapsed(True) self.expandingLayout.addWidget(self.collapsable_toolbar) def add_widget_to_collapsable_toolbar(self, widget): self.buttons_layout.addWidget(widget) def move_controls_to_collapsable_toolbar(self): self.add_widget_to_collapsable_toolbar(self.groupCheckinCheckBox) self.add_widget_to_collapsable_toolbar(self.keepFileNameCheckBox) self.add_widget_to_collapsable_toolbar(self.includeSubfoldersCheckBox) self.collapsable_toolbar.setCollapsed(False) def controls_actions(self): self.clearPushButton.clicked.connect(self.clear_tree_widget) self.configPushButton.clicked.connect(self.config_widget.exec_) # self.groupCheckinCheckBox.stateChanged.connect(self.enable_group_checkin) self.create_files_tree_context_menu() def clear_tree_widget(self): self.dropTreeWidget.clear() self.tree_items = [] def create_files_tree_context_menu(self): self.dropTreeWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.dropTreeWidget.customContextMenuRequested.connect(self.open_menu) def open_menu(self): item = self.dropTreeWidget.selectedIndexes() if item: menu = self.file_context_menu() if menu: menu.exec_(Qt4Gui.QCursor.pos()) else: menu = self.drop_plate_context_menu() if menu: menu.exec_(Qt4Gui.QCursor.pos()) @gf.catch_error def open_file_from_tree(self): item = self.get_selected_items() for it in item: it.open_file() @gf.catch_error def open_folder_from_tree(self): item = self.get_selected_items() for it in item: it.open_folder() @gf.catch_error def copy_path_from_tree(self): item = self.get_selected_items() clipboard = QtGui.QApplication.instance().clipboard() files_list = set() for it in item: files_list.add(it.get_file_path()) clipboard.setText('\n'.join(files_list)) @gf.catch_error def copy_abs_path_from_tree(self): item = self.get_selected_items() clipboard = QtGui.QApplication.instance().clipboard() files_list = [] for it in item: files_list.extend(it.get_all_files_list()) clipboard.setText('\n'.join(files_list)) def file_context_menu(self): open_file = QtGui.QAction('Open File', self.dropTreeWidget) open_file.setIcon(gf.get_icon('folder')) open_file.triggered.connect(self.open_file_from_tree) open_file_folder = QtGui.QAction('Show Folder', self.dropTreeWidget) open_file_folder.setIcon(gf.get_icon('folder-open')) open_file_folder.triggered.connect(self.open_folder_from_tree) copy_path = QtGui.QAction("Copy File Path", self.dropTreeWidget) copy_path.setIcon(gf.get_icon('copy')) copy_path.triggered.connect(self.copy_path_from_tree) copy_abs_path = QtGui.QAction("Copy Absolute File Path", self.dropTreeWidget) copy_abs_path.setIcon(gf.get_icon('copy')) copy_abs_path.triggered.connect(self.copy_abs_path_from_tree) add_file = QtGui.QAction('Add More Files', self.dropTreeWidget) add_file.setIcon(gf.get_icon('folder-open')) add_file.triggered.connect(self.add_files_from_menu) menu = QtGui.QMenu() menu.addAction(open_file) menu.addAction(open_file_folder) menu.addAction(copy_path) menu.addAction(copy_abs_path) menu.addAction(add_file) return menu def drop_plate_context_menu(self): add_file = QtGui.QAction('Add Files', self.dropTreeWidget) add_file.setIcon(gf.get_icon('folder-open')) add_file.triggered.connect(self.add_files_from_menu) paste_from_clipboard = QtGui.QAction('Paste From Clipboard', self.dropTreeWidget) paste_from_clipboard.setIcon(gf.get_icon('folder-open')) paste_from_clipboard.triggered.connect(self.add_files_from_clipboard) menu = QtGui.QMenu() menu.addAction(add_file) menu.addAction(paste_from_clipboard) return menu def add_files_from_menu(self, exec_after_added=None): options = QtGui.QFileDialog.Options() options |= QtGui.QFileDialog.DontUseNativeDialog files_names, filter = QtGui.QFileDialog.getOpenFileNames( self, 'Adding files to Drop Pate', '', 'All Files (*.*);;', '', options) if files_names: self.threads_fill_items(files_names, exec_after_added) # files_objects = self.get_files_objects(files_names) # self.append_items_to_tree(files_objects) # if exec_after_added: # exec_after_added(files_objects) def add_files_from_clipboard(self, exec_after_added=None): clipboard = QtGui.QApplication.clipboard() files_names = clipboard.text() if files_names: files_names = set(files_names.split('\n')) self.threads_fill_items(files_names, exec_after_added) def get_selected_items(self): selected_items = [] if self.tree_items: for item in self.dropTreeWidget.selectedItems(): # index = item.data(0, QtCore.Qt.UserRole) file_object = item.data(1, QtCore.Qt.UserRole) # print file_object # for i, itm in enumerate(self.tree_items): # print itm, i # if i == index: # selected_items.append(itm) # break selected_items.append(file_object) return selected_items def get_files_objects(self, items): if self.includeSubfoldersCheckBox.isChecked(): dirs_and_files = gf.split_files_and_dirs(items) for dirs in dirs_and_files[0]: for path, subdirs, files in os.walk(dirs): for name in files: items.append(os.path.join(path, name)) for s_dir in subdirs: items.append(os.path.join(path, s_dir)) match_template = gf.MatchTemplate( self.config_widget.get_templates_list(), padding=self.config_widget.get_min_padding()) return match_template.get_files_objects(items) def remove_selected_items(self): if self.tree_items: for item in self.dropTreeWidget.selectedItems(): index = item.data(0, QtCore.Qt.UserRole) for i, itm in enumerate(self.tree_items): if i == index: self.tree_items.pop(index) item_index = self.dropTreeWidget.indexFromItem(item) self.dropTreeWidget.takeTopLevelItem(item_index.row()) def append_items_to_tree(self, files_objects_dict): self.dropTreeWidget.clearSelection() icon_provider = QtGui.QFileIconProvider() self.progressBar.setVisible(True) for item_type, item in files_objects_dict.items(): for i, file_obj in enumerate(item): tree_item = QtGui.QTreeWidgetItem() tree_item.setText(0, file_obj.get_pretty_file_name()) sequence_info_string = [] frameranges = file_obj.get_sequence_frameranges_string('[]') tiles_count = file_obj.get_tiles_count() layer = file_obj.get_layer() if frameranges: sequence_info_string.append(frameranges) if tiles_count: sequence_info_string.append( '{0} Tile(s)'.format(tiles_count)) if layer: sequence_info_string.append(layer) tree_item.setText(1, ' / '.join(sequence_info_string)) tree_item.setText(2, file_obj.get_base_file_type_pretty_name()) tree_item.setText(3, file_obj.get_base_file_type()) tree_item.setText(4, file_obj.get_file_path()) file_icon = icon_provider.icon( file_obj.get_all_files_list(True)) tree_item.setIcon(0, file_icon) self.dropTreeWidget.addTopLevelItem(tree_item) # TODO fix this (we need to select all) # if self.dropTreeWidget.topLevelItemCount() < 50: # for performance reasons self.dropTreeWidget.setItemSelected(tree_item, True) # else: # self.dropTreeWidget.clearSelection() tree_item.setData(0, QtCore.Qt.UserRole, len(self.tree_items)) tree_item.setData(1, QtCore.Qt.UserRole, file_obj) self.tree_items.append(file_obj) # if i+1 % 50 == 0: # QtGui.QApplication.processEvents() self.progressBar.setValue(int(i + 1 * 100 / len(item))) self.progressBar.setValue(100) self.dropTreeWidget.resizeColumnToContents(0) self.dropTreeWidget.resizeColumnToContents(1) self.dropTreeWidget.resizeColumnToContents(2) self.dropTreeWidget.resizeColumnToContents(3) self.dropTreeWidget.resizeColumnToContents(4) # self.dropTreeWidget.sortByColumn(0, QtCore.Qt.AscendingOrder) self.progressBar.setVisible(False) def get_keep_filename(self): return self.keepFileNameCheckBox.isChecked() def set_settings_from_dict(self, settings_dict=None): ref_settings_dict = { 'includeSubfoldersCheckBox': False, 'keepFileNameCheckBox': False, 'groupCheckinCheckBox': False, } settings = gf.check_config(ref_settings_dict, settings_dict) self.includeSubfoldersCheckBox.setChecked( settings['includeSubfoldersCheckBox']) self.keepFileNameCheckBox.setChecked(settings['keepFileNameCheckBox']) self.groupCheckinCheckBox.setChecked(settings['groupCheckinCheckBox']) def get_settings_dict(self): settings_dict = { 'includeSubfoldersCheckBox': int(self.includeSubfoldersCheckBox.isChecked()), 'keepFileNameCheckBox': int(self.keepFileNameCheckBox.isChecked()), 'groupCheckinCheckBox': int(self.groupCheckinCheckBox.isChecked()), } return settings_dict def dragEnterEvent(self, event): if event.mimeData().hasUrls: event.accept() else: event.ignore() def dragMoveEvent(self, event): if event.mimeData().hasUrls: event.setDropAction(QtCore.Qt.CopyAction) event.accept() else: event.ignore() def dropEvent(self, event): # print event.mimeData() # print event.mimeData().text() # print event.mimeData().urls() if event.mimeData().hasUrls: event.setDropAction(QtCore.Qt.CopyAction) event.accept() links = [] for url in event.mimeData().urls(): links.append(url.toLocalFile()) self.threads_fill_items(links) else: event.ignore()
class Ui_tasksDockWidget(QtGui.QWidget): def __init__(self, project=None, parent=None): super(self.__class__, self).__init__(parent=parent) self.project = project self.sobject = None self.task_widgets_list = [] self.tasks_sobjects = None self.create_ui() self.controls_actions() def controls_actions(self): self.save_button.clicked.connect(self.save_tasks) self.refresh_button.clicked.connect(self.refresh_tasks) def create_ui(self): self.create_main_layout() self.create_toolbar() self.create_options_toolbar() self.create_stretch() self.create_scroll_area() self.create_no_notes_label() def create_main_layout(self): self.main_layout = QtGui.QGridLayout(self) self.main_layout.setSpacing(0) self.main_layout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.main_layout) def create_toolbar(self): self.collapsable_toolbar = Ui_horizontalCollapsableWidget() buttons_layout = QtGui.QHBoxLayout() buttons_layout.setSpacing(0) buttons_layout.setContentsMargins(0, 0, 0, 0) self.collapsable_toolbar.set_direction('right') self.collapsable_toolbar.setLayout(buttons_layout) self.collapsable_toolbar.setCollapsed(False) self.save_button = QtGui.QToolButton() self.save_button.setAutoRaise(True) self.save_button.setIcon( gf.get_icon('content-save', icons_set='mdi', scale_factor=1)) self.save_button.setToolTip('Save Current Changes') self.refresh_button = QtGui.QToolButton() self.refresh_button.setAutoRaise(True) self.refresh_button.setIcon( gf.get_icon('refresh', icons_set='mdi', scale_factor=1.3)) self.refresh_button.setToolTip('Refresh Current Tasks') buttons_layout.addWidget(self.save_button) buttons_layout.addWidget(self.refresh_button) self.main_layout.addWidget(self.collapsable_toolbar, 0, 0, 1, 1) def create_options_toolbar(self): self.collapsable_options_toolbar = Ui_horizontalCollapsableWidget() buttons_layout = QtGui.QHBoxLayout() buttons_layout.setSpacing(0) buttons_layout.setContentsMargins(0, 0, 0, 0) self.collapsable_options_toolbar.set_direction('right') self.collapsable_options_toolbar.setLayout(buttons_layout) self.collapsable_options_toolbar.setCollapsed(True) self.auto_save_check_box = QtGui.QCheckBox('Autosave') self.auto_save_check_box.setChecked(False) self.filter_process_check_box = QtGui.QCheckBox('Filter') self.filter_process_check_box.setChecked(False) self.process_combo_box = Ui_coloredComboBox() self.process_combo_box.setEnabled(False) QtCore.QObject.connect(self.filter_process_check_box, QtCore.SIGNAL("toggled(bool)"), self.process_combo_box.setEnabled) buttons_layout.addWidget(self.filter_process_check_box) buttons_layout.addWidget(self.process_combo_box) buttons_layout.addWidget(self.auto_save_check_box) self.main_layout.addWidget(self.collapsable_options_toolbar, 0, 1, 1, 1) def create_stretch(self): spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.main_layout.addItem(spacerItem, 0, 2, 1, 1) self.main_layout.setColumnStretch(2, 1) def create_scroll_area(self): from thlib.side.flowlayout import FlowLayout self.scroll_area_contents = QtGui.QWidget() self.scroll_area_contents.setContentsMargins(9, 9, 0, 0) self.scroll_area = QtGui.QScrollArea() self.scroll_area.setWidgetResizable(True) self.scroll_area.setWidget(self.scroll_area_contents) self.scroll_area_layout = FlowLayout(self.scroll_area_contents) self.scroll_area_layout.setAlignment(QtCore.Qt.AlignTop) self.scroll_area_layout.setContentsMargins(9, 9, 0, 0) self.scroll_area_layout.setSpacing(9) self.main_layout.addWidget(self.scroll_area, 1, 0, 1, 3) def create_no_notes_label(self): self.no_notes_label = QtGui.QLabel() self.no_notes_label.setMinimumSize(0, 0) self.no_notes_label.setText('Select Item to See Tasks...') self.no_notes_label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) self.scroll_area_layout.addWidget(self.no_notes_label) def toggle_no_notes_label(self): if self.no_notes_label.isVisible(): self.no_notes_label.setHidden(True) else: self.no_notes_label.setHidden(False) def save_tasks(self): # groupped_tasks_sobjects = tc.group_sobject_by(self.tasks_sobjects, 'process') # for process, task_sobjects in groupped_tasks_sobjects.items(): for task_widget in self.task_widgets_list: print task_widget.is_task_changed() # if task_widget.get_process() == process: # task_widget.set_tasks_sobjects(task_sobjects) def refresh_tasks(self): if self.sobject: self.task_widgets_list = [] self.create_filler_tasks() self.query_tasks() def query_tasks(self): def get_tasks_sobjects_agent(): return self.sobject.get_tasks_sobjects() env_inst.set_thread_pool(None, 'server_query/server_thread_pool') get_tasks_sobjects_worker = gf.get_thread_worker( get_tasks_sobjects_agent, env_inst.get_thread_pool('server_query/server_thread_pool'), result_func=self.fill_tasks, error_func=gf.error_handle, ) get_tasks_sobjects_worker.try_start() def create_filler_tasks(self): self.clear_scroll_area() self.process_combo_box.clear() stype = self.sobject.get_stype() # getting all possible processes here processes = [] pipeline_code = self.sobject.get_pipeline_code() current_pipeline = None if pipeline_code and stype.pipeline: current_pipeline = stype.pipeline.get(pipeline_code) if current_pipeline: processes = current_pipeline.pipeline.keys() # if self.ignore_dict: # if self.ignore_dict.get('show_builtins'): # show_all = True # for builtin in ['icon', 'attachment', 'publish']: # if builtin not in self.ignore_dict['builtins']: # processes.append(builtin) # show_all = False # if show_all: # processes.extend(['icon', 'attachment', 'publish']) for process in processes: process_info = current_pipeline.get_pipeline_info(process) ignored = False # Ignoring PROGRESS, ACTION, CONDITION processes # TODO Special case for progress, we should fetch completeness of progress node as in tactic. if process_info.get('type') in [ 'action', 'condition', 'dependency', 'progress' ]: ignored = True if not ignored: # Filling process combo box if process_info: process_color = process_info.get('color') if not process_color: process_object = current_pipeline.get_pipeline_process( process) if process_object: process_color = process_object.get('color') process_label = process_info.get('label') if process_label: if process_color: self.process_combo_box.add_item( process_label, hex_color=process_color, item_data=process) else: self.process_combo_box.add_item( process_label, hex_color='#484848', item_data=process) else: self.process_combo_box.add_item(process, hex_color='#484848', item_data=process) else: self.process_combo_box.add_item(process, hex_color='#484848', item_data=process) # creating and adding Simple task widgets task_widget = Ui_simpleTaskWidget(process, self.sobject) self.task_widgets_list.append(task_widget) self.scroll_area_layout.addWidget(task_widget) def clear_scroll_area(self): self.scroll_area_layout.clear_items() def fill_tasks(self, query_result): self.tasks_sobjects, info = query_result self.create_filler_tasks() groupped_tasks_sobjects = tc.group_sobject_by(self.tasks_sobjects, 'process') for process, task_sobjects in groupped_tasks_sobjects.items(): for task_widget in self.task_widgets_list: if task_widget.get_process() == process: task_widget.set_tasks_sobjects(task_sobjects) self.set_dock_title(u'Tasks For: {0}'.format(self.sobject.get_title())) def bring_dock_widget_up(self): related_tasks_dock = env_inst.get_check_tree( self.project.get_code(), 'checkin_out_instanced_widgets', 'tasks_dock') dock_widget = related_tasks_dock.parent() if dock_widget: if isinstance(dock_widget, QtGui.QDockWidget): dock_widget.setHidden(False) dock_widget.raise_() def set_dock_title(self, title_string): related_tasks_dock = env_inst.get_check_tree( self.project.get_code(), 'checkin_out_instanced_widgets', 'tasks_dock') dock_widget = related_tasks_dock.parent() if dock_widget: if isinstance(dock_widget, QtGui.QDockWidget): dock_widget.setWindowTitle(title_string) def set_sobject(self, sobject, force=False): # Do something only if widget is visible to user if force: self.task_widgets_list = [] self.sobject = sobject self.query_tasks() elif not self.visibleRegion().isEmpty(): self.task_widgets_list = [] self.sobject = sobject self.query_tasks()
class Ui_columnsEditorWidget(QtGui.QWidget): def __init__(self, project, stype, parent=None): super(self.__class__, self).__init__(parent=parent) self.project = project self.stype = stype self.item = None self.items = [] self.columns_widgets = [] self.multiple_mode = False self.current_active_tab = 0 self.create_ui() def create_ui(self): self.create_main_layout() self.create_toolbar() self.create_options_toolbar() self.create_stretch() self.create_tabbed_widget() self.controls_actions() def create_main_layout(self): self.main_layout = QtGui.QGridLayout() self.main_layout.setSpacing(0) self.main_layout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.main_layout) def controls_actions(self): self.save_button.clicked.connect(self.save_all_changes) self.refresh_button.clicked.connect(self.refresh) self.definition_combo_box.currentIndexChanged.connect(self.refresh) def create_toolbar(self): self.collapsable_toolbar = Ui_horizontalCollapsableWidget() buttons_layout = QtGui.QHBoxLayout() buttons_layout.setSpacing(0) buttons_layout.setContentsMargins(0, 0, 0, 0) self.collapsable_toolbar.set_direction('right') self.collapsable_toolbar.setLayout(buttons_layout) self.collapsable_toolbar.setCollapsed(False) self.save_button = QtGui.QToolButton() self.save_button.setAutoRaise(True) self.save_button.setIcon( gf.get_icon('content-save-all', icons_set='mdi', scale_factor=1)) self.save_button.setToolTip('Save Current Changes') self.refresh_button = QtGui.QToolButton() self.refresh_button.setAutoRaise(True) self.refresh_button.setIcon( gf.get_icon('refresh', icons_set='mdi', scale_factor=1.3)) self.refresh_button.setToolTip('Refresh Current Tasks') buttons_layout.addWidget(self.save_button) buttons_layout.addWidget(self.refresh_button) self.main_layout.addWidget(self.collapsable_toolbar, 0, 0, 1, 1) def create_options_toolbar(self): self.collapsable_options_toolbar = Ui_horizontalCollapsableWidget() buttons_layout = QtGui.QHBoxLayout() buttons_layout.setSpacing(9) buttons_layout.setContentsMargins(0, 0, 0, 0) self.collapsable_options_toolbar.set_direction('right') self.collapsable_options_toolbar.setLayout(buttons_layout) self.collapsable_options_toolbar.setCollapsed(True) self.auto_save_check_box = QtGui.QCheckBox('Autosave') self.auto_save_check_box.setChecked(False) self.definition_label = QtGui.QLabel('Definition: ') self.definition_combo_box = QtGui.QComboBox() buttons_layout.addWidget(self.definition_label) buttons_layout.addWidget(self.definition_combo_box) buttons_layout.addWidget(self.auto_save_check_box) self.main_layout.addWidget(self.collapsable_options_toolbar, 0, 1, 1, 1) def create_stretch(self): spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.main_layout.addItem(spacerItem, 0, 2, 1, 1) self.main_layout.setColumnStretch(2, 1) def fill_definition_combo_box(self): self.definition_combo_box.clear() stype = self.item.stype if stype.info.get('definition'): current_idx = 0 default_current_definition = 'table' for idx, definition in enumerate(stype.info['definition'].keys()): if definition == default_current_definition: current_idx = idx self.definition_combo_box.addItem(gf.prettify_text(definition)) self.definition_combo_box.setItemData(idx, definition, QtCore.Qt.UserRole) self.definition_combo_box.setCurrentIndex(current_idx) def save_all_changes(self): if self.multiple_mode: data_to_update = {} for item in self.items: update_dict = {} for column_widget in self.columns_widgets: changed_data = column_widget.get_changed_data() if changed_data is not None: update_dict[column_widget.get_column()] = changed_data if self.item.type == 'snapshot': sobject = item.get_snapshot() sobject.project = self.project # Snapshot class created without project in it else: sobject = item.get_sobject() data_to_update[sobject.get_search_key()] = update_dict return tc.server_start( project=self.project.get_code()).update_multiple( data=data_to_update, triggers=True) else: if self.item.type == 'snapshot': sobject = self.item.get_snapshot() sobject.project = self.project # Snapshot class created without project in it else: sobject = self.item.get_sobject() for column_widget in self.columns_widgets: changed_data = column_widget.get_changed_data() if changed_data is not None: sobject.set_value(column_widget.get_column(), changed_data) sobject.commit() def set_dock_title(self, title_string): checkin_out_widget = env_inst.get_check_tree(self.project.get_code(), 'checkin_out', self.stype.get_code()) columns_viewer_widget = checkin_out_widget.get_columns_viewer_widget() dock_widget = columns_viewer_widget.parent() if dock_widget: if isinstance(dock_widget, QtGui.QDockWidget): dock_widget.setWindowTitle(title_string) def refresh(self): if self.multiple_mode: self.customize_with_multiple_items() else: self.customize_with_item() def set_items(self, items_list): if not self.visibleRegion().isEmpty(): self.items = items_list self.fill_definition_combo_box() if self.items: self.customize_with_multiple_items() else: self.customize_without_item() def set_item(self, item): if not self.visibleRegion().isEmpty(): self.item = item s = gf.time_it() # self.fill_definition_combo_box() gf.time_it(s) if self.item: self.customize_with_item() else: self.customize_without_item() def customize_with_multiple_items(self): self.multiple_mode = True self.current_active_tab = self.columns_tab_widget.currentIndex() self.columns_tab_widget.clear() self.columns_widgets = [] self.set_dock_title(u'Multiple Editing Mode for: {0} items'.format( len(self.items))) table_columns = [] stype = self.item.stype idx = self.definition_combo_box.currentIndex() current_definition = self.definition_combo_box.itemData( idx, QtCore.Qt.UserRole) if not current_definition: current_definition = 'table' for i in stype.get_definition(current_definition): table_columns.append(i.get('name')) exclude_columns = [ '__search_type__', '__search_key__', '__tasks_count__', '__notes_count__', '__snapshots__' ] if self.item.type == 'snapshot': sobject = self.item.get_snapshot() else: sobject = self.item.get_sobject() if sobject: sobject_dict = sobject.get_info() for column, val in sobject_dict.items(): if column not in exclude_columns: if column in table_columns: column_editor = Ui_tacticColumnEditorWidget( sobject, column, stype, multiple_mode=True) column_title = None for j in stype.get_definition('definition'): if j.get('name') == column: column_title = j.get('title') if not column_title: column_title = gf.prettify_text(column) self.columns_widgets.append(column_editor) self.columns_tab_widget.addTab( column_editor, u'{0} | {1}'.format(column_title, len(self.items))) self.columns_tab_widget.setCurrentIndex(self.current_active_tab) def customize_with_item(self): self.multiple_mode = False # TODO save tabs names with their stypes self.current_active_tab = self.columns_tab_widget.currentIndex() self.columns_tab_widget.clear() self.columns_widgets = [] table_columns = [] stype = self.item.stype idx = self.definition_combo_box.currentIndex() current_definition = self.definition_combo_box.itemData( idx, QtCore.Qt.UserRole) if not current_definition: current_definition = 'edit' for i in stype.get_definition(current_definition): table_columns.append(i.get('name')) exclude_columns = [ '__search_type__', '__search_key__', '__tasks_count__', '__notes_count__', '__snapshots__', 'preview' ] if self.item.type == 'snapshot': sobject = self.item.get_snapshot() else: sobject = self.item.get_sobject() if sobject: self.set_dock_title(u'Editing Columns of: {0}'.format( sobject.get_title())) for column in table_columns: if column not in exclude_columns: if column in table_columns: column_editor = Ui_tacticColumnEditorWidget( sobject, column, stype) column_title = None for j in stype.get_definition('definition'): if j.get('name') == column: column_title = j.get('title') if not column_title: column_title = gf.prettify_text(column) self.columns_widgets.append(column_editor) self.columns_tab_widget.addTab(column_editor, column_title) self.columns_tab_widget.setCurrentIndex(self.current_active_tab) def customize_without_item(self): self.multiple_mode = False self.item = None self.items = [] self.columns_widgets = [] self.columns_tab_widget.clear() self.set_dock_title(u'Columns Editor') def create_tabbed_widget(self): self.columns_tab_widget = QtGui.QTabWidget(self) self.columns_tab_widget.setMovable(True) self.columns_tab_widget.setTabsClosable(False) self.columns_tab_widget.setObjectName("notes_tab_widget") self.columns_tab_widget.setStyleSheet( '#notes_tab_widget > 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;}' '#notes_tab_widget > QTabBar::tab:selected, #notes_tab_widget > 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));}' '#notes_tab_widget > QTabBar::tab:selected {border-color: transparent;}' '#notes_tab_widget > QTabBar::tab:!selected {margin-top: 0px;}') self.main_layout.addWidget(self.columns_tab_widget, 1, 0, 1, 3)
class Ui_ScriptEditForm(QtGui.QDialog): def __init__(self, parent=None): super(self.__class__, self).__init__(parent=parent) self.shown = False self.sripts_languages = [ ('Local-Python', 'local_python'), ('Server-Python', 'python'), ('Javascript', 'javascript'), ('Server-JS', 'server_js'), ('Expression', 'expression'), ('Xml', 'xml'), ] self.current_script_sobject = None env_inst.ui_script_editor = self self.ui_settings_dict = {} self.create_ui() self.controls_actions() def create_ui(self): self.setWindowTitle('Script editor') self.setObjectName("scriptEditForm") self.resize(720, 550) self.setSizeGripEnabled(True) self.setWindowFlags(QtCore.Qt.Window) font = Qt4Gui.QFont() font.setPointSize(10) font.setFamily('Courier') self.main_grid_layout = QtGui.QGridLayout(self) self.setLayout(self.main_grid_layout) self.main_grid_layout.setObjectName("main_grid_layout") self.main_splitter = QtGui.QSplitter(self) self.main_splitter.setOrientation(QtCore.Qt.Horizontal) self.main_splitter.setObjectName("main_splitter") self.verticalLayoutWidget = QtGui.QWidget(self.main_splitter) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.script_editor_vertical_layout = QtGui.QVBoxLayout( self.verticalLayoutWidget) self.script_editor_vertical_layout.setContentsMargins(0, 0, 0, 0) self.script_editor_vertical_layout.setObjectName( "script_editor_vertical_layout") self.script_path_horizontal_layout = QtGui.QHBoxLayout() self.script_path_horizontal_layout.setObjectName( "script_path_horizontal_layout") self.path_label = QtGui.QLabel(self.verticalLayoutWidget) self.path_label.setObjectName("path_label") self.path_label.setText('Script path: ') self.first_path_part_line_edit = QtGui.QLineEdit( self.verticalLayoutWidget) self.first_path_part_line_edit.setObjectName( "first_path_part_line_edit") self.slash_label = QtGui.QLabel(self.verticalLayoutWidget) self.slash_label.setObjectName("slash_label") self.slash_label.setText(' / ') self.second_path_part_line_edit = QtGui.QLineEdit( self.verticalLayoutWidget) self.second_path_part_line_edit.setObjectName( "second_path_part_line_edit") self.script_language_combo_box = QtGui.QComboBox( self.verticalLayoutWidget) for script in self.sripts_languages: self.script_language_combo_box.addItem(script[0]) self.create_left_collapsable_toolbar() self.create_right_collapsable_toolbar() self.script_path_horizontal_layout.addWidget( self.left_collapsable_toolbar) self.script_path_horizontal_layout.setStretch(0, 0) self.script_path_horizontal_layout.addWidget(self.path_label) self.script_path_horizontal_layout.setStretch(1, 0) self.script_path_horizontal_layout.addWidget( self.first_path_part_line_edit) self.script_path_horizontal_layout.setStretch(2, 1) self.script_path_horizontal_layout.addWidget(self.slash_label) self.script_path_horizontal_layout.setStretch(3, 0) self.script_path_horizontal_layout.addWidget( self.second_path_part_line_edit) self.script_path_horizontal_layout.setStretch(4, 1) self.script_path_horizontal_layout.addWidget( self.script_language_combo_box) self.script_path_horizontal_layout.setStretch(5, 0) self.script_path_horizontal_layout.addWidget( self.right_collapsable_toolbar) self.script_path_horizontal_layout.setStretch(6, 0) self.script_editor_vertical_layout.addLayout( self.script_path_horizontal_layout) self.splitter = QtGui.QSplitter(self.verticalLayoutWidget) self.splitter.setOrientation(QtCore.Qt.Vertical) self.splitter.setObjectName("splitter") self.output = output_window.OutputWindow(self) self.output.setFont(font) self.splitter.addWidget(self.output) self.console = editor_window.EditorWindow(self) self.console.setFont(font) self.splitter.addWidget(self.console) self.script_editor_vertical_layout.addWidget(self.splitter) self.down_buttons_horizontal_layout = QtGui.QHBoxLayout() self.down_buttons_horizontal_layout.setObjectName( "down_buttons_horizontal_layout") self.run_script_button = QtGui.QPushButton(self.verticalLayoutWidget) self.run_script_button.setObjectName("run_script_button") self.run_script_button.setText('Run Script') self.run_script_button.setFlat(True) self.run_script_button.setIcon(gf.get_icon('play', icons_set='mdi')) self.execute_label = QtGui.QLabel(self.verticalLayoutWidget) self.execute_label.setObjectName("execute_label") self.execute_label.setText('Execute: ') self.run_type_combo_box = QtGui.QComboBox(self.verticalLayoutWidget) self.run_type_combo_box.setObjectName("run_type_combo_box") self.run_type_combo_box.addItem('Locally') self.run_type_combo_box.addItem('Server-Side') spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.down_buttons_horizontal_layout.addWidget(self.run_script_button) self.down_buttons_horizontal_layout.addItem(spacerItem) self.down_buttons_horizontal_layout.addWidget(self.execute_label) self.down_buttons_horizontal_layout.addWidget(self.run_type_combo_box) self.script_editor_vertical_layout.addLayout( self.down_buttons_horizontal_layout) self.scripts_tree_widget = QtGui.QTreeWidget(self.main_splitter) self.scripts_tree_widget.setAlternatingRowColors(True) self.scripts_tree_widget.setAllColumnsShowFocus(True) self.scripts_tree_widget.setVerticalScrollMode( QtGui.QAbstractItemView.ScrollPerPixel) self.scripts_tree_widget.setStyleSheet(gf.get_qtreeview_style()) self.scripts_tree_widget.setSelectionMode( QtGui.QAbstractItemView.SingleSelection) self.scripts_tree_widget.setEditTriggers( QtGui.QAbstractItemView.NoEditTriggers) self.scripts_tree_widget.setRootIsDecorated(True) self.scripts_tree_widget.setHeaderHidden(True) self.scripts_tree_widget.setObjectName('scripts_tree_widget') self.scripts_tree_widget.setColumnCount(2) self.main_grid_layout.addWidget(self.main_splitter) self.stream = stream.Stream.get_stream() if self.stream is None: self.stream = stream.Stream() self.console_obj = console.Console() if env_inst.get_current_project(): self.fill_sctipts_tree_widget() self.create_scripts_tree_context_menu() def controls_actions(self): self.run_script_button.clicked.connect(self.run_script) self.stream.outputWritten.connect(self.output.write_output) self.stream.errorWritten.connect(self.output.write_error) self.stream.inputWritten.connect(self.output.write_input) self.scripts_tree_widget.itemSelectionChanged.connect( self.scripts_tree_widget_items_selection_changed) self.scripts_tree_widget.itemExpanded.connect( lambda: self.scripts_tree_widget.resizeColumnToContents(0)) self.add_new_script_button.clicked.connect(self.create_new_script) self.save_current_script_button.clicked.connect( self.save_current_script) self.refresh_serverside_scripts_button.clicked.connect( self.refresh_scripts_tree) self.cleanup_output_button.clicked.connect(self.cleanup_output) self.script_language_combo_box.currentIndexChanged.connect( self.handle_scripts_language_combo_box) def create_right_collapsable_toolbar(self): self.right_collapsable_toolbar = Ui_horizontalCollapsableWidget() self.right_collapsable_toolbar.setCollapsed(False) self.right_buttons_layout = QtGui.QHBoxLayout() self.right_buttons_layout.setSpacing(0) self.right_buttons_layout.setContentsMargins(0, 0, 0, 0) self.right_collapsable_toolbar.setLayout(self.right_buttons_layout) self.refresh_serverside_scripts_button = QtGui.QToolButton() self.refresh_serverside_scripts_button.setToolButtonStyle( QtCore.Qt.ToolButtonIconOnly) self.refresh_serverside_scripts_button.setAutoRaise(True) self.refresh_serverside_scripts_button.setMinimumSize( QtCore.QSize(24, 24)) self.refresh_serverside_scripts_button.setMaximumSize( QtCore.QSize(24, 24)) self.refresh_serverside_scripts_button.setIcon( gf.get_icon('refresh', icons_set='mdi')) self.refresh_serverside_scripts_button.setToolTip( 'Refresh all Scripts Tree from Server') self.right_buttons_layout.addWidget( self.refresh_serverside_scripts_button) def create_left_collapsable_toolbar(self): self.left_collapsable_toolbar = Ui_horizontalCollapsableWidget() self.left_collapsable_toolbar.setCollapsed(False) self.left_buttons_layout = QtGui.QHBoxLayout() self.left_buttons_layout.setSpacing(0) self.left_buttons_layout.setContentsMargins(0, 0, 0, 0) self.left_collapsable_toolbar.setLayout(self.left_buttons_layout) self.add_new_script_button = QtGui.QToolButton() self.add_new_script_button.setToolButtonStyle( QtCore.Qt.ToolButtonIconOnly) self.add_new_script_button.setAutoRaise(True) self.add_new_script_button.setMinimumSize(QtCore.QSize(24, 24)) self.add_new_script_button.setMaximumSize(QtCore.QSize(24, 24)) self.add_new_script_button.setIcon( gf.get_icon('plus-box', icons_set='mdi')) self.add_new_script_button.setToolTip('Create New Script') self.cleanup_output_button = QtGui.QToolButton() self.cleanup_output_button.setToolButtonStyle( QtCore.Qt.ToolButtonIconOnly) self.cleanup_output_button.setAutoRaise(True) self.cleanup_output_button.setMinimumSize(QtCore.QSize(24, 24)) self.cleanup_output_button.setMaximumSize(QtCore.QSize(24, 24)) self.cleanup_output_button.setIcon( gf.get_icon('eraser', icons_set='mdi')) self.cleanup_output_button.setToolTip('Clean-up Output Window') self.save_current_script_button = QtGui.QToolButton() self.save_current_script_button.setToolButtonStyle( QtCore.Qt.ToolButtonIconOnly) self.save_current_script_button.setAutoRaise(True) self.save_current_script_button.setMinimumSize(QtCore.QSize(24, 24)) self.save_current_script_button.setMaximumSize(QtCore.QSize(24, 24)) self.save_current_script_button.setIcon( gf.get_icon('content-save', icons_set='mdi')) self.save_current_script_button.setToolTip( 'Save current Script to Sever') self.left_buttons_layout.addWidget(self.add_new_script_button) self.left_buttons_layout.addWidget(self.save_current_script_button) self.left_buttons_layout.addWidget(self.cleanup_output_button) def scripts_tree_widget_items_selection_changed(self): if self.scripts_tree_widget.selectedItems(): current_scripts_tree_widget_item = self.scripts_tree_widget.selectedItems( )[0] script_sobject = current_scripts_tree_widget_item.data( 0, QtCore.Qt.UserRole) if not isinstance(script_sobject, list): self.fill_by_sobject(script_sobject) def fill_by_sobject(self, sobject): self.current_script_sobject = sobject self.console.setPlainText(sobject.get_value('script')) self.first_path_part_line_edit.setText(sobject.get_value('folder')) self.second_path_part_line_edit.setText(sobject.get_value('title')) lang = sobject.get_value('language') if lang == 'local_python': self.run_type_combo_box.setCurrentIndex(0) else: self.run_type_combo_box.setCurrentIndex(1) for i, lng in enumerate(self.sripts_languages): if lng[1] == lang: self.script_language_combo_box.setCurrentIndex(i) def handle_scripts_language_combo_box(self, i): if i is not None: self.run_type_combo_box.setEnabled(True) self.run_script_button.setEnabled(True) selected_language = self.sripts_languages[int(i)] if selected_language[1] == 'local_python': self.run_type_combo_box.setCurrentIndex(0) elif selected_language[1] in ['server_js', 'python', 'expression']: self.run_type_combo_box.setCurrentIndex(1) else: self.run_type_combo_box.setEnabled(False) self.run_script_button.setEnabled(False) #@env_inst.async_engine def fill_sctipts_tree_widget(self, async_run=True): # getting all the scripts from db # if async_run: # scripts_sobjects = yield env_inst.async_task(tc.get_custom_scripts) # else: scripts_sobjects = tc.get_custom_scripts() if scripts_sobjects: scripts_sobjects_by_folder = tc.group_sobject_by( scripts_sobjects, 'folder') # adding scripts to tree widget for folder_path, sobjects_list in scripts_sobjects_by_folder.items( ): paths_list = folder_path.split('/') exist_item = gf.check_tree_items_exists( self.scripts_tree_widget, paths_list[0]) if len(paths_list) > 1: paths_list.reverse() top_item_title = paths_list.pop() if exist_item: gf.recursive_add_items(exist_item, paths_list, sobjects_list) else: root_item = QtGui.QTreeWidgetItem( self.scripts_tree_widget) root_item.setText(0, top_item_title) root_item.setData(0, 12, top_item_title) root_item.setData(0, QtCore.Qt.UserRole, sobjects_list) root_item.setIcon( 0, gf.get_icon('folder', icons_set='mdi')) gf.recursive_add_items(root_item, paths_list, sobjects_list) self.scripts_tree_widget.addTopLevelItem(root_item) else: if exist_item: for sobject in sobjects_list: gf.add_child_items(exist_item, sobject) else: root_item = QtGui.QTreeWidgetItem( self.scripts_tree_widget) root_item.setText(0, folder_path) root_item.setData(0, 12, folder_path) root_item.setData(0, QtCore.Qt.UserRole, sobjects_list) root_item.setIcon( 0, gf.get_icon('folder', icons_set='mdi')) self.scripts_tree_widget.addTopLevelItem(root_item) for sobject in sobjects_list: gf.add_child_items(root_item, sobject) def get_current_script_language(self): current_idx = self.script_language_combo_box.currentIndex() return self.sripts_languages[current_idx] def get_current_script(self): return self.console.toPlainText() def get_current_script_sobject(self): return self.current_script_sobject def execute_source_code(self, source_code): self.console_obj.enter(source_code) def run_locally(self, whole=False): if self.run_script_button.isEnabled(): if whole: text = self.console.toPlainText() else: text = self.console.selectedText() text = text.replace(u"\u2029", "\n") text = text.replace(u"\u2028", "\n") if not text or text == "": text = self.console.toPlainText() self.stream.input(text) self.output.moveCursor(Qt4Gui.QTextCursor.End) self.output.scroll_to_bottom() self.execute_source_code(text) def run_serverside(self, whole=True): if self.run_script_button.isEnabled(): if whole: text = self.console.toPlainText() else: text = self.console.selectedText() self.stream.input(text) text = text.replace(u"\u2029", "\n") text = text.replace(u"\u2028", "\n") if not text or text == "": text = self.console.toPlainText() self.output.moveCursor(Qt4Gui.QTextCursor.End) self.output.scroll_to_bottom() code_dict = {'code': text} start = time.time() result = tc.execute_procedure_serverside(lambda: None, code_dict) print('\nServe-Side execution time: {}\n'.format(time.time() - start)) gf.pp(result) def run_script(self): if self.run_type_combo_box.currentIndex() == 0: self.run_locally() elif self.run_type_combo_box.currentIndex() == 1: self.run_serverside() def cleanup_output(self): self.output.clear() def refresh_scripts_tree(self, async_run=True, revert=True): if revert: state = self.get_scripts_tree_state() self.scripts_tree_widget.clear() self.fill_sctipts_tree_widget(async_run) if revert: self.revert_scripts_tree_state(state) def create_scripts_tree_context_menu(self): self.scripts_tree_widget.setContextMenuPolicy( QtCore.Qt.CustomContextMenu) self.scripts_tree_widget.customContextMenuRequested.connect( self.open_menu) def open_menu(self): item = self.scripts_tree_widget.currentItem() if item: if item.data(0, QtCore.Qt.UserRole): menu = self.scripts_context_menu() if menu: menu.exec_(Qt4Gui.QCursor.pos()) def create_execution_script(self): item = self.scripts_tree_widget.currentItem() sobject = item.data(0, QtCore.Qt.UserRole) if sobject: project = sobject.get_project() script_folder = self.first_path_part_line_edit.text() script_title = self.second_path_part_line_edit.text() script_path = script_folder + '/' + script_title procedure = u"import thlib.environment as thenv\nthenv.tc().execute_custom_script('{0}', project='{1}')" clipboard = QtGui.QApplication.instance().clipboard() clipboard.setText(procedure.format(script_path, project.get_code())) def scripts_context_menu(self): copy_runner_script = QtGui.QAction('Copy Script Runner', self.scripts_tree_widget) copy_runner_script.setIcon(gf.get_icon('copy')) copy_runner_script.triggered.connect(self.create_execution_script) delete_sobject = QtGui.QAction('Delete', self.scripts_tree_widget) delete_sobject.setIcon(gf.get_icon('remove')) delete_sobject.triggered.connect(self.delete_script_sobject) menu = QtGui.QMenu() menu.addAction(copy_runner_script) menu.addAction(delete_sobject) return menu def delete_script_sobject(self): item = self.scripts_tree_widget.currentItem() sobject = item.data(0, QtCore.Qt.UserRole) if sobject: sobject.delete_sobject() self.refresh_scripts_tree() def create_new_script(self): self.console.clear() self.current_script_sobject = None self.first_path_part_line_edit.setText('') self.second_path_part_line_edit.setText('') self.script_language_combo_box.setCurrentIndex(0) self.run_type_combo_box.setCurrentIndex(0) self.refresh_scripts_tree(revert=False) def save_current_script(self): script_folder = self.first_path_part_line_edit.text() script_title = self.second_path_part_line_edit.text() current_language = self.get_current_script_language()[1] if script_folder and script_title: script_sobject = self.get_current_script_sobject() if script_sobject: script_sobject.set_value('script', self.get_current_script()) script_sobject.set_value('language', current_language) script_sobject.set_value('folder', script_folder) script_sobject.set_value('title', script_title) script_sobject.commit(False) else: search_type = tc.server_start().build_search_type( 'config/custom_script', project_code=env_inst.get_current_project()) filters = [('script', self.get_current_script()), ('folder', script_folder), ('title', script_title), ('language', current_language)] tc.server_start().insert(search_type, dict(filters)) self.refresh_scripts_tree() def get_scripts_tree_state(self): return gf.to_json(gf.tree_state(self.scripts_tree_widget, {}), use_ast=True) def revert_scripts_tree_state(self, state_raw): state = gf.from_json(state_raw, use_ast=True) gf.tree_state_revert(self.scripts_tree_widget, state, use_item_widgets=False) def set_settings_from_dict(self, settings_dict=None): ref_settings_dict = { 'pos': self.pos().toTuple(), 'size': self.size().toTuple(), 'windowState': False, 'main_splitter': None, 'splitter': None, 'scripts_tree_widget': None, } 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) if settings['main_splitter']: self.main_splitter.restoreState( QtCore.QByteArray.fromHex( six.ensure_binary(settings['main_splitter']))) if settings['splitter']: self.splitter.restoreState( QtCore.QByteArray.fromHex( six.ensure_binary(settings['splitter']))) if settings['scripts_tree_widget']: self.revert_scripts_tree_state(settings['scripts_tree_widget']) def get_settings_dict(self): settings_dict = { 'windowState': False, 'main_splitter': gf.do_str(self.main_splitter.saveState().toHex()), 'splitter': gf.do_str(self.splitter.saveState().toHex()), 'scripts_tree_widget': self.get_scripts_tree_state(), } 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 return settings_dict def readSettings(self): self.ui_settings_dict = env_read_config(filename='ui_script_editor', 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_script_editor', unique_id='ui_main', long_abs_path=True) def showEvent(self, event): if not self.shown: self.refresh_scripts_tree() self.readSettings() self.shown = True event.accept() def closeEvent(self, event): self.writeSettings() event.accept()