qiskit_classroom.converter_presenter
presenter for converter view
1""" 2 presenter for converter view 3""" 4 5# Licensed to the Apache Software Foundation (ASF) under one 6# or more contributor license agreements. See the NOTICE file 7# distributed with this work for additional information 8# regarding copyright ownership. The ASF licenses this file 9# to you under the Apache License, Version 2.0 (the 10# "License"); you may not use this file except in compliance 11# with the License. You may obtain a copy of the License at 12# 13# http://www.apache.org/licenses/LICENSE-2.0 14# 15# Unless required by applicable law or agreed to in writing, 16# software distributed under the License is distributed on an 17# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 18# KIND, either express or implied. See the License for the 19# specific language governing permissions and limitations 20# under the License. 21 22import asyncio 23from subprocess import TimeoutExpired 24from typing import TYPE_CHECKING 25from .expression_enum import QuantumExpression, Converting_method 26from .input_model import Input 27from .converter_model import ConvertingRuleException 28 29if TYPE_CHECKING: 30 from .converter_model import ConverterModel 31 from .converter_view import ConverterView 32 33 34def open_file(file_path: str) -> str: 35 """open file and return contents 36 37 Args: 38 file_path (str): file path 39 40 Returns: 41 str: contents of file 42 """ 43 try: 44 with open(file_path, "r", encoding="UTF-8") as file: 45 return file.read() 46 except FileNotFoundError: 47 return "" 48 49 50class ConverterPresenter: 51 """ 52 presenter for converter 53 """ 54 55 def __init__(self, view: "ConverterView", model: "ConverterModel") -> None: 56 self.view = view 57 self.view.set_presenter(self) 58 self.model = model 59 60 def on_file_dropped(self, file_paths: list[str]) -> None: 61 """handling file drag and drop event 62 63 Args: 64 file_paths (list[str]): file paths which Signal pass 65 """ 66 for file_path in file_paths: 67 if file_path.endswith(".py"): 68 self.model.expression_text = open_file(file_path) 69 self.view.set_expression_plain_text_text(self.model.expression_text) 70 break 71 72 def on_file_imported(self, file_path: str) -> None: 73 """handling file imported event 74 75 Args: 76 file_path (str): file path whitch Signal pass 77 """ 78 self.model.expression_text = open_file(file_path) 79 self.view.set_expression_plain_text_text(self.model.expression_text) 80 81 def on_from_combo_changed(self) -> None: 82 """ 83 update from_expression 84 """ 85 self.view.disable_from_combo_current_text_change() 86 from_expression = QuantumExpression[self.view.get_from_expression()] 87 if from_expression is QuantumExpression.DIRAC: 88 self.view.show_alert_message("not supported") 89 self.view.set_from_combo_current_index(3) 90 from_expression = QuantumExpression.NONE 91 92 try: 93 self.model.from_expression = from_expression 94 except ConvertingRuleException: 95 self.model.to_expression = QuantumExpression.NONE 96 self.model.from_expression = from_expression 97 98 # this line prevent triggering to_combo.currentIndexChanged event multiple time 99 # lock 100 self.view.disable_to_combo_current_text_change() 101 self.view.set_to_combo_items( 102 [ 103 expression.name 104 for expression in Converting_method[self.model.from_expression] 105 ] 106 ) 107 self.model.to_expression = Converting_method[self.model.from_expression][0] 108 # unlock 109 self.view.enable_to_combo_current_text_change() 110 111 self.view.show_input_widget(self.model.from_expression) 112 self.view.clear_expression_plain_text() 113 self.view.set_placeholder(self.model.from_expression) 114 115 self.view.enable_from_combo_current_text_change() 116 117 def on_to_combo_changed(self) -> None: 118 """ 119 update to_expression 120 """ 121 self.model.to_expression = QuantumExpression[self.view.get_to_expression()] 122 123 async def on_convert_button_clicked(self) -> None: 124 """ 125 convert expression and visualiazation. 126 update result file path 127 """ 128 self.view.show_progress_bar() 129 result = False 130 self.model.expression_text = self.view.get_expression_plain_text_text().strip() 131 input_data: Input = self.view.get_input(self.model.from_expression) 132 133 self.model.input_data = input_data 134 135 try: 136 result = await self.model.convert_and_draw( 137 shows_result=self.view.get_shows_result() 138 ) 139 except RuntimeError: 140 self.view.show_alert_message("conversion processe error") 141 except TimeoutExpired: 142 self.view.show_alert_message("conversion process timeout error") 143 except FileNotFoundError: 144 self.view.show_alert_message("set file valid one") 145 except AttributeError: 146 self.view.show_alert_message("set input value") 147 except SyntaxError: 148 self.view.show_alert_message("syntax error with your code or expression") 149 except NameError: 150 self.view.show_alert_message("value_name or some value name not defined") 151 finally: 152 self.view.close_progress_bar() 153 154 if result: 155 # wait until file save 156 await asyncio.sleep(0.5) 157 self.view.show_result_image(self.model.result_img_path) 158 159 def on_view_destoryed(self) -> None: 160 """remove image file on view destryed""" 161 self.model.remove_result_img_path()
def
open_file(file_path: str) -> str:
35def open_file(file_path: str) -> str: 36 """open file and return contents 37 38 Args: 39 file_path (str): file path 40 41 Returns: 42 str: contents of file 43 """ 44 try: 45 with open(file_path, "r", encoding="UTF-8") as file: 46 return file.read() 47 except FileNotFoundError: 48 return ""
open file and return contents
Args: file_path (str): file path
Returns: str: contents of file
class
ConverterPresenter:
51class ConverterPresenter: 52 """ 53 presenter for converter 54 """ 55 56 def __init__(self, view: "ConverterView", model: "ConverterModel") -> None: 57 self.view = view 58 self.view.set_presenter(self) 59 self.model = model 60 61 def on_file_dropped(self, file_paths: list[str]) -> None: 62 """handling file drag and drop event 63 64 Args: 65 file_paths (list[str]): file paths which Signal pass 66 """ 67 for file_path in file_paths: 68 if file_path.endswith(".py"): 69 self.model.expression_text = open_file(file_path) 70 self.view.set_expression_plain_text_text(self.model.expression_text) 71 break 72 73 def on_file_imported(self, file_path: str) -> None: 74 """handling file imported event 75 76 Args: 77 file_path (str): file path whitch Signal pass 78 """ 79 self.model.expression_text = open_file(file_path) 80 self.view.set_expression_plain_text_text(self.model.expression_text) 81 82 def on_from_combo_changed(self) -> None: 83 """ 84 update from_expression 85 """ 86 self.view.disable_from_combo_current_text_change() 87 from_expression = QuantumExpression[self.view.get_from_expression()] 88 if from_expression is QuantumExpression.DIRAC: 89 self.view.show_alert_message("not supported") 90 self.view.set_from_combo_current_index(3) 91 from_expression = QuantumExpression.NONE 92 93 try: 94 self.model.from_expression = from_expression 95 except ConvertingRuleException: 96 self.model.to_expression = QuantumExpression.NONE 97 self.model.from_expression = from_expression 98 99 # this line prevent triggering to_combo.currentIndexChanged event multiple time 100 # lock 101 self.view.disable_to_combo_current_text_change() 102 self.view.set_to_combo_items( 103 [ 104 expression.name 105 for expression in Converting_method[self.model.from_expression] 106 ] 107 ) 108 self.model.to_expression = Converting_method[self.model.from_expression][0] 109 # unlock 110 self.view.enable_to_combo_current_text_change() 111 112 self.view.show_input_widget(self.model.from_expression) 113 self.view.clear_expression_plain_text() 114 self.view.set_placeholder(self.model.from_expression) 115 116 self.view.enable_from_combo_current_text_change() 117 118 def on_to_combo_changed(self) -> None: 119 """ 120 update to_expression 121 """ 122 self.model.to_expression = QuantumExpression[self.view.get_to_expression()] 123 124 async def on_convert_button_clicked(self) -> None: 125 """ 126 convert expression and visualiazation. 127 update result file path 128 """ 129 self.view.show_progress_bar() 130 result = False 131 self.model.expression_text = self.view.get_expression_plain_text_text().strip() 132 input_data: Input = self.view.get_input(self.model.from_expression) 133 134 self.model.input_data = input_data 135 136 try: 137 result = await self.model.convert_and_draw( 138 shows_result=self.view.get_shows_result() 139 ) 140 except RuntimeError: 141 self.view.show_alert_message("conversion processe error") 142 except TimeoutExpired: 143 self.view.show_alert_message("conversion process timeout error") 144 except FileNotFoundError: 145 self.view.show_alert_message("set file valid one") 146 except AttributeError: 147 self.view.show_alert_message("set input value") 148 except SyntaxError: 149 self.view.show_alert_message("syntax error with your code or expression") 150 except NameError: 151 self.view.show_alert_message("value_name or some value name not defined") 152 finally: 153 self.view.close_progress_bar() 154 155 if result: 156 # wait until file save 157 await asyncio.sleep(0.5) 158 self.view.show_result_image(self.model.result_img_path) 159 160 def on_view_destoryed(self) -> None: 161 """remove image file on view destryed""" 162 self.model.remove_result_img_path()
presenter for converter
ConverterPresenter( view: qiskit_classroom.converter_view.ConverterView, model: qiskit_classroom.converter_model.ConverterModel)
def
on_file_dropped(self, file_paths: list[str]) -> None:
61 def on_file_dropped(self, file_paths: list[str]) -> None: 62 """handling file drag and drop event 63 64 Args: 65 file_paths (list[str]): file paths which Signal pass 66 """ 67 for file_path in file_paths: 68 if file_path.endswith(".py"): 69 self.model.expression_text = open_file(file_path) 70 self.view.set_expression_plain_text_text(self.model.expression_text) 71 break
handling file drag and drop event
Args: file_paths (list[str]): file paths which Signal pass
def
on_file_imported(self, file_path: str) -> None:
73 def on_file_imported(self, file_path: str) -> None: 74 """handling file imported event 75 76 Args: 77 file_path (str): file path whitch Signal pass 78 """ 79 self.model.expression_text = open_file(file_path) 80 self.view.set_expression_plain_text_text(self.model.expression_text)
handling file imported event
Args: file_path (str): file path whitch Signal pass
def
on_from_combo_changed(self) -> None:
82 def on_from_combo_changed(self) -> None: 83 """ 84 update from_expression 85 """ 86 self.view.disable_from_combo_current_text_change() 87 from_expression = QuantumExpression[self.view.get_from_expression()] 88 if from_expression is QuantumExpression.DIRAC: 89 self.view.show_alert_message("not supported") 90 self.view.set_from_combo_current_index(3) 91 from_expression = QuantumExpression.NONE 92 93 try: 94 self.model.from_expression = from_expression 95 except ConvertingRuleException: 96 self.model.to_expression = QuantumExpression.NONE 97 self.model.from_expression = from_expression 98 99 # this line prevent triggering to_combo.currentIndexChanged event multiple time 100 # lock 101 self.view.disable_to_combo_current_text_change() 102 self.view.set_to_combo_items( 103 [ 104 expression.name 105 for expression in Converting_method[self.model.from_expression] 106 ] 107 ) 108 self.model.to_expression = Converting_method[self.model.from_expression][0] 109 # unlock 110 self.view.enable_to_combo_current_text_change() 111 112 self.view.show_input_widget(self.model.from_expression) 113 self.view.clear_expression_plain_text() 114 self.view.set_placeholder(self.model.from_expression) 115 116 self.view.enable_from_combo_current_text_change()
update from_expression