• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

SPF-OST / pytrnsys_gui / 11662562960

29 Oct 2024 03:09PM UTC coverage: 67.508% (-0.08%) from 67.591%
11662562960

push

github

web-flow
Merge pull request #564 from SPF-OST/560-black-change-line-length-to-pep8-standard-of-79-and-check-ci-reaction

changed line length in black to 79

1054 of 1475 new or added lines in 174 files covered. (71.46%)

150 existing lines in 74 files now uncovered.

10399 of 15404 relevant lines covered (67.51%)

0.68 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

77.6
/trnsysGUI/storageTank/ConfigureStorageDialog.py
1
# pylint: disable = invalid-name
2
from __future__ import annotations
1✔
3

4
import pathlib as _pl
1✔
5
import typing as _tp
1✔
6

7
import PyQt5.QtCore as _qtc
1✔
8
from PyQt5.QtGui import QDoubleValidator
1✔
9
from PyQt5.QtWidgets import QGridLayout
1✔
10
from PyQt5.QtWidgets import QHBoxLayout
1✔
11
from PyQt5.QtWidgets import QLabel
1✔
12
from PyQt5.QtWidgets import QLineEdit
1✔
13
from PyQt5.QtWidgets import QListWidget
1✔
14
from PyQt5.QtWidgets import QListWidgetItem
1✔
15
from PyQt5.QtWidgets import QMessageBox
1✔
16
from PyQt5.QtWidgets import QPushButton
1✔
17
from PyQt5.QtWidgets import QRadioButton
1✔
18
from PyQt5.QtWidgets import QSpacerItem
1✔
19
from PyQt5.QtWidgets import QTabWidget
1✔
20
from PyQt5.QtWidgets import QVBoxLayout
1✔
21
from PyQt5.QtWidgets import QWidget
1✔
22

23
import trnsysGUI.directPortPair as _dpp
1✔
24
import trnsysGUI.hydraulicLoops.split as _hls
1✔
25
import trnsysGUI.modifyRelativeHeightsDialog as _mhd
1✔
26
import trnsysGUI.names.dialog as _ndialog
1✔
27
import trnsysGUI.names.rename as _rename
1✔
28
import trnsysGUI.storageTank.side as _sd
1✔
29

30
if _tp.TYPE_CHECKING:
1✔
31
    import trnsysGUI.storageTank.widget as _st
×
32
    import trnsysGUI.diagram.Editor as _ed
×
33

34

35
class ConfigureStorageDialog(
1✔
36
    _ndialog.ChangeNameDialogBase
37
):  # pylint: disable = too-many-instance-attributes
38
    WIDTH_INCREMENT = 10
1✔
39
    HEIGHT_INCREMENT = 100
1✔
40
    minimumPortDistance = 9
1✔
41

42
    MISSING_NAME_ERROR_MESSAGE = (
1✔
43
        "Please specify the name of the heat exchanger that you want to add."
44
    )
45
    PORT_HEIGHT_ERROR_MESSAGE = (
1✔
46
        "Ports need to be on the tank,"
47
        " please make sure the port heights are within (0 %, 100 %)."
48
    )
49
    NO_SIDE_SELECTED_ERROR_MESSAGE = "No side selected for heat exchanger."
1✔
50

51
    isTest = False
1✔
52

53
    def __init__(
1✔
54
        self,
55
        storage: _st.StorageTank,
56
        editor: _ed.Editor,  # type: ignore[name-defined]
57
        renameHelper: _rename.RenameHelper,
58
        projectDirPath: str,
59
    ) -> None:
60
        super().__init__(storage, renameHelper, _pl.Path(projectDirPath))
1✔
61
        self._editor = editor
1✔
62
        self.storage = storage
1✔
63
        self.__post_init__()
1✔
64

65
    def __post_init__(
1✔
66
        self,
67
    ):  # pylint: disable = too-many-locals, too-many-statements
68
        spacerHeight = 15
1✔
69

70
        self.tabs = QTabWidget()
1✔
71
        self.tab1 = QWidget()
1✔
72
        self.tab2 = QWidget()
1✔
73

74
        self.tabs.addTab(self.tab1, "Heat exchangers")
1✔
75
        self.tabs.addTab(self.tab2, "Direct ports")
1✔
76

77
        h0 = QHBoxLayout()  # pylint: disable = invalid-name
1✔
78
        description = QLabel("Please configure the storage tank:")
1✔
79
        exportButton = QPushButton("Export ddck")
1✔
80
        exportButton.clicked.connect(self.storage.exportDck)
1✔
81

82
        h0.addWidget(description)
1✔
83
        h0.addWidget(exportButton)
1✔
84

85
        tankNameLabel = QLabel()
1✔
86
        tankNameLabel.setText("<b>Tank name: </b>")
1✔
87

88
        gridLayout = QGridLayout()
1✔
89
        hxsLabel = QLabel("<b>Heat Exchangers </b>")
1✔
90
        gridLayout.addWidget(hxsLabel, 0, 0, 1, 2)
1✔
91

92
        qhbL = QHBoxLayout()
1✔
93

94
        self.leftHeatExchangersItemListWidget = QListWidget()
1✔
95
        qhbL.addWidget(self.leftHeatExchangersItemListWidget)
1✔
96

97
        self.rightHeatExchangersItemListWidget = QListWidget()
1✔
98
        qhbL.addWidget(self.rightHeatExchangersItemListWidget)
1✔
99

100
        offsetLabel = QLabel("Height offsets in percent")
1✔
101
        offsetLeILabel = QLabel("Input:")
1✔
102
        offsetLeOLabel = QLabel("Output:")
1✔
103
        self.offsetLeI = QLineEdit("0")
1✔
104
        self.offsetLeI.setValidator(QDoubleValidator())
1✔
105
        self.offsetLeO = QLineEdit("0")
1✔
106
        self.offsetLeO.setValidator(QDoubleValidator())
1✔
107
        self.lButton = QRadioButton("Left side")
1✔
108
        self.rButton = QRadioButton("Right side")
1✔
109

110
        gridLayout.addWidget(offsetLabel, 3, 0, 1, 1)
1✔
111
        gridLayout.addWidget(offsetLeILabel, 4, 0, 1, 1)
1✔
112
        gridLayout.addWidget(self.offsetLeI, 5, 0, 1, 3)
1✔
113
        gridLayout.addWidget(offsetLeOLabel, 6, 0, 1, 1)
1✔
114
        gridLayout.addWidget(self.offsetLeO, 7, 0, 1, 3)
1✔
115

116
        self.hxNameLe = QLineEdit()
1✔
117
        self.hxNameLe.setPlaceholderText("Enter a name...")
1✔
118
        gridLayout.addWidget(self.hxNameLe, 8, 0, 1, 3)
1✔
119

120
        gridLayout.addWidget(self.lButton, 9, 0, 1, 1)
1✔
121
        gridLayout.addWidget(self.rButton, 9, 2, 1, 1)
1✔
122

123
        self.addButton = QPushButton("Add...")
1✔
124
        self.addButton.clicked.connect(self.addHx)
1✔
125
        gridLayout.addWidget(self.addButton, 10, 0, 1, 1)
1✔
126
        removeButton = QPushButton("Remove...")
1✔
127
        removeButton.clicked.connect(self.removeHxL)
1✔
128
        removeButton.clicked.connect(self.removeHxR)
1✔
129
        gridLayout.addWidget(removeButton, 10, 1, 1, 1)
1✔
130
        modifyButton = QPushButton("Modify")
1✔
131
        modifyButton.clicked.connect(self.modifyHx)
1✔
132
        gridLayout.addWidget(modifyButton, 10, 2, 1, 1)
1✔
133
        spaceHx = QSpacerItem(self.width(), spacerHeight)
1✔
134
        gridLayout.addItem(spaceHx, 11, 0, 1, 2)
1✔
135

136
        manPortLay = QVBoxLayout()
1✔
137
        qhbL2 = QHBoxLayout()
1✔
138

139
        self.leftDirectPortPairsItemListWidget = QListWidget()
1✔
140
        qhbL2.addWidget(self.leftDirectPortPairsItemListWidget)
1✔
141

142
        self.rightDirectPortPairsItemListWidget = QListWidget()
1✔
143
        qhbL2.addWidget(self.rightDirectPortPairsItemListWidget)
1✔
144

145
        manPortLay.addLayout(qhbL2)
1✔
146

147
        manPortLabel = QLabel("<b>Set port manually</b>")
1✔
148
        manPortLabel2 = QLabel("Enter height in percent: ")
1✔
149
        portlabelUpper = QLabel("Inlet")
1✔
150
        self.manPortLeI = QLineEdit("0")
1✔
151
        self.manPortLeI.setValidator(QDoubleValidator())
1✔
152
        portlabelLower = QLabel("Outlet")
1✔
153
        self.manPortLeO = QLineEdit("0")
1✔
154
        self.manPortLeO.setValidator(QDoubleValidator())
1✔
155

156
        qhbl3 = QHBoxLayout()
1✔
157
        self.manlButton = QRadioButton("Left side")
1✔
158
        self.manrButton = QRadioButton("Right side")
1✔
159
        qhbl3.addWidget(self.manlButton)
1✔
160
        qhbl3.addWidget(self.manrButton)
1✔
161

162
        self.manAddButton = QPushButton("Add (manual) ports")
1✔
163
        self.manAddButton.clicked.connect(self.addPortPair)
1✔
164

165
        self.manRemovebutton = QPushButton("Remove ports")
1✔
166
        self.manRemovebutton.clicked.connect(self.removePortPairLeft)
1✔
167
        self.manRemovebutton.clicked.connect(self.removePortPairRight)
1✔
168

169
        self.modifyPortButton = QPushButton("Modify")
1✔
170
        self.modifyPortButton.clicked.connect(self.modifyPort)
1✔
171

172
        addRemoveButtons = QHBoxLayout()
1✔
173
        addRemoveButtons.addWidget(self.manAddButton)
1✔
174
        addRemoveButtons.addWidget(self.manRemovebutton)
1✔
175
        addRemoveButtons.addWidget(self.modifyPortButton)
1✔
176

177
        manPortLay.addWidget(manPortLabel)
1✔
178
        manPortLay.addWidget(manPortLabel2)
1✔
179
        manPortLay.addWidget(portlabelUpper)
1✔
180
        manPortLay.addWidget(self.manPortLeI)
1✔
181
        manPortLay.addWidget(portlabelLower)
1✔
182
        manPortLay.addWidget(self.manPortLeO)
1✔
183
        manPortLay.addLayout(qhbl3)
1✔
184
        manPortLay.addLayout(addRemoveButtons)
1✔
185

186
        increaseSizeButton = QPushButton("Increase size")
1✔
187
        decreaseSizeButton = QPushButton("Decrease size")
1✔
188
        self.okButton = QPushButton("OK")
1✔
189
        self.cancelButton = QPushButton("Cancel")
1✔
190

191
        increaseSizeButton.clicked.connect(self.increaseSize)
1✔
192
        decreaseSizeButton.clicked.connect(self.decreaseSize)
1✔
193
        self.okButton.clicked.connect(self.acceptedEdit)
1✔
194
        self.cancelButton.clicked.connect(self.cancel)
1✔
195

196
        layout = QVBoxLayout()
1✔
197
        layout.addLayout(h0)
1✔
198
        layout.addWidget(tankNameLabel)
1✔
199
        layout.addWidget(self._displayNameLineEdit)
1✔
200

201
        t1Layout = QVBoxLayout()
1✔
202
        t1Layout.addLayout(qhbL)
1✔
203
        t1Layout.addLayout(gridLayout)
1✔
204

205
        self.tab1.setLayout(t1Layout)
1✔
206

207
        self.tab2.setLayout(manPortLay)
1✔
208

209
        layout.addWidget(self.tabs)
1✔
210

211
        layout.addWidget(increaseSizeButton)
1✔
212
        layout.addWidget(decreaseSizeButton)
1✔
213
        layout.addWidget(self.okButton)
1✔
214
        layout.addWidget(self.cancelButton)
1✔
215

216
        self.setLayout(layout)
1✔
217

218
        self._loadHeatExchangers()
1✔
219
        self._loadDirectPortPairs()
1✔
220

221
        # This is to ensure that only one list element is selected
222
        self.rightHeatExchangersItemListWidget.setSelectionMode(
1✔
223
            QListWidget.SelectionMode(1)
224
        )
225
        self.leftHeatExchangersItemListWidget.setSelectionMode(
1✔
226
            QListWidget.SelectionMode(1)
227
        )
228
        self.rightHeatExchangersItemListWidget.clicked.connect(
1✔
229
            self.listWRClicked
230
        )
231
        self.leftHeatExchangersItemListWidget.clicked.connect(
1✔
232
            self.listWLClicked
233
        )
234

235
        self.rightDirectPortPairsItemListWidget.setSelectionMode(
1✔
236
            QListWidget.SelectionMode(1)
237
        )
238
        self.leftDirectPortPairsItemListWidget.setSelectionMode(
1✔
239
            QListWidget.SelectionMode(1)
240
        )
241
        self.rightDirectPortPairsItemListWidget.clicked.connect(
1✔
242
            self.listWR2Clicked
243
        )
244
        self.leftDirectPortPairsItemListWidget.clicked.connect(
1✔
245
            self.listWL2Clicked
246
        )
247

248
        self.msgb = QMessageBox()
1✔
249

250
        self.show()
1✔
251

252
    def _loadHeatExchangers(self):
1✔
253
        self.leftHeatExchangersItemListWidget.clear()
1✔
254
        self.rightHeatExchangersItemListWidget.clear()
1✔
255

256
        for heatExchanger in self.storage.heatExchangers:
1✔
257
            itemText = self._getHeatExchangerListItemText(heatExchanger)
1✔
258
            item = QListWidgetItem(itemText)
1✔
259
            item.setData(_qtc.Qt.UserRole, heatExchanger)
1✔
260

261
            if heatExchanger.sSide == 0:
1✔
262
                self.leftHeatExchangersItemListWidget.addItem(item)
1✔
263
            else:
264
                self.rightHeatExchangersItemListWidget.addItem(item)
1✔
265

266
    @staticmethod
1✔
267
    def _getHeatExchangerListItemText(h):  # pylint: disable = invalid-name
1✔
268
        return f"{h.displayName}, y_offset = {int(h.relativeInputHeight * 100)}% to {int(h.relativeOutputHeight * 100)}%"
1✔
269

270
    def _loadDirectPortPairs(self):
1✔
271
        self.leftDirectPortPairsItemListWidget.clear()
1✔
272
        self.rightDirectPortPairsItemListWidget.clear()
1✔
273

274
        directPortPair: _dpp.DirectPortPair
275
        for directPortPair in self.storage.directPortPairs:
1✔
276
            itemText = self._getDirectPortPairListItemText(directPortPair)
1✔
277
            item = QListWidgetItem(itemText)
1✔
278
            item.setData(_qtc.Qt.UserRole, directPortPair)
1✔
279

280
            if directPortPair.side.isLeft:
1✔
281
                self.leftDirectPortPairsItemListWidget.addItem(item)
1✔
282
            else:
283
                self.rightDirectPortPairsItemListWidget.addItem(item)
1✔
284

285
    @staticmethod
1✔
286
    def _getDirectPortPairListItemText(directPortPair: _dpp.DirectPortPair):
1✔
287
        return (
1✔
288
            f"Port pair from {int(directPortPair.relativeInputHeight * 100)}% to "
289
            f"{int(directPortPair.relativeOutputHeight * 100)}%"
290
        )
291

292
    def listWLClicked(self):
1✔
293
        self.rightHeatExchangersItemListWidget.clearSelection()
×
294

295
    def listWRClicked(self):
1✔
296
        self.leftHeatExchangersItemListWidget.clearSelection()
×
297

298
    def listWL2Clicked(self):
1✔
299
        self.rightDirectPortPairsItemListWidget.clearSelection()
×
300

301
    def listWR2Clicked(self):
1✔
302
        self.leftDirectPortPairsItemListWidget.clearSelection()
×
303

304
    def addHx(self):
1✔
305
        """
306
        Checks whether the inputs are in the correct range (0,100) and in order, and calls the function for creating a
307
        HeatExchanger on the respective side.
308

309
        Returns
310
        -------
311
        """
312
        try:
1✔
313
            _inputPercentageHeight = float(self.offsetLeI.text())
1✔
314
        except ValueError:
×
315
            self._editor.logger.warning("HX input height is not a number.")
×
316
            return
×
317

318
        try:
1✔
319
            _outputPercentageHeight = float(self.offsetLeO.text())
1✔
320
        except ValueError:
×
321
            self._editor.logger.warning("HX output height is not a number.")
×
322
            return
×
323

324
        if self.minOffsetDistance() and self.offsetsInRange():
1✔
325
            if self.rButton.isChecked():
1✔
326
                self._editor.logger.debug("Adding HX on righthand side.")
1✔
327
                self._addHxR()
1✔
328
            elif self.lButton.isChecked():
×
329
                self._editor.logger.debug("Adding HX on lefthand side.")
×
330
                self._addHxL()
×
331
            else:
NEW
332
                self._editor.logger.warning(
×
333
                    "No side selected for heat exchanger."
334
                )
UNCOV
335
                return
×
336
        else:
337
            self._openMessageBox(
1✔
338
                f"At least {self.minimumPortDistance}% of difference needed and valid range (0, 100)"
339
            )
340

341
    def minOffsetDistance(self):
1✔
342
        return (
1✔
343
            abs(float(self.offsetLeI.text()) - float(self.offsetLeO.text()))
344
            >= self.minimumPortDistance
345
        )
346

347
    def offsetsInRange(self):
1✔
348
        return (0 <= float(self.offsetLeI.text()) <= 100) and (
1✔
349
            0 <= float(self.offsetLeO.text()) <= 100
350
        )
351

352
    def _addHxL(self):
1✔
353
        self._addHeatExchanger(_sd.Side.LEFT)
×
354

355
    def _addHxR(self):
1✔
356
        self._addHeatExchanger(_sd.Side.RIGHT)
1✔
357

358
    def _addHeatExchanger(self, side: _sd.Side):
1✔
359
        name = self.hxNameLe.text()
1✔
360
        if not name:
1✔
361
            self._openMessageBox(self.MISSING_NAME_ERROR_MESSAGE)
1✔
362
            return
1✔
363

364
        relativeInputHeight = float(self.offsetLeI.text()) / 100
1✔
365
        relativeOutputHeight = float(self.offsetLeO.text()) / 100
1✔
366

367
        trnsysId = self._editor.idGen.getTrnsysID()
1✔
368
        self.storage.addHeatExchanger(
1✔
369
            name, trnsysId, side, relativeInputHeight, relativeOutputHeight
370
        )
371

372
        self._loadHeatExchangers()
1✔
373

374
    def addPortPair(self):
1✔
375
        try:
1✔
376
            _inputPortPercentageHeight = float(self.manPortLeI.text())
1✔
377
        except ValueError:
×
378
            self._editor.logger.warning("Input port height is not a number.")
×
379
            return
×
380

381
        try:
1✔
382
            _outputPortPercentageHeight = float(self.manPortLeO.text())
1✔
383
        except ValueError:
×
384
            self._editor.logger.warning("Output port height is not a number.")
×
385
            return
×
386

387
        if (
1✔
388
            max(_inputPortPercentageHeight, _outputPortPercentageHeight) >= 100
389
            or min(_inputPortPercentageHeight, _outputPortPercentageHeight)
390
            <= 0
391
        ):
392
            self._openMessageBox(self.PORT_HEIGHT_ERROR_MESSAGE)
1✔
393
            return
1✔
394

395
        trnsysId = self._editor.idGen.getTrnsysID()
1✔
396

397
        if self.manlButton.isChecked():
1✔
398
            _pairSide = _sd.Side.LEFT
1✔
399
        elif self.manrButton.isChecked():
1✔
400
            _pairSide = _sd.Side.RIGHT
×
401
        else:
402
            self._editor.logger.warning("No side selected for port pair.")
1✔
403
            self._openMessageBox(self.NO_SIDE_SELECTED_ERROR_MESSAGE)
1✔
404
            return
1✔
405

406
        self.storage.addDirectPortPair(
1✔
407
            trnsysId,
408
            _pairSide,
409
            _inputPortPercentageHeight / 100,
410
            _outputPortPercentageHeight / 100,
411
            self.storage.h,
412
        )
413

414
        self._loadDirectPortPairs()
1✔
415

416
    def removePortPairLeft(self):
1✔
417
        self._removeSelectedPortPairs(self.leftDirectPortPairsItemListWidget)
×
418

419
    def removePortPairRight(self):
1✔
420
        self._removeSelectedPortPairs(self.rightDirectPortPairsItemListWidget)
1✔
421

422
    def _removeSelectedPortPairs(self, directPortPairsListWidget):
1✔
423
        for selectedItem in directPortPairsListWidget.selectedItems():
1✔
424
            selectedDirectPortPair: _dpp.DirectPortPair = selectedItem.data(
1✔
425
                _qtc.Qt.UserRole
426
            )
427

428
            self._removePorts(
1✔
429
                selectedDirectPortPair.fromPort, selectedDirectPortPair.toPort
430
            )
431

432
            self.storage.directPortPairs.remove(selectedDirectPortPair)
1✔
433

434
            row = directPortPairsListWidget.row(selectedItem)
1✔
435
            directPortPairsListWidget.takeItem(row)
1✔
436

437
    def removeHxL(self):
1✔
438
        self._removeSelectedHeatExchangers(
1✔
439
            self.leftHeatExchangersItemListWidget
440
        )
441

442
    def removeHxR(self):
1✔
NEW
443
        self._removeSelectedHeatExchangers(
×
444
            self.rightHeatExchangersItemListWidget
445
        )
446

447
    def _removeSelectedHeatExchangers(self, heatExchangersItemListWidget):
1✔
448
        for selectedItem in heatExchangersItemListWidget.selectedItems():
1✔
449
            heatExchanger: _st.HeatExchanger = selectedItem.data(
1✔
450
                _qtc.Qt.UserRole
451
            )
452

453
            self._removePorts(heatExchanger.port1, heatExchanger.port2)
1✔
454

455
            self.storage.heatExchangers.remove(heatExchanger)
1✔
456
            self.storage.editor.diagramScene.removeItem(heatExchanger)
1✔
457

458
            row = heatExchangersItemListWidget.row(selectedItem)
1✔
459
            heatExchangersItemListWidget.takeItem(row)
1✔
460

461
    def _removePorts(self, fromPort, toPort):
1✔
462
        self._removeConnectionIfAny(fromPort)
1✔
463
        self._removeConnectionIfAny(toPort)
1✔
464
        self.storage.inputs.remove(fromPort)
1✔
465
        self.storage.outputs.remove(toPort)
1✔
466
        self.storage.editor.diagramScene.removeItem(fromPort)
1✔
467
        self.storage.editor.diagramScene.removeItem(toPort)
1✔
468

469
    def _removeConnectionIfAny(self, port):
1✔
470
        if port.isConnected():
1✔
471
            connection = port.getConnection()
1✔
472
            _hls.split(
1✔
473
                connection, self._editor.hydraulicLoops, self._editor.fluids
474
            )
475
            connection.deleteConnection()
1✔
476

477
    def modifyHx(self):
1✔
478
        result = self._getFirstSelectedItemAndHeatExchanger()
×
479
        if not result:
×
480
            return
×
481
        selectedItem, heatExchanger = result
×
482

483
        modifyDialog = _mhd.ModifyRelativeHeightsDialog(
×
484
            heatExchanger.relativeInputHeight,
485
            heatExchanger.relativeOutputHeight,
486
        )
487
        newHeights = modifyDialog.newRelativeHeights
×
488
        if not newHeights:
×
489
            return
×
490

NEW
491
        newInputHeight = (
×
492
            newHeights.input
493
            if newHeights.input != "empty"
494
            else heatExchanger.relativeInputHeight
495
        )
NEW
496
        newOutputHeight = (
×
497
            newHeights.output
498
            if newHeights.output != "empty"
499
            else heatExchanger.relativeOutputHeight
500
        )
UNCOV
501
        heatExchanger.setRelativeHeights(newInputHeight, newOutputHeight)
×
502

503
        listText = self._getHeatExchangerListItemText(heatExchanger)
×
504
        selectedItem.setText(listText)
×
505

506
    def _getFirstSelectedItemAndHeatExchanger(self):
1✔
NEW
507
        leftSelectedItems = (
×
508
            self.leftHeatExchangersItemListWidget.selectedItems()
509
        )
NEW
510
        rightSelectedItems = (
×
511
            self.rightHeatExchangersItemListWidget.selectedItems()
512
        )
513

514
        if leftSelectedItems:
×
515
            side = 0
×
516
            selectedItem = leftSelectedItems[0]
×
517
        elif rightSelectedItems:
×
518
            side = 2
×
519
            selectedItem = rightSelectedItems[0]
×
520
        else:
521
            return None
×
522

523
        name = selectedItem.text().split(",")[0]
×
524
        for heatExchanger in self.storage.heatExchangers:
×
NEW
525
            if (
×
526
                heatExchanger.displayName == name
527
                and heatExchanger.sSide == side
528
            ):
UNCOV
529
                return selectedItem, heatExchanger
×
530

531
        raise AssertionError(f"No heat exchanger with name {name} found.")
×
532

533
    def modifyPort(self):
1✔
534
        selectedItem = self._getFirstSelectedDirectPortPairListWidgetItem()
×
535
        if not selectedItem:
×
536
            return
×
537

NEW
538
        directPortPair: _dpp.DirectPortPair = selectedItem.data(
×
539
            _qtc.Qt.UserRole
540
        )
541

542
        dialogResult = _mhd.ModifyRelativeHeightsDialog(
×
543
            directPortPair.relativeInputHeight,
544
            directPortPair.relativeOutputHeight,
545
        )
546
        newHeights = dialogResult.newRelativeHeights
×
547
        if not newHeights:
×
548
            return
×
549

NEW
550
        newRelativeInputHeight = (
×
551
            newHeights.input
552
            if newHeights.input != "empty"
553
            else directPortPair.relativeInputHeight
554
        )
UNCOV
555
        newRelativeOutputHeight = (
×
556
            newHeights.output
557
            if newHeights.output != "empty"
558
            else directPortPair.relativeOutputHeight
559
        )
560

NEW
561
        directPortPair.setRelativeHeights(
×
562
            newRelativeInputHeight, newRelativeOutputHeight, self.storage.h
563
        )
564

565
        newText = self._getDirectPortPairListItemText(directPortPair)
×
566
        selectedItem.setText(newText)
×
567

568
    def _getFirstSelectedDirectPortPairListWidgetItem(
1✔
569
        self,
570
    ) -> _tp.Optional[QListWidgetItem]:
NEW
571
        leftSelectedItems = (
×
572
            self.leftDirectPortPairsItemListWidget.selectedItems()
573
        )
574
        if leftSelectedItems:
×
575
            return leftSelectedItems[0]
×
576

NEW
577
        rightSelectedItems = (
×
578
            self.rightDirectPortPairsItemListWidget.selectedItems()
579
        )
580
        if rightSelectedItems:
×
581
            return rightSelectedItems[0]
×
582

583
        return None
×
584

585
    def increaseSize(self):
1✔
586
        self._changeSize(self.HEIGHT_INCREMENT, self.WIDTH_INCREMENT)
×
587

588
    def decreaseSize(self):
1✔
589
        self._changeSize(-self.HEIGHT_INCREMENT, -self.WIDTH_INCREMENT)
×
590

591
    def _changeSize(self, deltaH: int, deltaW: int) -> None:
1✔
592
        newWidth = self.storage.w + deltaW
×
593
        newHeight = self.storage.h + deltaH
×
594
        self.storage.setSize(width=newWidth, height=newHeight)
×
595
        self.storage.updateImage()
×
596

597
    def cancel(self):
1✔
598
        self.close()
×
599

600
    def _openMessageBox(self, text):
1✔
601
        self.msgb.setText(text)
1✔
602
        if not self.isTest:
1✔
603
            self.msgb.exec_()
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc