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

SPF-OST / pytrnsys_gui / 11481484843

23 Oct 2024 01:58PM UTC coverage: 66.906% (+1.9%) from 65.009%
11481484843

push

github

web-flow
Merge pull request #549 from SPF-OST/121-create-gui-test-for-storage-tank

121 create gui test for storage tank

46 of 52 new or added lines in 2 files covered. (88.46%)

6 existing lines in 2 files now uncovered.

10236 of 15299 relevant lines covered (66.91%)

0.67 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(_ndialog.ChangeNameDialogBase):  # pylint: disable = too-many-instance-attributes
1✔
36
    WIDTH_INCREMENT = 10
1✔
37
    HEIGHT_INCREMENT = 100
1✔
38
    minimumPortDistance = 9
1✔
39

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

46
    isTest = False
1✔
47

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

60
    def __post_init__(self):  # pylint: disable = too-many-locals, too-many-statements
1✔
61
        spacerHeight = 15
1✔
62

63
        self.tabs = QTabWidget()
1✔
64
        self.tab1 = QWidget()
1✔
65
        self.tab2 = QWidget()
1✔
66

67
        self.tabs.addTab(self.tab1, "Heat exchangers")
1✔
68
        self.tabs.addTab(self.tab2, "Direct ports")
1✔
69

70
        h0 = QHBoxLayout()  # pylint: disable = invalid-name
1✔
71
        description = QLabel("Please configure the storage tank:")
1✔
72
        exportButton = QPushButton("Export ddck")
1✔
73
        exportButton.clicked.connect(self.storage.exportDck)
1✔
74

75
        h0.addWidget(description)
1✔
76
        h0.addWidget(exportButton)
1✔
77

78
        tankNameLabel = QLabel()
1✔
79
        tankNameLabel.setText("<b>Tank name: </b>")
1✔
80

81
        gridLayout = QGridLayout()
1✔
82
        hxsLabel = QLabel("<b>Heat Exchangers </b>")
1✔
83
        gridLayout.addWidget(hxsLabel, 0, 0, 1, 2)
1✔
84

85
        qhbL = QHBoxLayout()
1✔
86

87
        self.leftHeatExchangersItemListWidget = QListWidget()
1✔
88
        qhbL.addWidget(self.leftHeatExchangersItemListWidget)
1✔
89

90
        self.rightHeatExchangersItemListWidget = QListWidget()
1✔
91
        qhbL.addWidget(self.rightHeatExchangersItemListWidget)
1✔
92

93
        offsetLabel = QLabel("Height offsets in percent")
1✔
94
        offsetLeILabel = QLabel("Input:")
1✔
95
        offsetLeOLabel = QLabel("Output:")
1✔
96
        self.offsetLeI = QLineEdit("0")
1✔
97
        self.offsetLeI.setValidator(QDoubleValidator())
1✔
98
        self.offsetLeO = QLineEdit("0")
1✔
99
        self.offsetLeO.setValidator(QDoubleValidator())
1✔
100
        self.lButton = QRadioButton("Left side")
1✔
101
        self.rButton = QRadioButton("Right side")
1✔
102

103
        gridLayout.addWidget(offsetLabel, 3, 0, 1, 1)
1✔
104
        gridLayout.addWidget(offsetLeILabel, 4, 0, 1, 1)
1✔
105
        gridLayout.addWidget(self.offsetLeI, 5, 0, 1, 3)
1✔
106
        gridLayout.addWidget(offsetLeOLabel, 6, 0, 1, 1)
1✔
107
        gridLayout.addWidget(self.offsetLeO, 7, 0, 1, 3)
1✔
108

109
        self.hxNameLe = QLineEdit()
1✔
110
        self.hxNameLe.setPlaceholderText("Enter a name...")
1✔
111
        gridLayout.addWidget(self.hxNameLe, 8, 0, 1, 3)
1✔
112

113
        gridLayout.addWidget(self.lButton, 9, 0, 1, 1)
1✔
114
        gridLayout.addWidget(self.rButton, 9, 2, 1, 1)
1✔
115

116
        self.addButton = QPushButton("Add...")
1✔
117
        self.addButton.clicked.connect(self.addHx)
1✔
118
        gridLayout.addWidget(self.addButton, 10, 0, 1, 1)
1✔
119
        removeButton = QPushButton("Remove...")
1✔
120
        removeButton.clicked.connect(self.removeHxL)
1✔
121
        removeButton.clicked.connect(self.removeHxR)
1✔
122
        gridLayout.addWidget(removeButton, 10, 1, 1, 1)
1✔
123
        modifyButton = QPushButton("Modify")
1✔
124
        modifyButton.clicked.connect(self.modifyHx)
1✔
125
        gridLayout.addWidget(modifyButton, 10, 2, 1, 1)
1✔
126
        spaceHx = QSpacerItem(self.width(), spacerHeight)
1✔
127
        gridLayout.addItem(spaceHx, 11, 0, 1, 2)
1✔
128

129
        manPortLay = QVBoxLayout()
1✔
130
        qhbL2 = QHBoxLayout()
1✔
131

132
        self.leftDirectPortPairsItemListWidget = QListWidget()
1✔
133
        qhbL2.addWidget(self.leftDirectPortPairsItemListWidget)
1✔
134

135
        self.rightDirectPortPairsItemListWidget = QListWidget()
1✔
136
        qhbL2.addWidget(self.rightDirectPortPairsItemListWidget)
1✔
137

138
        manPortLay.addLayout(qhbL2)
1✔
139

140
        manPortLabel = QLabel("<b>Set port manually</b>")
1✔
141
        manPortLabel2 = QLabel("Enter height in percent: ")
1✔
142
        portlabelUpper = QLabel("Inlet")
1✔
143
        self.manPortLeI = QLineEdit("0")
1✔
144
        self.manPortLeI.setValidator(QDoubleValidator())
1✔
145
        portlabelLower = QLabel("Outlet")
1✔
146
        self.manPortLeO = QLineEdit("0")
1✔
147
        self.manPortLeO.setValidator(QDoubleValidator())
1✔
148

149
        qhbl3 = QHBoxLayout()
1✔
150
        self.manlButton = QRadioButton("Left side")
1✔
151
        self.manrButton = QRadioButton("Right side")
1✔
152
        qhbl3.addWidget(self.manlButton)
1✔
153
        qhbl3.addWidget(self.manrButton)
1✔
154

155
        self.manAddButton = QPushButton("Add (manual) ports")
1✔
156
        self.manAddButton.clicked.connect(self.addPortPair)
1✔
157

158
        self.manRemovebutton = QPushButton("Remove ports")
1✔
159
        self.manRemovebutton.clicked.connect(self.removePortPairLeft)
1✔
160
        self.manRemovebutton.clicked.connect(self.removePortPairRight)
1✔
161

162
        self.modifyPortButton = QPushButton("Modify")
1✔
163
        self.modifyPortButton.clicked.connect(self.modifyPort)
1✔
164

165
        addRemoveButtons = QHBoxLayout()
1✔
166
        addRemoveButtons.addWidget(self.manAddButton)
1✔
167
        addRemoveButtons.addWidget(self.manRemovebutton)
1✔
168
        addRemoveButtons.addWidget(self.modifyPortButton)
1✔
169

170
        manPortLay.addWidget(manPortLabel)
1✔
171
        manPortLay.addWidget(manPortLabel2)
1✔
172
        manPortLay.addWidget(portlabelUpper)
1✔
173
        manPortLay.addWidget(self.manPortLeI)
1✔
174
        manPortLay.addWidget(portlabelLower)
1✔
175
        manPortLay.addWidget(self.manPortLeO)
1✔
176
        manPortLay.addLayout(qhbl3)
1✔
177
        manPortLay.addLayout(addRemoveButtons)
1✔
178

179
        increaseSizeButton = QPushButton("Increase size")
1✔
180
        decreaseSizeButton = QPushButton("Decrease size")
1✔
181
        self.okButton = QPushButton("OK")
1✔
182
        self.cancelButton = QPushButton("Cancel")
1✔
183

184
        increaseSizeButton.clicked.connect(self.increaseSize)
1✔
185
        decreaseSizeButton.clicked.connect(self.decreaseSize)
1✔
186
        self.okButton.clicked.connect(self.acceptedEdit)
1✔
187
        self.cancelButton.clicked.connect(self.cancel)
1✔
188

189
        layout = QVBoxLayout()
1✔
190
        layout.addLayout(h0)
1✔
191
        layout.addWidget(tankNameLabel)
1✔
192
        layout.addWidget(self._displayNameLineEdit)
1✔
193

194
        t1Layout = QVBoxLayout()
1✔
195
        t1Layout.addLayout(qhbL)
1✔
196
        t1Layout.addLayout(gridLayout)
1✔
197

198
        self.tab1.setLayout(t1Layout)
1✔
199

200
        self.tab2.setLayout(manPortLay)
1✔
201

202
        layout.addWidget(self.tabs)
1✔
203

204
        layout.addWidget(increaseSizeButton)
1✔
205
        layout.addWidget(decreaseSizeButton)
1✔
206
        layout.addWidget(self.okButton)
1✔
207
        layout.addWidget(self.cancelButton)
1✔
208

209
        self.setLayout(layout)
1✔
210

211
        self._loadHeatExchangers()
1✔
212
        self._loadDirectPortPairs()
1✔
213

214
        # This is to ensure that only one list element is selected
215
        self.rightHeatExchangersItemListWidget.setSelectionMode(QListWidget.SelectionMode(1))
1✔
216
        self.leftHeatExchangersItemListWidget.setSelectionMode(QListWidget.SelectionMode(1))
1✔
217
        self.rightHeatExchangersItemListWidget.clicked.connect(self.listWRClicked)
1✔
218
        self.leftHeatExchangersItemListWidget.clicked.connect(self.listWLClicked)
1✔
219

220
        self.rightDirectPortPairsItemListWidget.setSelectionMode(QListWidget.SelectionMode(1))
1✔
221
        self.leftDirectPortPairsItemListWidget.setSelectionMode(QListWidget.SelectionMode(1))
1✔
222
        self.rightDirectPortPairsItemListWidget.clicked.connect(self.listWR2Clicked)
1✔
223
        self.leftDirectPortPairsItemListWidget.clicked.connect(self.listWL2Clicked)
1✔
224

225
        self.msgb = QMessageBox()
1✔
226

227
        self.show()
1✔
228

229
    def _loadHeatExchangers(self):
1✔
230
        self.leftHeatExchangersItemListWidget.clear()
1✔
231
        self.rightHeatExchangersItemListWidget.clear()
1✔
232

233
        for heatExchanger in self.storage.heatExchangers:
1✔
234
            itemText = self._getHeatExchangerListItemText(heatExchanger)
1✔
235
            item = QListWidgetItem(itemText)
1✔
236
            item.setData(_qtc.Qt.UserRole, heatExchanger)
1✔
237

238
            if heatExchanger.sSide == 0:
1✔
239
                self.leftHeatExchangersItemListWidget.addItem(item)
1✔
240
            else:
241
                self.rightHeatExchangersItemListWidget.addItem(item)
1✔
242

243
    @staticmethod
1✔
244
    def _getHeatExchangerListItemText(h):  # pylint: disable = invalid-name
1✔
245
        return (
1✔
246
            f"{h.displayName}, y_offset = {int(h.relativeInputHeight * 100)}% to {int(h.relativeOutputHeight * 100)}%"
247
        )
248

249
    def _loadDirectPortPairs(self):
1✔
250
        self.leftDirectPortPairsItemListWidget.clear()
1✔
251
        self.rightDirectPortPairsItemListWidget.clear()
1✔
252

253
        directPortPair: _dpp.DirectPortPair
254
        for directPortPair in self.storage.directPortPairs:
1✔
255
            itemText = self._getDirectPortPairListItemText(directPortPair)
1✔
256
            item = QListWidgetItem(itemText)
1✔
257
            item.setData(_qtc.Qt.UserRole, directPortPair)
1✔
258

259
            if directPortPair.side.isLeft:
1✔
260
                self.leftDirectPortPairsItemListWidget.addItem(item)
1✔
261
            else:
262
                self.rightDirectPortPairsItemListWidget.addItem(item)
1✔
263

264
    @staticmethod
1✔
265
    def _getDirectPortPairListItemText(directPortPair: _dpp.DirectPortPair):
1✔
266
        return (
1✔
267
            f"Port pair from {int(directPortPair.relativeInputHeight * 100)}% to "
268
            f"{int(directPortPair.relativeOutputHeight * 100)}%"
269
        )
270

271
    def listWLClicked(self):
1✔
272
        self.rightHeatExchangersItemListWidget.clearSelection()
×
273

274
    def listWRClicked(self):
1✔
275
        self.leftHeatExchangersItemListWidget.clearSelection()
×
276

277
    def listWL2Clicked(self):
1✔
NEW
278
        self.rightDirectPortPairsItemListWidget.clearSelection()
×
279

280
    def listWR2Clicked(self):
1✔
NEW
281
        self.leftDirectPortPairsItemListWidget.clearSelection()
×
282

283
    def addHx(self):
1✔
284
        """
285
        Checks whether the inputs are in the correct range (0,100) and in order, and calls the function for creating a
286
        HeatExchanger on the respective side.
287

288
        Returns
289
        -------
290
        """
291
        try:
1✔
292
            _inputPercentageHeight = float(self.offsetLeI.text())
1✔
293
        except ValueError:
×
294
            self._editor.logger.warning("HX input height is not a number.")
×
295
            return
×
296

297
        try:
1✔
298
            _outputPercentageHeight = float(self.offsetLeO.text())
1✔
299
        except ValueError:
×
300
            self._editor.logger.warning("HX output height is not a number.")
×
301
            return
×
302

303
        if self.minOffsetDistance() and self.offsetsInRange():
1✔
304
            if self.rButton.isChecked():
1✔
305
                self._editor.logger.debug("Adding HX on righthand side.")
1✔
306
                self._addHxR()
1✔
307
            elif self.lButton.isChecked():
×
308
                self._editor.logger.debug("Adding HX on lefthand side.")
×
309
                self._addHxL()
×
310
            else:
311
                self._editor.logger.warning("No side selected for heat exchanger.")
×
312
                return
×
313
        else:
314
            self._openMessageBox(f"At least {self.minimumPortDistance}% of difference needed and valid range (0, 100)")
1✔
315

316
    def minOffsetDistance(self):
1✔
317
        return abs(float(self.offsetLeI.text()) - float(self.offsetLeO.text())) >= self.minimumPortDistance
1✔
318

319
    def offsetsInRange(self):
1✔
320
        return (0 <= float(self.offsetLeI.text()) <= 100) and (0 <= float(self.offsetLeO.text()) <= 100)
1✔
321

322
    def _addHxL(self):
1✔
323
        self._addHeatExchanger(_sd.Side.LEFT)
×
324

325
    def _addHxR(self):
1✔
326
        self._addHeatExchanger(_sd.Side.RIGHT)
1✔
327

328
    def _addHeatExchanger(self, side: _sd.Side):
1✔
329
        name = self.hxNameLe.text()
1✔
330
        if not name:
1✔
331
            self._openMessageBox(self.MISSING_NAME_ERROR_MESSAGE)
1✔
332
            return
1✔
333

334
        relativeInputHeight = float(self.offsetLeI.text()) / 100
1✔
335
        relativeOutputHeight = float(self.offsetLeO.text()) / 100
1✔
336

337
        trnsysId = self._editor.idGen.getTrnsysID()
1✔
338
        self.storage.addHeatExchanger(name, trnsysId, side, relativeInputHeight, relativeOutputHeight)
1✔
339

340
        self._loadHeatExchangers()
1✔
341

342
    def addPortPair(self):
1✔
343
        try:
1✔
344
            _inputPortPercentageHeight = float(self.manPortLeI.text())
1✔
345
        except ValueError:
×
346
            self._editor.logger.warning("Input port height is not a number.")
×
347
            return
×
348

349
        try:
1✔
350
            _outputPortPercentageHeight = float(self.manPortLeO.text())
1✔
351
        except ValueError:
×
352
            self._editor.logger.warning("Output port height is not a number.")
×
353
            return
×
354

355
        if (
1✔
356
            max(_inputPortPercentageHeight, _outputPortPercentageHeight) >= 100
357
            or min(_inputPortPercentageHeight, _outputPortPercentageHeight) <= 0
358
        ):
359
            self._openMessageBox(self.PORT_HEIGHT_ERROR_MESSAGE)
1✔
360
            return
1✔
361

362
        trnsysId = self._editor.idGen.getTrnsysID()
1✔
363

364
        if self.manlButton.isChecked():
1✔
365
            _pairSide = _sd.Side.LEFT
1✔
366
        elif self.manrButton.isChecked():
1✔
367
            _pairSide = _sd.Side.RIGHT
×
368
        else:
369
            self._editor.logger.warning("No side selected for port pair.")
1✔
370
            self._openMessageBox(self.NO_SIDE_SELECTED_ERROR_MESSAGE)
1✔
371
            return
1✔
372

373
        self.storage.addDirectPortPair(
1✔
374
            trnsysId,
375
            _pairSide,
376
            _inputPortPercentageHeight / 100,
377
            _outputPortPercentageHeight / 100,
378
            self.storage.h,
379
        )
380

381
        self._loadDirectPortPairs()
1✔
382

383
    def removePortPairLeft(self):
1✔
NEW
384
        self._removeSelectedPortPairs(self.leftDirectPortPairsItemListWidget)
×
385

386
    def removePortPairRight(self):
1✔
387
        self._removeSelectedPortPairs(self.rightDirectPortPairsItemListWidget)
1✔
388

389
    def _removeSelectedPortPairs(self, directPortPairsListWidget):
1✔
390
        for selectedItem in directPortPairsListWidget.selectedItems():
1✔
391
            selectedDirectPortPair: _dpp.DirectPortPair = selectedItem.data(_qtc.Qt.UserRole)
1✔
392

393
            self._removePorts(selectedDirectPortPair.fromPort, selectedDirectPortPair.toPort)
1✔
394

395
            self.storage.directPortPairs.remove(selectedDirectPortPair)
1✔
396

397
            row = directPortPairsListWidget.row(selectedItem)
1✔
398
            directPortPairsListWidget.takeItem(row)
1✔
399

400
    def removeHxL(self):
1✔
401
        self._removeSelectedHeatExchangers(self.leftHeatExchangersItemListWidget)
1✔
402

403
    def removeHxR(self):
1✔
404
        self._removeSelectedHeatExchangers(self.rightHeatExchangersItemListWidget)
×
405

406
    def _removeSelectedHeatExchangers(self, heatExchangersItemListWidget):
1✔
407
        for selectedItem in heatExchangersItemListWidget.selectedItems():
1✔
408
            heatExchanger: _st.HeatExchanger = selectedItem.data(_qtc.Qt.UserRole)
1✔
409

410
            self._removePorts(heatExchanger.port1, heatExchanger.port2)
1✔
411

412
            self.storage.heatExchangers.remove(heatExchanger)
1✔
413
            self.storage.editor.diagramScene.removeItem(heatExchanger)
1✔
414

415
            row = heatExchangersItemListWidget.row(selectedItem)
1✔
416
            heatExchangersItemListWidget.takeItem(row)
1✔
417

418
    def _removePorts(self, fromPort, toPort):
1✔
419
        self._removeConnectionIfAny(fromPort)
1✔
420
        self._removeConnectionIfAny(toPort)
1✔
421
        self.storage.inputs.remove(fromPort)
1✔
422
        self.storage.outputs.remove(toPort)
1✔
423
        self.storage.editor.diagramScene.removeItem(fromPort)
1✔
424
        self.storage.editor.diagramScene.removeItem(toPort)
1✔
425

426
    def _removeConnectionIfAny(self, port):
1✔
427
        if port.isConnected():
1✔
428
            connection = port.getConnection()
1✔
429
            _hls.split(connection, self._editor.hydraulicLoops, self._editor.fluids)
1✔
430
            connection.deleteConnection()
1✔
431

432
    def modifyHx(self):
1✔
UNCOV
433
        result = self._getFirstSelectedItemAndHeatExchanger()
×
UNCOV
434
        if not result:
×
435
            return
×
436
        selectedItem, heatExchanger = result
×
437

438
        modifyDialog = _mhd.ModifyRelativeHeightsDialog(
×
439
            heatExchanger.relativeInputHeight, heatExchanger.relativeOutputHeight
440
        )
441
        newHeights = modifyDialog.newRelativeHeights
×
442
        if not newHeights:
×
443
            return
×
444

445
        newInputHeight = newHeights.input if newHeights.input != "empty" else heatExchanger.relativeInputHeight
×
446
        newOutputHeight = newHeights.output if newHeights.output != "empty" else heatExchanger.relativeOutputHeight
×
447
        heatExchanger.setRelativeHeights(newInputHeight, newOutputHeight)
×
448

449
        listText = self._getHeatExchangerListItemText(heatExchanger)
×
450
        selectedItem.setText(listText)
×
451

452
    def _getFirstSelectedItemAndHeatExchanger(self):
1✔
453
        leftSelectedItems = self.leftHeatExchangersItemListWidget.selectedItems()
×
454
        rightSelectedItems = self.rightHeatExchangersItemListWidget.selectedItems()
×
455

456
        if leftSelectedItems:
×
457
            side = 0
×
458
            selectedItem = leftSelectedItems[0]
×
459
        elif rightSelectedItems:
×
460
            side = 2
×
461
            selectedItem = rightSelectedItems[0]
×
462
        else:
463
            return None
×
464

465
        name = selectedItem.text().split(",")[0]
×
466
        for heatExchanger in self.storage.heatExchangers:
×
467
            if heatExchanger.displayName == name and heatExchanger.sSide == side:
×
468
                return selectedItem, heatExchanger
×
469

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

472
    def modifyPort(self):
1✔
UNCOV
473
        selectedItem = self._getFirstSelectedDirectPortPairListWidgetItem()
×
UNCOV
474
        if not selectedItem:
×
475
            return
×
476

477
        directPortPair: _dpp.DirectPortPair = selectedItem.data(_qtc.Qt.UserRole)
×
478

479
        dialogResult = _mhd.ModifyRelativeHeightsDialog(
×
480
            directPortPair.relativeInputHeight, directPortPair.relativeOutputHeight
481
        )
482
        newHeights = dialogResult.newRelativeHeights
×
483
        if not newHeights:
×
484
            return
×
485

486
        newRelativeInputHeight = newHeights.input if newHeights.input != "empty" else directPortPair.relativeInputHeight
×
487
        newRelativeOutputHeight = (
×
488
            newHeights.output if newHeights.output != "empty" else directPortPair.relativeOutputHeight
489
        )
490

491
        directPortPair.setRelativeHeights(newRelativeInputHeight, newRelativeOutputHeight, self.storage.h)
×
492

493
        newText = self._getDirectPortPairListItemText(directPortPair)
×
494
        selectedItem.setText(newText)
×
495

496
    def _getFirstSelectedDirectPortPairListWidgetItem(
1✔
497
        self,
498
    ) -> _tp.Optional[QListWidgetItem]:
NEW
499
        leftSelectedItems = self.leftDirectPortPairsItemListWidget.selectedItems()
×
500
        if leftSelectedItems:
×
501
            return leftSelectedItems[0]
×
502

NEW
503
        rightSelectedItems = self.rightDirectPortPairsItemListWidget.selectedItems()
×
504
        if rightSelectedItems:
×
505
            return rightSelectedItems[0]
×
506

507
        return None
×
508

509
    def increaseSize(self):
1✔
510
        self._changeSize(self.HEIGHT_INCREMENT, self.WIDTH_INCREMENT)
×
511

512
    def decreaseSize(self):
1✔
513
        self._changeSize(-self.HEIGHT_INCREMENT, -self.WIDTH_INCREMENT)
×
514

515
    def _changeSize(self, deltaH: int, deltaW: int) -> None:
1✔
516
        newWidth = self.storage.w + deltaW
×
517
        newHeight = self.storage.h + deltaH
×
518
        self.storage.setSize(width=newWidth, height=newHeight)
×
519
        self.storage.updateImage()
×
520

521
    def cancel(self):
1✔
522
        self.close()
×
523

524
    def _openMessageBox(self, text):
1✔
525
        self.msgb.setText(text)
1✔
526
        if not self.isTest:
1✔
NEW
527
            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