annotate libervia/cli/call_gui.py @ 4242:8acf46ed7f36

frontends: remote control implementation: This is the frontends common part of remote control implementation. It handle the creation of WebRTC session, and management of inputs. For now the reception use freedesktop.org Desktop portal, and works mostly with Wayland based Desktop Environments. rel 436
author Goffi <goffi@goffi.org>
date Sat, 11 May 2024 13:52:43 +0200
parents 79c8a70e1813
children 0d7bb4df2343
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.frontends.tools import aio, display_servers, webrtc
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
54 gi.require_versions({
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
55 "Gst": "1.0",
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
56 "GstWebRTC": "1.0"
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
57 })
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 from gi.repository import Gst
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
59
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 ICON_SIZE = QSize(45, 45)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
63 BUTTON_SIZE = QSize(50, 50)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
64 running = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
65
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
66
4233
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
67 aio.install_glib_asyncio_iteration()
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
68
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
69
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
70 class ActivableButton(QPushButton):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
71 def __init__(self, text, parent=None):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
72 super().__init__(parent)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
73 self._activated = True
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
74 self._activated_colour = "#47c68e"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
75 self._deactivated_colour = "#ffe089"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
76 self._line_colour = "#ff0000"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
77 self._update_background_color()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
78
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
79 @property
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
80 def activated_colour(self) -> str:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
81 return self._activated_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
82
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
83 @activated_colour.setter
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
84 def activated_colour(self, new_colour: str) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
85 if new_colour != self._activated_colour:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
86 self._activated_colour = new_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
87 self._update_background_color()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
88
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
89 @property
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
90 def deactivated_colour(self) -> str:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
91 return self._deactivated_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
92
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
93 @deactivated_colour.setter
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
94 def deactivated_colour(self, new_colour: str) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
95 if new_colour != self._deactivated_colour:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
96 self._deactivated_colour = new_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
97 self._update_background_color()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
98
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
99 @property
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
100 def line_colour(self) -> str:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
101 return self._line_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
102
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
103 @line_colour.setter
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
104 def line_colour(self, new_colour: str) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
105 if new_colour != self._line_colour:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
106 self._line_colour = new_colour
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
107 self.update()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
108
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
109 def paintEvent(self, a0):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
110 super().paintEvent(a0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
111
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
112 if not self._activated:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
113 painter = QPainter(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
114 painter.setRenderHint(QPainter.RenderHint.Antialiasing)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
115
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
116 line_color = QColor(self._line_colour)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
117 line_width = 4
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
118 cap_style = Qt.PenCapStyle.RoundCap
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
119
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
120 pen = QPen(line_color, line_width, Qt.PenStyle.SolidLine)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
121 pen.setCapStyle(cap_style)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
122 painter.setPen(pen)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
123
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
124 margin = 5
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
125 start_point = QPoint(margin, self.height() - margin)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
126 end_point = QPoint(self.width() - margin, margin)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
127 painter.drawLine(start_point, end_point)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
128
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
129 def _update_background_color(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
130 if self._activated:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
131 self.setStyleSheet(f"background-color: {self._activated_colour};")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
132 else:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
133 self.setStyleSheet(f"background-color: {self._deactivated_colour};")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
134 self.update()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
135
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
136 @property
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
137 def activated(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
138 return self._activated
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
139
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
140 @activated.setter
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
141 def activated(self, value):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
142 if self._activated != value:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
143 self._activated = value
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
144 self._update_background_color()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
145
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
146
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
147 class X11DesktopScreenDialog(QDialog):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
148 def __init__(self, windows_data, parent=None):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
149 super().__init__(parent)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
150 self.__a_result = asyncio.get_running_loop().create_future()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
151 self.setWindowTitle("Please select a window to share:")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
152 self.resize(400, 300)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
153 self.list_widget = QListWidget(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
154 for window_data in windows_data:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
155 item = QListWidgetItem(window_data["title"])
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
156 item.setData(Qt.ItemDataRole.UserRole, window_data)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
157 self.list_widget.addItem(item)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
158
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
159 self.buttonBox = QDialogButtonBox(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
160 QDialogButtonBox.StandardButton.Ok | QDialogButtonBox.StandardButton.Cancel
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
161 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
162 self.buttonBox.accepted.connect(self.on_accepted)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
163 self.buttonBox.rejected.connect(self.on_rejected)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
164
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
165 layout = QVBoxLayout(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
166 layout.addWidget(self.list_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
167 layout.addWidget(self.buttonBox)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
168
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
169 def get_selected_window(self) -> dict | None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
170 selectedItem = self.list_widget.currentItem()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
171 if selectedItem:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
172 return selectedItem.data(Qt.ItemDataRole.UserRole)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
173 return None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
174
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
175 def on_accepted(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
176 self.__a_result.set_result(self.get_selected_window())
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
177 self.close()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
178
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
179 def on_rejected(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
180 self.__a_result.set_result(None)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
181 self.close()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
182
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
183 def closeEvent(self, a0):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
184 super().closeEvent(a0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
185 if not self.__a_result.done():
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
186 self.__a_result.set_result(None)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
187
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
188 async def a_show(self) -> dict | None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
189 self.open()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
190 return await self.__a_result
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
191
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
192
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
193 class AVCallUI(QMainWindow):
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
194 def __init__(self, host, icons_path: Path):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
195 super().__init__()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
196 self.host = host
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
197 self.webrtc_call = None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
198 self.icons_path = icons_path
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
199 self.initUI()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
200
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
201 @staticmethod
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
202 async def run_qt_loop(app):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
203 while running:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
204 app.sendPostedEvents()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
205 await asyncio.sleep(0.1)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
207 @classmethod
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
208 async def run(cls, parent, call_data):
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
209 """Run PyQt loop and show the app"""
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
210 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
211 icons_path = media_dir / "fonts/fontello/svg"
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
212 app = QApplication([])
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
213 av_call_gui = cls(parent.host, icons_path)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
214 av_call_gui.show()
4233
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
215 webrtc_call = await webrtc.WebRTCCall.make_webrtc_call(
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
216 parent.host.bridge,
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
217 parent.profile,
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
218 call_data,
4240
79c8a70e1813 backend, frontend: prepare remote control:
Goffi <goffi@goffi.org>
parents: 4233
diff changeset
219 sinks_data=webrtc.SinksApp(
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
220 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
221 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
222 ),
4233
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
223 # we want to be sure that call is ended if user presses `Ctrl + c` or anything
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
224 # else stops the session.
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
225 on_call_setup_cb=lambda sid, profile: parent.host.add_on_quit_callback(
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
226 parent.host.bridge.call_end, sid, "", profile
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
227 ),
d01b8d002619 cli (call, file), frontends: implement webRTC data channel transfer:
Goffi <goffi@goffi.org>
parents: 4210
diff changeset
228 on_call_ended_cb=lambda sid, profile: parent.host.a_quit(),
4206
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 av_call_gui.webrtc_call = webrtc_call
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
231
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
232 global running
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
233 running = True
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
234 await cls.run_qt_loop(app)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
235 await parent.host.a_quit()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
236
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
237 def initUI(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
238 self.setGeometry(100, 100, 800, 600)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
239 self.setWindowTitle("Call")
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 # Main layouts
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
242 self.background_widget = QWidget(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
243 self.foreground_widget = QWidget(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
244 self.setCentralWidget(self.background_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
245 back_layout = QVBoxLayout(self.background_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
246 front_layout = QVBoxLayout(self.foreground_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 # Remote video
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
249 self.remote_video_widget = QLabel(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
250 self.remote_video_widget.setSizePolicy(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
251 QSizePolicy.Policy.Ignored, QSizePolicy.Policy.Ignored
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
252 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
253 back_layout.addWidget(self.remote_video_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
254
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
255 # Fullscreen button
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
256 fullscreen_layout = QHBoxLayout()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
257 front_layout.addLayout(fullscreen_layout)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
258 fullscreen_layout.addStretch()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
259 self.fullscreen_btn = QPushButton("", self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
260 self.fullscreen_btn.setFixedSize(BUTTON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
261 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
262 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
263 self.fullscreen_btn.setIcon(self.fullscreen_icon_normal)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
264 self.fullscreen_btn.setIconSize(ICON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
265 self.fullscreen_btn.clicked.connect(self.toggle_fullscreen)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
266 fullscreen_layout.addWidget(self.fullscreen_btn)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
267
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
268 # Control buttons
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
269 self.control_buttons_layout = QHBoxLayout()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
270 self.control_buttons_layout.setSpacing(40)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
271 self.toggle_video_btn = cast(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
272 ActivableButton, self.add_control_button("videocam", self.toggle_video)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
273 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
274 self.toggle_audio_btn = cast(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
275 ActivableButton, self.add_control_button("volume-up", self.toggle_audio)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
276 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
277 self.share_desktop_btn = cast(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
278 ActivableButton, self.add_control_button("desktop", self.share_desktop)
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 self.share_desktop_btn.deactivated_colour = "#47c68e"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
281 self.share_desktop_btn.activated_colour = "#f24468"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
282 self.share_desktop_btn.line_colour = "#666666"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
283 self.share_desktop_btn.activated = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
284 self.hang_up_btn = self.add_control_button(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
285 "phone", self.hang_up, rotate=135, background="red", activable=False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
286 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
287
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
288 controls_widget = QWidget(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
289 controls_widget.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
290 controls_widget.setLayout(self.control_buttons_layout)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
291 front_layout.addStretch()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
292
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
293 bottom_layout = QHBoxLayout()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
294 bottom_layout.addStretch()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
295 front_layout.addLayout(bottom_layout)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
296 bottom_layout.addWidget(controls_widget, alignment=Qt.AlignmentFlag.AlignBottom)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
297
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
298 # Local video feedback
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
299 bottom_layout.addStretch()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
300 self.local_video_widget = QLabel(self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
301 bottom_layout.addWidget(self.local_video_widget)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
302
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
303 # we update sizes on resize event
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
304 self.background_widget.resizeEvent = self.adjust_sizes
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
305 self.adjust_sizes()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
306
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
307 def add_control_button(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
308 self,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
309 icon_name: str,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
310 callback: Callable,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
311 rotate: float | None = None,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
312 background: str | None = None,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
313 activable: bool = True,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
314 ) -> QPushButton | ActivableButton:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
315 if activable:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
316 button = ActivableButton("", self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
317 else:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
318 button = QPushButton("", self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
319 icon_path = self.icons_path / f"{icon_name}.svg"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
320 button.setIcon(QIcon(str(icon_path)))
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
321 button.setIconSize(ICON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
322 button.setFixedSize(BUTTON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
323 if rotate is not None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
324 pixmap = button.icon().pixmap(ICON_SIZE)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
325 transform = QTransform()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
326 transform.rotate(rotate)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
327 rotated_pixmap = pixmap.transformed(transform)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
328 button.setIcon(QIcon(rotated_pixmap))
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
329 if background:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
330 button.setStyleSheet(f"background-color: {background};")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
331 button.clicked.connect(callback)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
332 self.control_buttons_layout.addWidget(button)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
333 return button
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
334
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
335 def adjust_sizes(self, a0: QResizeEvent | None = None) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
336 self.foreground_widget.setGeometry(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
337 0, 0, self.background_widget.width(), self.background_widget.height()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
338 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
339 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
340 if a0 is not None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
341 super().resizeEvent(a0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
342
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
343 def on_new_sample(self, video_sink, video_stream: str) -> bool:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
344 sample = video_sink.emit("pull-sample")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
345 if sample is None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
346 return False
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 video_pad = video_sink.get_static_pad("sink")
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
349 assert video_pad is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
350 s = video_pad.get_current_caps().get_structure(0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
351 stream_size = (s.get_value("width"), s.get_value("height"))
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
352 self.host.loop.loop.call_soon_threadsafe(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
353 self.update_sample, sample, stream_size, video_stream
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
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
356 return False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
357
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
358 def update_sample(self, sample, stream_size, video_stream: str) -> None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
359 if sample is None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
360 return
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
361
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
362 video_widget = (
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
363 self.remote_video_widget
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
364 if video_stream == "remote"
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
365 else self.local_video_widget
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
366 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
367
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
368 buf = sample.get_buffer()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
369 result, mapinfo = buf.map(Gst.MapFlags.READ)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
370 if result:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
371 buffer = mapinfo.data
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
372 width, height = stream_size
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
373 qimage = QImage(buffer, width, height, QImage.Format.Format_RGB888)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
374 pixmap = QPixmap.fromImage(qimage).scaled(
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
375 QSize(video_widget.width(), video_widget.height()),
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
376 Qt.AspectRatioMode.KeepAspectRatio,
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
377 )
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
378 video_widget.setPixmap(pixmap)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
379 video_widget.setAlignment(Qt.AlignmentFlag.AlignCenter)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
380
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
381 buf.unmap(mapinfo)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
382
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
383 def toggle_fullscreen(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
384 fullscreen = not self.isFullScreen()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
385 if fullscreen:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
386 self.fullscreen_btn.setIcon(self.fullscreen_icon_fullscreen)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
387 self.showFullScreen()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
388 else:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
389 self.fullscreen_btn.setIcon(self.fullscreen_icon_normal)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
390 self.showNormal()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
391
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
392 def closeEvent(self, a0: QCloseEvent|None) -> None:
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
393 super().closeEvent(a0)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
394 global running
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
395 running = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
396
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
397 def toggle_video(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
398 assert self.webrtc_call is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
399 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
400 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
401
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
402 def toggle_audio(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
403 assert self.webrtc_call is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
404 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
405 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
406
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
407 def share_desktop(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
408 assert self.webrtc_call is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
409 if self.webrtc_call.webrtc.desktop_sharing:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
410 self.webrtc_call.webrtc.desktop_sharing = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
411 self.share_desktop_btn.activated = False
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
412 elif display_servers.detect() == display_servers.X11:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
413 aio.run_async(self.show_X11_screen_dialog())
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
414 else:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
415 self.webrtc_call.webrtc.desktop_sharing = True
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
416
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
417 def hang_up(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
418 self.close()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
419
4210
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
420 @staticmethod
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
421 def can_run():
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
422 # 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
423 return display_servers.detect() is not None
9218d4331bb2 cli (call): `tui` output implementation:
Goffi <goffi@goffi.org>
parents: 4206
diff changeset
424
4206
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
425 async def show_X11_screen_dialog(self):
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
426 assert self.webrtc_call is not None
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
427 windows_data = display_servers.x11_list_windows()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
428 dialog = X11DesktopScreenDialog(windows_data, self)
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
429 selected = await dialog.a_show()
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
430 if selected is not None:
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
431 xid = selected["id"]
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
432 self.webrtc_call.webrtc.desktop_sharing_data = {"xid": xid}
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
433 self.webrtc_call.webrtc.desktop_sharing = True
0f8ea0768a3b cli (call): implement GUI output:
Goffi <goffi@goffi.org>
parents:
diff changeset
434 self.share_desktop_btn.activated = True