Skip to content

Commit

Permalink
Code cleanup, additional checks (values <0), raised version to 0.6.0
Browse files Browse the repository at this point in the history
  • Loading branch information
mnowiasz committed Jun 1, 2020
1 parent 70df894 commit 55d8a87
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 24 deletions.
14 changes: 10 additions & 4 deletions src/qisit/qt/dataeditor/conversion_table_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,9 @@ class ConversionTableModel(QtCore.QAbstractTableModel):
changed = QtCore.pyqtSignal()
""" Emitted when data have been changed """

illegalValue = QtCore.pyqtSignal(misc.ValueError, str)
""" Emitted when the user has entered an illegal value """

def __init__(self, session: orm.Session):
super().__init__()
self._session = session
Expand Down Expand Up @@ -119,18 +122,21 @@ def setData(self, index: QtCore.QModelIndex, value: typing.Any, role: int = ...)
_translate = translate

if value is None:
misc.errorMessage.showMessage(_translate("DataEditor", "Empty Value!"))
self.illegalValue.emit(misc.ValueError.ISEMPTY, None)
return False
try:
value = float(parse_decimal(value))
except NumberFormatError:
# The user has entered something strange.
error_message = _translate("DataEditor", "Illegal value: {}")
misc.errorMessage.showMessage(error_message.format(value), misc.ErrorValue.illegal_value)
self.illegalValue.emit(misc.ValueError.ISNONUMBER, value)
return False

if value == 0:
misc.errorMessage.showMessage(_translate("DataEditor", "Value is 0!"))
self.illegalValue.emit(misc.ValueError.ISZERO, "0")
return False

if value < 0.0:
self.illegalValue.emit(misc.ValueError.ISNONUMBER, str(value))
return False

self.changed.emit()
Expand Down
49 changes: 42 additions & 7 deletions src/qisit/qt/dataeditor/data_editor_controller.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
# You should have received a copy of the GNU General Public License
# along with qisit. If not, see <https://www.gnu.org/licenses/>.

import math
import typing
from enum import IntEnum

Expand Down Expand Up @@ -76,15 +77,20 @@ def __init__(self, session: orm.Session):
self._settings = QtCore.QSettings()

self._transaction_started = False
self._translate = translate

self.setupUi(self)
self._item_model = data_editor_model.DataEditorModel(self._session)
self._item_model.changed.connect(self.set_modified)
self._item_model.changeSelection.connect(self.change_selection)
self._item_model.illegalValue.connect(self.illegal_value)

self.dataColumnView.setModel(self._item_model)

self._unit_conversion_model = conversion_table_model.ConversionTableModel(self._session)
self._unit_conversion_model.changed.connect(self.set_modified)
self._unit_conversion_model.illegalValue.connect(self.illegal_value)

self.unitConversionTableView.setModel(self._unit_conversion_model)

self._selected_index = None
Expand All @@ -99,7 +105,6 @@ def __init__(self, session: orm.Session):

def _get_item_for_stackedwidget(self, selected_index: QtCore.QModelIndex):


model = self._item_model
column = selected_index.internalId()

Expand Down Expand Up @@ -366,6 +371,33 @@ def loadIconButton_clicked(self):
self.deleteIconButton.setEnabled(True)
self.stackedwidget_edited()

def illegal_value(self, error: misc.ValueError, value: str):
"""
The user has entered an illegal value
Args:
error (): The error code
value (): the value (if existent)
Returns:
"""

_translate = self._translate

if error == misc.ValueError.ISEMPTY:
Qt.QMessageBox.critical(self, _translate("DataEditor", "Empty Value!"),
_translate("DataEditor", "Empty Value!"))
elif error == misc.ValueError.ISNONUMBER:
Qt.QMessageBox.critical(self, _translate("DataEditor", "Illegal Value!"),
_translate("DataEditor", "Illegal value: {}").format(value))
elif error == misc.ValueError.ISZERO:
Qt.QMessageBox.critical(self, _translate("DataEditor", "Zero Value!"),
_translate("DataEditor", "Value must not be zero!"))
if error == misc.ValueError.ISDUPLICATE:
Qt.QMessageBox.critical(self, _translate("DataEditor", "Duplicate Value"),
_translate("DataEditor", "{} already exists!").format(value))

def load_stackedwidget(self, selected_indexes: typing.List[QtCore.QModelIndex]):
"""
Switch the stacked widget accordingly and load the data
Expand Down Expand Up @@ -491,16 +523,20 @@ def okButton_clicked(self):
# value. Unit Type GROUP isn't visible for the user so don't bother to check
if new_type != data.IngredientUnit.UnitType.UNSPECIFIC:
if new_factor is None:
new_factor = 1.0
self.illegal_value(misc.ValueError.ISEMPTY, None)
new_factor = the_item.factor
else:
try:
new_factor = parse_decimal(new_factor)
if math.isclose(new_factor, 0.0):
self.illegal_value(misc.ValueError.ISZERO, "0")
new_factor = the_item.factor
if new_factor < 0.0:
self.illegal_value(misc.ValueError.ISNONUMBER, new_factor)
new_factor = the_item.factor
except NumberFormatError:
# The user has entered something strange.
_translate = translate
error_message = _translate("DataEditor", "Illegal value: {}")
misc.errorMessage.showMessage(error_message.format(new_factor),
misc.ErrorValue.illegal_value)
self.illegal_value(misc.ValueError.ISNONUMBER, new_factor)
new_factor = the_item.factor
else:
# Unspecific -> no Factor
Expand All @@ -515,7 +551,6 @@ def okButton_clicked(self):
elif stackedwidget_index == self.StackedItems.INGREDIENTS:
the_item.icon = self._ingredient_icon


self.okButton.setEnabled(False)
self.cancelButton.setEnabled(False)

Expand Down
8 changes: 5 additions & 3 deletions src/qisit/qt/dataeditor/data_editor_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
from qisit.core.util import nullify
from qisit.qt import misc


class DataEditorModel(QtCore.QAbstractItemModel):
class RootItems(IntEnum):
""" Symbolic row names """
Expand Down Expand Up @@ -61,6 +62,9 @@ class FirstColumnData(IntEnum):
When merging two or more items *and* a ingredient unit has been selected the selection becomes odd and
the first column is duplicated. Odd. """

illegalValue = QtCore.pyqtSignal(misc.ValueError, str)
""" The user entered a duplicate value """

def __init__(self, session: orm.Session):

super().__init__()
Expand Down Expand Up @@ -556,9 +560,7 @@ def setData(self, index: QtCore.QModelIndex, value: typing.Any, role: int = ...)

# Currently: #2

_translate = translate
error_message = _translate("DataEditor", "There is already an entry named \"{}\"").format(value)
misc.errorMessage.showMessage(error_message, misc.ErrorValue.illegal_value)
self.illegalValue.emit(misc.ValueError.ISDUPLICATE, value)
return False

self.changed.emit()
Expand Down
2 changes: 1 addition & 1 deletion src/qisit/qt/main/qisitmain.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def qtmain():
QtCore.QCoreApplication.setOrganizationDomain("qisit.app")
QtCore.QCoreApplication.setOrganizationName("qisit")
QtCore.QCoreApplication.setApplicationName("qisit")
QtCore.QCoreApplication.setApplicationVersion("0.5.4")
QtCore.QCoreApplication.setApplicationVersion("0.6.0")

# CTRL-C
signal.signal(signal.SIGINT, signal.SIG_DFL)
Expand Down
26 changes: 18 additions & 8 deletions src/qisit/qt/misc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,39 @@
# along with qisit. If not, see <https://www.gnu.org/licenses/>.

""" Utility things """
from PyQt5 import QtWidgets, Qt, QtCore

from enum import IntEnum

from PyQt5 import Qt, QtCore

from qisit import translate

errorMessage: QtWidgets.QErrorMessage = None
image_filter = None

class ErrorValue():
""" Global definition for error values """
illegal_value = "Illegal Value"

class ValueError(IntEnum):
""" The user has entered an illegal value """
ISEMPTY = 0
""" No value """
ISNONUMBER = 1
""" Unparsable number """
ISZERO = 2
""" The number is zero """
ISDUPLICATE = 3
""" Duplicate value """


def setup():
_translate = translate
global image_filter, errorMessage, values
errorMessage = QtWidgets.QErrorMessage()
global image_filter, values

image_filter = _translate("ImageFilter", "Imagefiles ({})").format(" ".join(
["*.{}".format(supported_format.data().decode()) for supported_format in
Qt.QImageReader.supportedImageFormats()]))

values = Values()


class Values(object):
def __init__(self):
self.__settings = QtCore.QSettings()
Expand All @@ -49,4 +60,3 @@ def ingredient_icon_height(self) -> int:


values: Values = None

2 changes: 1 addition & 1 deletion src/setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

setup(
name='qisit',
version='0.5.4',
version='0.6.0',
packages = find_packages(include=['qisit','qisit.*']),
package_data={
"qisit": ["LICENSE.md"],
Expand Down

0 comments on commit 55d8a87

Please sign in to comment.