annotate libervia/cli/call_gui.py @ 4219:1b5cf2ee1d86

plugin XEP-0384, XEP-0391: download missing devices list: when a peer jid was not in our roster, devices list was not retrieved, resulting in failed en/decryption. This patch does check it and download missing devices list in necessary. There is no subscription managed yet, so the list won't be updated in case of new devices, this should be addressed at some point.
author Goffi <goffi@goffi.org>
date Tue, 05 Mar 2024 17:31:36 +0100
parents 9218d4331bb2
children d01b8d002619
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # Libervia CLI
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # Copyright (C) 2009-2024 Jérôme Poisson (goffi@goffi.org)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 import asyncio
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
20 from functools import partial
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 from pathlib import Path
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from typing import Callable, cast
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
23
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from PyQt6.QtCore import QPoint, QSize, Qt
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from PyQt6.QtGui import (
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 QCloseEvent,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
27 QColor,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
28 QIcon,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 QImage,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
30 QPainter,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
31 QPen,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
32 QPixmap,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
33 QResizeEvent,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 QTransform,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 from PyQt6.QtWidgets import (
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 QApplication,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 QDialog,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 QDialogButtonBox,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 QHBoxLayout,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
41 QLabel,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
42 QListWidget,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 QListWidgetItem,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 QMainWindow,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 QPushButton,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 QSizePolicy,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 QVBoxLayout,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 QWidget,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 )
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
50 import gi
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
51
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
52 from libervia.backend.core.i18n import _
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
53 from libervia.cli.call_webrtc import WebRTCCall
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
54 from libervia.frontends.tools import aio, display_servers, webrtc
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
55 gi.require_versions({
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
56 "Gst": "1.0",
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
57 "GstWebRTC": "1.0"
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
58 })
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 from gi.repository import Gst
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
60
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
61
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
62
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 ICON_SIZE = QSize(45, 45)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 BUTTON_SIZE = QSize(50, 50)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
65 running = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
66
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
67
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
68 class ActivableButton(QPushButton):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
69 def __init__(self, text, parent=None):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
70 super().__init__(parent)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 self._activated = True
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
72 self._activated_colour = "#47c68e"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
73 self._deactivated_colour = "#ffe089"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 self._line_colour = "#ff0000"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 self._update_background_color()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
76
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
77 @property
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
78 def activated_colour(self) -> str:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
79 return self._activated_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
80
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 @activated_colour.setter
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
82 def activated_colour(self, new_colour: str) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 if new_colour != self._activated_colour:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
84 self._activated_colour = new_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 self._update_background_color()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
86
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
87 @property
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
88 def deactivated_colour(self) -> str:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
89 return self._deactivated_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
90
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
91 @deactivated_colour.setter
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
92 def deactivated_colour(self, new_colour: str) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
93 if new_colour != self._deactivated_colour:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 self._deactivated_colour = new_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
95 self._update_background_color()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
96
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
97 @property
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
98 def line_colour(self) -> str:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
99 return self._line_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
100
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
101 @line_colour.setter
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
102 def line_colour(self, new_colour: str) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
103 if new_colour != self._line_colour:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 self._line_colour = new_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
105 self.update()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
106
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 def paintEvent(self, a0):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
108 super().paintEvent(a0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
109
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 if not self._activated:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
111 painter = QPainter(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
112 painter.setRenderHint(QPainter.RenderHint.Antialiasing)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
113
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 line_color = QColor(self._line_colour)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
115 line_width = 4
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 cap_style = Qt.PenCapStyle.RoundCap
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
117
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 pen = QPen(line_color, line_width, Qt.PenStyle.SolidLine)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
119 pen.setCapStyle(cap_style)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 painter.setPen(pen)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
121
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 margin = 5
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
123 start_point = QPoint(margin, self.height() - margin)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 end_point = QPoint(self.width() - margin, margin)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 painter.drawLine(start_point, end_point)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
126
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 def _update_background_color(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
128 if self._activated:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 self.setStyleSheet(f"background-color: {self._activated_colour};")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 else:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 self.setStyleSheet(f"background-color: {self._deactivated_colour};")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
132 self.update()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
133
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 @property
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
135 def activated(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 return self._activated
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
137
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 @activated.setter
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
139 def activated(self, value):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 if self._activated != value:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 self._activated = value
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 self._update_background_color()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
143
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
144
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
145 class X11DesktopScreenDialog(QDialog):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
146 def __init__(self, windows_data, parent=None):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 super().__init__(parent)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 self.__a_result = asyncio.get_running_loop().create_future()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 self.setWindowTitle("Please select a window to share:")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 self.resize(400, 300)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 self.list_widget = QListWidget(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 for window_data in windows_data:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 item = QListWidgetItem(window_data["title"])
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 item.setData(Qt.ItemDataRole.UserRole, window_data)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 self.list_widget.addItem(item)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
156
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 self.buttonBox = QDialogButtonBox(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
158 QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 self.buttonBox.accepted.connect(self.on_accepted)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 self.buttonBox.rejected.connect(self.on_rejected)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
162
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
163 layout = QVBoxLayout(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
164 layout.addWidget(self.list_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 layout.addWidget(self.buttonBox)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
166
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
167 def get_selected_window(self) -> dict | None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
168 selectedItem = self.list_widget.currentItem()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
169 if selectedItem:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
170 return selectedItem.data(Qt.ItemDataRole.UserRole)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
171 return None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
172
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 def on_accepted(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
174 self.__a_result.set_result(self.get_selected_window())
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 self.close()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
176
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
177 def on_rejected(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
178 self.__a_result.set_result(None)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 self.close()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
180
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 def closeEvent(self, a0):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
182 super().closeEvent(a0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 if not self.__a_result.done():
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 self.__a_result.set_result(None)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
185
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
186 async def a_show(self) -> dict | None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
187 self.open()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
188 return await self.__a_result
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
189
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
190
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
191 class AVCallUI(QMainWindow):
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
192 def __init__(self, host, icons_path: Path):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
193 super().__init__()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
194 self.host = host
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
195 self.webrtc_call = None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
196 self.icons_path = icons_path
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
197 self.initUI()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
198
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
199 @staticmethod
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
200 async def run_qt_loop(app):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
201 while running:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
202 app.sendPostedEvents()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
203 await asyncio.sleep(0.1)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
204
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
205 @classmethod
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
206 async def run(cls, parent, call_data):
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
207 """Run PyQt loop and show the app"""
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
208 media_dir = Path(await parent.host.bridge.config_get("", "media_dir"))
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
209 icons_path = media_dir / "fonts/fontello/svg"
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
210 app = QApplication([])
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
211 av_call_gui = cls(parent.host, icons_path)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
212 av_call_gui.show()
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
213 webrtc_call = await WebRTCCall.make_webrtc_call(
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
214 parent.host,
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
215 parent.profile,
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
216 call_data,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
217 sinks=webrtc.SINKS_APP,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
218 appsink_data=webrtc.AppSinkData(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
219 local_video_cb=partial(av_call_gui.on_new_sample, video_stream="local"),
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
220 remote_video_cb=partial(av_call_gui.on_new_sample, video_stream="remote"),
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
221 ),
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
222 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
223 av_call_gui.webrtc_call = webrtc_call
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
224
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
225 global running
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
226 running = True
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
227 await cls.run_qt_loop(app)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
228 await parent.host.a_quit()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
229
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
230 def initUI(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
231 self.setGeometry(100, 100, 800, 600)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
232 self.setWindowTitle("Call")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
233
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
234 # Main layouts
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
235 self.background_widget = QWidget(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
236 self.foreground_widget = QWidget(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
237 self.setCentralWidget(self.background_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
238 back_layout = QVBoxLayout(self.background_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
239 front_layout = QVBoxLayout(self.foreground_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
240
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
241 # Remote video
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
242 self.remote_video_widget = QLabel(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
243 self.remote_video_widget.setSizePolicy(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
244 QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
245 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
246 back_layout.addWidget(self.remote_video_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
247
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
248 # Fullscreen button
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
249 fullscreen_layout = QHBoxLayout()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 front_layout.addLayout(fullscreen_layout)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 fullscreen_layout.addStretch()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
252 self.fullscreen_btn = QPushButton("", self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
253 self.fullscreen_btn.setFixedSize(BUTTON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
254 self.fullscreen_icon_normal = QIcon(str(self.icons_path / "resize-full.svg"))
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
255 self.fullscreen_icon_fullscreen = QIcon(str(self.icons_path / "resize-small.svg"))
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
256 self.fullscreen_btn.setIcon(self.fullscreen_icon_normal)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
257 self.fullscreen_btn.setIconSize(ICON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
258 self.fullscreen_btn.clicked.connect(self.toggle_fullscreen)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
259 fullscreen_layout.addWidget(self.fullscreen_btn)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
260
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
261 # Control buttons
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
262 self.control_buttons_layout = QHBoxLayout()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
263 self.control_buttons_layout.setSpacing(40)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
264 self.toggle_video_btn = cast(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
265 ActivableButton, self.add_control_button("videocam", self.toggle_video)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
266 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
267 self.toggle_audio_btn = cast(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
268 ActivableButton, self.add_control_button("volume-up", self.toggle_audio)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
269 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 self.share_desktop_btn = cast(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
271 ActivableButton, self.add_control_button("desktop", self.share_desktop)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
272 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
273 self.share_desktop_btn.deactivated_colour = "#47c68e"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
274 self.share_desktop_btn.activated_colour = "#f24468"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
275 self.share_desktop_btn.line_colour = "#666666"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
276 self.share_desktop_btn.activated = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
277 self.hang_up_btn = self.add_control_button(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
278 "phone", self.hang_up, rotate=135, background="red", activable=False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
279 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
280
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
281 controls_widget = QWidget(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
282 controls_widget.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
283 controls_widget.setLayout(self.control_buttons_layout)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
284 front_layout.addStretch()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
285
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
286 bottom_layout = QHBoxLayout()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
287 bottom_layout.addStretch()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
288 front_layout.addLayout(bottom_layout)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
289 bottom_layout.addWidget(controls_widget, alignment=Qt.AlignmentFlag.AlignBottom)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
290
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
291 # Local video feedback
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
292 bottom_layout.addStretch()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
293 self.local_video_widget = QLabel(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
294 bottom_layout.addWidget(self.local_video_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
295
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
296 # we update sizes on resize event
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
297 self.background_widget.resizeEvent = self.adjust_sizes
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
298 self.adjust_sizes()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
299
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
300 def add_control_button(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
301 self,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
302 icon_name: str,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
303 callback: Callable,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
304 rotate: float | None = None,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
305 background: str | None = None,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
306 activable: bool = True,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
307 ) -> QPushButton | ActivableButton:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
308 if activable:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
309 button = ActivableButton("", self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
310 else:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
311 button = QPushButton("", self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
312 icon_path = self.icons_path / f"{icon_name}.svg"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
313 button.setIcon(QIcon(str(icon_path)))
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
314 button.setIconSize(ICON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
315 button.setFixedSize(BUTTON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
316 if rotate is not None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
317 pixmap = button.icon().pixmap(ICON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
318 transform = QTransform()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
319 transform.rotate(rotate)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
320 rotated_pixmap = pixmap.transformed(transform)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
321 button.setIcon(QIcon(rotated_pixmap))
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
322 if background:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
323 button.setStyleSheet(f"background-color: {background};")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
324 button.clicked.connect(callback)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
325 self.control_buttons_layout.addWidget(button)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
326 return button
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
327
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
328 def adjust_sizes(self, a0: QResizeEvent | None = None) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
329 self.foreground_widget.setGeometry(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
330 0, 0, self.background_widget.width(), self.background_widget.height()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
331 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
332 self.local_video_widget.setFixedSize(QSize(self.width() // 3, self.height() // 3))
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
333 if a0 is not None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
334 super().resizeEvent(a0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
335
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
336 def on_new_sample(self, video_sink, video_stream: str) -> bool:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
337 sample = video_sink.emit("pull-sample")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
338 if sample is None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
339 return False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
340
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
341 video_pad = video_sink.get_static_pad("sink")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
342 assert video_pad is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
343 s = video_pad.get_current_caps().get_structure(0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
344 stream_size = (s.get_value("width"), s.get_value("height"))
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
345 self.host.loop.loop.call_soon_threadsafe(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
346 self.update_sample, sample, stream_size, video_stream
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
347 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
348
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
349 return False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
350
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
351 def update_sample(self, sample, stream_size, video_stream: str) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
352 if sample is None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
353 return
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
354
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
355 video_widget = (
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
356 self.remote_video_widget
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
357 if video_stream == "remote"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
358 else self.local_video_widget
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
359 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
360
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
361 buf = sample.get_buffer()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
362 result, mapinfo = buf.map(Gst.MapFlags.READ)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
363 if result:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
364 buffer = mapinfo.data
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
365 width, height = stream_size
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
366 qimage = QImage(buffer, width, height, QImage.Format.Format_RGB888)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
367 pixmap = QPixmap.fromImage(qimage).scaled(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
368 QSize(video_widget.width(), video_widget.height()),
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
369 Qt.AspectRatioMode.KeepAspectRatio,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
370 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
371 video_widget.setPixmap(pixmap)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
372 video_widget.setAlignment(Qt.AlignmentFlag.AlignCenter)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
373
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
374 buf.unmap(mapinfo)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
375
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
376 def toggle_fullscreen(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
377 fullscreen = not self.isFullScreen()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
378 if fullscreen:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
379 self.fullscreen_btn.setIcon(self.fullscreen_icon_fullscreen)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
380 self.showFullScreen()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
381 else:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
382 self.fullscreen_btn.setIcon(self.fullscreen_icon_normal)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
383 self.showNormal()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
384
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
385 def closeEvent(self, a0: QCloseEvent|None) -> None:
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
386 super().closeEvent(a0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
387 global running
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
388 running = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
389
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
390 def toggle_video(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
391 assert self.webrtc_call is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
392 self.webrtc_call.webrtc.video_muted = not self.webrtc_call.webrtc.video_muted
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
393 self.toggle_video_btn.activated = not self.webrtc_call.webrtc.video_muted
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
394
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
395 def toggle_audio(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
396 assert self.webrtc_call is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
397 self.webrtc_call.webrtc.audio_muted = not self.webrtc_call.webrtc.audio_muted
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
398 self.toggle_audio_btn.activated = not self.webrtc_call.webrtc.audio_muted
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
399
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
400 def share_desktop(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
401 assert self.webrtc_call is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
402 if self.webrtc_call.webrtc.desktop_sharing:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
403 self.webrtc_call.webrtc.desktop_sharing = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
404 self.share_desktop_btn.activated = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
405 elif display_servers.detect() == display_servers.X11:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
406 aio.run_async(self.show_X11_screen_dialog())
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
407 else:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
408 self.webrtc_call.webrtc.desktop_sharing = True
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
409
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
410 def hang_up(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
411 self.close()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
412
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
413 @staticmethod
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
414 def can_run():
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
415 # if a known display server is detected, we should be able to run
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
416 return display_servers.detect() is not None
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
417
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
418 async def show_X11_screen_dialog(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
419 assert self.webrtc_call is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
420 windows_data = display_servers.x11_list_windows()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
421 dialog = X11DesktopScreenDialog(windows_data, self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
422 selected = await dialog.a_show()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
423 if selected is not None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
424 xid = selected["id"]
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
425 self.webrtc_call.webrtc.desktop_sharing_data = {"xid": xid}
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
426 self.webrtc_call.webrtc.desktop_sharing = True
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
427 self.share_desktop_btn.activated = True