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

56    def __init__(self, view: "ConverterView", model: "ConverterModel") -> None:
57        self.view = view
58        self.view.set_presenter(self)
59        self.model = model
view
model
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

def on_to_combo_changed(self) -> None:
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()]

update to_expression

async def on_convert_button_clicked(self) -> None:
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)

convert expression and visualiazation. update result file path

def on_view_destoryed(self) -> None:
160    def on_view_destoryed(self) -> None:
161        """remove image file on view destryed"""
162        self.model.remove_result_img_path()

remove image file on view destryed