def show_new_program_wizard(self): self.button_new.setEnabled(False) if self.stacked_container.count() > 1: current_widget = self.stacked_container.currentWidget() else: current_widget = None if current_widget != None: current_widget.set_program_callbacks_enabled(False) identifiers = [] for i in range(self.list_programs.count()): identifiers.append(self.list_programs.item(i).data(Qt.UserRole).program.identifier) context = ProgramWizardContext(self.session, identifiers, self.script_manager, self.image_version, self.executable_versions) self.new_program_wizard = ProgramWizardNew(self, context) self.new_program_wizard.exec_() if self.new_program_wizard.upload_successful: self.add_program_to_list(self.new_program_wizard.program) self.list_programs.item(self.list_programs.count() - 1).setSelected(True) if self.tab_is_alive: self.new_program_wizard = None if current_widget != None: current_widget.set_program_callbacks_enabled(True) self.button_new.setEnabled(True)
def show_new_program_wizard(self): self.button_new.setEnabled(False) if self.stacked_container.count() > 1: current_widget = self.stacked_container.currentWidget() else: current_widget = None if current_widget != None: current_widget.set_program_callbacks_enabled(False) identifiers = [] for i in range(self.tree_programs.topLevelItemCount()): identifiers.append( self.tree_programs.topLevelItem(i).data( 0, Qt.UserRole).program.identifier) context = ProgramWizardContext(self.session, identifiers, self.script_manager, self.image_version, self.executable_versions) self.new_program_wizard = ProgramWizardNew(self, context) self.new_program_wizard.exec_() if self.new_program_wizard.upload_successful: self.add_program_to_tree(self.new_program_wizard.program) self.tree_programs.topLevelItem( self.tree_programs.topLevelItemCount() - 1).setSelected(True) for i in reversed(range(self.tree_programs.topLevelItemCount() - 1)): self.tree_programs.topLevelItem(i).setSelected(False) if self.tab_is_alive: self.new_program_wizard = None if current_widget != None: current_widget.set_program_callbacks_enabled(True) self.button_new.setEnabled(True)
class REDTabProgram(REDTab, Ui_REDTabProgram): def __init__(self): REDTab.__init__(self) self.setupUi(self) self.executable_versions = { 'fpc': None, 'gcc': None, 'java': None, 'mono': None, 'nodejs': None, 'octave': None, 'perl': None, 'php': None, 'python': None, 'ruby': None, 'shell': None } self.first_tab_on_focus = True self.tab_is_alive = True self.refresh_in_progress = False self.new_program_wizard = None self.splitter.setSizes([175, 400]) self.tree_programs.setColumnWidth(0, 150) self.tree_programs.setColumnWidth(1, 50) self.tree_programs.itemSelectionChanged.connect(self.update_ui_state) self.button_refresh.clicked.connect(self.refresh_program_tree) self.button_new.clicked.connect(self.show_new_program_wizard) self.button_delete.clicked.connect(self.purge_selected_program) self.update_ui_state() def tab_on_focus(self): if self.first_tab_on_focus: self.first_tab_on_focus = False QTimer.singleShot(1, self.refresh_program_tree) QTimer.singleShot(1, self.refresh_executable_versions) def tab_off_focus(self): pass def tab_destroy(self): self.tab_is_alive = False if self.new_program_wizard != None: self.new_program_wizard.close() for i in range(self.stacked_container.count()): widget = self.stacked_container.widget(i) if isinstance(widget, ProgramInfoMain): widget.close_all_dialogs() def update_ui_state(self): if self.refresh_in_progress: self.progress_refresh.setVisible(True) self.button_refresh.setText('Refreshing...') self.button_refresh.setEnabled(False) self.button_new.setEnabled(False) self.button_delete.setEnabled(False) else: self.progress_refresh.setVisible(False) self.button_refresh.setText('Refresh') self.button_refresh.setEnabled(True) self.button_new.setEnabled(True) has_selection = len(self.tree_programs.selectedItems()) > 0 if not has_selection and self.tree_programs.topLevelItemCount( ) > 0: self.tree_programs.topLevelItem(0).setSelected(True) has_selection = True if has_selection: index = self.tree_programs.indexOfTopLevelItem( self.tree_programs.selectedItems()[0]) self.stacked_container.setCurrentIndex(index + 1) self.button_delete.setEnabled(has_selection) def add_program_to_tree(self, program): program_info = ProgramInfoMain(self.session, self.script_manager, self.image_version, self.executable_versions, program) program_info.name_changed.connect(self.refresh_program_name) program_info.status_changed.connect(self.refresh_program_status) item = QTreeWidgetItem([ program.cast_custom_option_value('name', unicode, '<unknown>'), get_program_short_status(program) ]) item.setData(0, Qt.UserRole, program_info) self.tree_programs.addTopLevelItem(item) self.stacked_container.addWidget(program_info) def refresh_program_tree(self): def refresh_async(): return get_programs(self.session) def cb_success(programs): sorted_programs = {} for program in programs: first_upload = program.cast_custom_option_value( 'first_upload', int, 0) if first_upload in sorted_programs: sorted_programs[first_upload][program.identifier] = program else: sorted_programs[first_upload] = { program.identifier: program } for first_upload in sorted(sorted_programs.keys()): for identifier in sorted(sorted_programs[first_upload].keys()): self.add_program_to_tree( sorted_programs[first_upload][identifier]) self.refresh_in_progress = False self.update_ui_state() self.stacked_container.setCurrentIndex(1) def cb_error(): pass # FIXME: report error self.refresh_in_progress = True self.update_ui_state() self.tree_programs.clear() QApplication.processEvents() # move help widget to front so the other widgets wont show and update during removal self.stacked_container.setCurrentWidget(self.widget_help) while self.stacked_container.count() > 1: self.stacked_container.removeWidget( self.stacked_container.widget(1)) QApplication.processEvents() async_call(refresh_async, None, cb_success, cb_error) def refresh_program_name(self, program): for i in range(self.tree_programs.topLevelItemCount()): item = self.tree_programs.topLevelItem(i) if item.data(0, Qt.UserRole).program == program: item.setText( 0, program.cast_custom_option_value('name', unicode, '<unknown>')) def refresh_program_status(self, program): for i in range(self.tree_programs.topLevelItemCount()): item = self.tree_programs.topLevelItem(i) if item.data(0, Qt.UserRole).program == program: item.setText(1, get_program_short_status(program)) def refresh_executable_versions(self): def cb_versions(executable_name, versions): self.executable_versions[executable_name] = versions get_fpc_versions(self.script_manager, lambda versions: cb_versions('fpc', versions)) get_gcc_versions(self.script_manager, lambda versions: cb_versions('gcc', versions)) get_lazbuild_versions( self.script_manager, lambda versions: cb_versions('lazbuild', versions)) get_java_versions(self.script_manager, lambda versions: cb_versions('java', versions)) get_mono_versions(self.script_manager, lambda versions: cb_versions('mono', versions)) get_nodejs_versions(self.script_manager, lambda versions: cb_versions('nodejs', versions)) get_octave_versions(self.script_manager, lambda versions: cb_versions('octave', versions)) get_perl_versions(self.script_manager, lambda versions: cb_versions('perl', versions)) get_php_versions(self.script_manager, lambda versions: cb_versions('php', versions)) get_python_versions(self.script_manager, lambda versions: cb_versions('python', versions)) get_ruby_versions(self.script_manager, lambda versions: cb_versions('ruby', versions)) get_shell_versions(self.script_manager, lambda versions: cb_versions('shell', versions)) def show_new_program_wizard(self): self.button_new.setEnabled(False) if self.stacked_container.count() > 1: current_widget = self.stacked_container.currentWidget() else: current_widget = None if current_widget != None: current_widget.set_program_callbacks_enabled(False) identifiers = [] for i in range(self.tree_programs.topLevelItemCount()): identifiers.append( self.tree_programs.topLevelItem(i).data( 0, Qt.UserRole).program.identifier) context = ProgramWizardContext(self.session, identifiers, self.script_manager, self.image_version, self.executable_versions) self.new_program_wizard = ProgramWizardNew(self, context) self.new_program_wizard.exec_() if self.new_program_wizard.upload_successful: self.add_program_to_tree(self.new_program_wizard.program) self.tree_programs.topLevelItem( self.tree_programs.topLevelItemCount() - 1).setSelected(True) for i in reversed(range(self.tree_programs.topLevelItemCount() - 1)): self.tree_programs.topLevelItem(i).setSelected(False) if self.tab_is_alive: self.new_program_wizard = None if current_widget != None: current_widget.set_program_callbacks_enabled(True) self.button_new.setEnabled(True) def purge_selected_program(self): selected_items = self.tree_programs.selectedItems() if len(selected_items) == 0: return program_info = selected_items[0].data(0, Qt.UserRole) program = program_info.program name = program.cast_custom_option_value('name', unicode, '<unknown>') button = QMessageBox.question( get_main_window(), 'Delete Program', u'Deleting program [{0}] is irreversible. All files of this program will be deleted.' .format(name), QMessageBox.Ok, QMessageBox.Cancel) if not self.tab_is_alive or button != QMessageBox.Ok: return program_info.name_changed.disconnect(self.refresh_program_name) program_info.status_changed.disconnect(self.refresh_program_status) try: program.purge() # FIXME: async_call except (Error, REDError) as e: QMessageBox.critical( get_main_window(), 'Delete Program Error', u'Could not delete program [{0}]:\n\n{1}'.format(name, e)) return self.stacked_container.removeWidget(program_info) self.tree_programs.takeTopLevelItem( self.tree_programs.indexOfTopLevelItem(selected_items[0])) self.update_ui_state()
class REDTabProgram(REDTab, Ui_REDTabProgram): def __init__(self): REDTab.__init__(self) self.setupUi(self) self.executable_versions = { 'fpc': None, 'gcc': None, 'java': None, 'mono': None, 'nodejs': None, 'octave': None, 'perl': None, 'php': None, 'python': None, 'ruby': None, 'shell': None } self.first_tab_on_focus = True self.tab_is_alive = True self.refresh_in_progress = False self.new_program_wizard = None self.splitter.setSizes([175, 400]) self.tree_programs.setColumnWidth(0, 150) self.tree_programs.setColumnWidth(1, 50) self.tree_programs.itemSelectionChanged.connect(self.update_ui_state) self.button_refresh.clicked.connect(self.refresh_program_tree) self.button_new.clicked.connect(self.show_new_program_wizard) self.button_delete.clicked.connect(self.purge_selected_program) self.update_ui_state() def tab_on_focus(self): if self.first_tab_on_focus: self.first_tab_on_focus = False QTimer.singleShot(1, self.refresh_program_tree) QTimer.singleShot(1, self.refresh_executable_versions) def tab_off_focus(self): pass def tab_destroy(self): self.tab_is_alive = False if self.new_program_wizard != None: self.new_program_wizard.close() for i in range(self.stacked_container.count()): widget = self.stacked_container.widget(i) if isinstance(widget, ProgramInfoMain): widget.close_all_dialogs() def update_ui_state(self): if self.refresh_in_progress: self.progress_refresh.setVisible(True) self.button_refresh.setText('Refreshing...') self.button_refresh.setEnabled(False) self.button_new.setEnabled(False) self.button_delete.setEnabled(False) else: self.progress_refresh.setVisible(False) self.button_refresh.setText('Refresh') self.button_refresh.setEnabled(True) self.button_new.setEnabled(True) has_selection = len(self.tree_programs.selectedItems()) > 0 if not has_selection and self.tree_programs.topLevelItemCount() > 0: self.tree_programs.topLevelItem(0).setSelected(True) has_selection = True if has_selection: index = self.tree_programs.indexOfTopLevelItem(self.tree_programs.selectedItems()[0]) self.stacked_container.setCurrentIndex(index + 1) self.button_delete.setEnabled(has_selection) def add_program_to_tree(self, program): program_info = ProgramInfoMain(self.session, self.script_manager, self.image_version, self.executable_versions, program) program_info.name_changed.connect(self.refresh_program_name) program_info.status_changed.connect(self.refresh_program_status) item = QTreeWidgetItem([program.cast_custom_option_value('name', unicode, '<unknown>'), get_program_short_status(program)]) item.setData(0, Qt.UserRole, program_info) self.tree_programs.addTopLevelItem(item) self.stacked_container.addWidget(program_info) def refresh_program_tree(self): def refresh_async(): return get_programs(self.session) def cb_success(programs): sorted_programs = {} for program in programs: first_upload = program.cast_custom_option_value('first_upload', int, 0) if first_upload in sorted_programs: sorted_programs[first_upload][program.identifier] = program else: sorted_programs[first_upload] = {program.identifier: program} for first_upload in sorted(sorted_programs.keys()): for identifier in sorted(sorted_programs[first_upload].keys()): self.add_program_to_tree(sorted_programs[first_upload][identifier]) self.refresh_in_progress = False self.update_ui_state() self.stacked_container.setCurrentIndex(1) def cb_error(): pass # FIXME: report error self.refresh_in_progress = True self.update_ui_state() self.tree_programs.clear() QApplication.processEvents() # move help widget to front so the other widgets wont show and update during removal self.stacked_container.setCurrentWidget(self.widget_help) while self.stacked_container.count() > 1: self.stacked_container.removeWidget(self.stacked_container.widget(1)) QApplication.processEvents() async_call(refresh_async, None, cb_success, cb_error) def refresh_program_name(self, program): for i in range(self.tree_programs.topLevelItemCount()): item = self.tree_programs.topLevelItem(i) if item.data(0, Qt.UserRole).program == program: item.setText(0, program.cast_custom_option_value('name', unicode, '<unknown>')) def refresh_program_status(self, program): for i in range(self.tree_programs.topLevelItemCount()): item = self.tree_programs.topLevelItem(i) if item.data(0, Qt.UserRole).program == program: item.setText(1, get_program_short_status(program)) def refresh_executable_versions(self): def cb_versions(executable_name, versions): self.executable_versions[executable_name] = versions get_fpc_versions(self.script_manager, lambda versions: cb_versions('fpc', versions)) get_gcc_versions(self.script_manager, lambda versions: cb_versions('gcc', versions)) get_lazbuild_versions(self.script_manager, lambda versions: cb_versions('lazbuild', versions)) get_java_versions(self.script_manager, lambda versions: cb_versions('java', versions)) get_mono_versions(self.script_manager, lambda versions: cb_versions('mono', versions)) get_nodejs_versions(self.script_manager, lambda versions: cb_versions('nodejs', versions)) get_octave_versions(self.script_manager, lambda versions: cb_versions('octave', versions)) get_perl_versions(self.script_manager, lambda versions: cb_versions('perl', versions)) get_php_versions(self.script_manager, lambda versions: cb_versions('php', versions)) get_python_versions(self.script_manager, lambda versions: cb_versions('python', versions)) get_ruby_versions(self.script_manager, lambda versions: cb_versions('ruby', versions)) get_shell_versions(self.script_manager, lambda versions: cb_versions('shell', versions)) def show_new_program_wizard(self): self.button_new.setEnabled(False) if self.stacked_container.count() > 1: current_widget = self.stacked_container.currentWidget() else: current_widget = None if current_widget != None: current_widget.set_program_callbacks_enabled(False) identifiers = [] for i in range(self.tree_programs.topLevelItemCount()): identifiers.append(self.tree_programs.topLevelItem(i).data(0, Qt.UserRole).program.identifier) context = ProgramWizardContext(self.session, identifiers, self.script_manager, self.image_version, self.executable_versions) self.new_program_wizard = ProgramWizardNew(self, context) self.new_program_wizard.exec_() if self.new_program_wizard.upload_successful: self.add_program_to_tree(self.new_program_wizard.program) self.tree_programs.topLevelItem(self.tree_programs.topLevelItemCount() - 1).setSelected(True) for i in reversed(range(self.tree_programs.topLevelItemCount() - 1)): self.tree_programs.topLevelItem(i).setSelected(False) if self.tab_is_alive: self.new_program_wizard = None if current_widget != None: current_widget.set_program_callbacks_enabled(True) self.button_new.setEnabled(True) def purge_selected_program(self): selected_items = self.tree_programs.selectedItems() if len(selected_items) == 0: return program_info = selected_items[0].data(0, Qt.UserRole) program = program_info.program name = program.cast_custom_option_value('name', unicode, '<unknown>') button = QMessageBox.question(get_main_window(), 'Delete Program', u'Deleting program [{0}] is irreversible. All files of this program will be deleted.'.format(name), QMessageBox.Ok, QMessageBox.Cancel) if not self.tab_is_alive or button != QMessageBox.Ok: return program_info.name_changed.disconnect(self.refresh_program_name) program_info.status_changed.disconnect(self.refresh_program_status) try: program.purge() # FIXME: async_call except (Error, REDError) as e: QMessageBox.critical(get_main_window(), 'Delete Program Error', u'Could not delete program [{0}]:\n\n{1}'.format(name, e)) return self.stacked_container.removeWidget(program_info) self.tree_programs.takeTopLevelItem(self.tree_programs.indexOfTopLevelItem(selected_items[0])) self.update_ui_state()