Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Scale pyrdp-player replays with window height #208

Merged
merged 20 commits into from
Apr 15, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 5 additions & 4 deletions pyrdp/player/BaseTab.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,12 @@ def __init__(self, viewer: QRemoteDesktop, parent: QWidget = None):
self.text.setMinimumHeight(150)
self.log = logging.getLogger(LOGGER_NAMES.PLAYER)

scrollViewer = QScrollArea()
scrollViewer.setWidget(self.widget)

self.tabLayout = QVBoxLayout()
self.tabLayout.addWidget(scrollViewer, 8)

self.scrollViewer = QScrollArea()
self.scrollViewer.setWidget(self.widget)

self.tabLayout.addWidget(self.scrollViewer, 10)
self.tabLayout.addWidget(self.text, 2)

self.setLayout(self.tabLayout)
4 changes: 2 additions & 2 deletions pyrdp/player/LiveTab.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,12 @@
from PySide2.QtCore import Qt
from PySide2.QtWidgets import QHBoxLayout, QWidget

from pyrdp.mitm.PlayerLayerSet import AsyncIOPlayerLayerSet
from pyrdp.player.AttackerBar import AttackerBar
from pyrdp.player.BaseTab import BaseTab
from pyrdp.player.filesystem import DirectoryObserver, FileSystem
from pyrdp.player.FileSystemWidget import FileSystemWidget
from pyrdp.player.LiveEventHandler import LiveEventHandler
from pyrdp.mitm.PlayerLayerSet import AsyncIOPlayerLayerSet
from pyrdp.player.RDPMITMWidget import RDPMITMWidget


Expand All @@ -23,7 +23,7 @@ class LiveTab(BaseTab, DirectoryObserver):
Tab playing a live RDP connection as data is being received over the network.
"""

def __init__(self, parent: QWidget = None):
def __init__(self, parent: QWidget):
layers = AsyncIOPlayerLayerSet()
rdpWidget = RDPMITMWidget(1024, 768, layers.player)

Expand Down
5 changes: 3 additions & 2 deletions pyrdp/player/LiveWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from pyrdp.player.LiveTab import LiveTab
from pyrdp.player.LiveThread import LiveThread


class LiveWindow(BaseWindow):
"""
Class that holds logic for live player (network RDP connections as they happen) tabs.
Expand All @@ -23,7 +24,7 @@ class LiveWindow(BaseWindow):
connectionReceived = Signal()
closedTabText = " - Closed"

def __init__(self, address: str, port: int, updateCountSignal: Signal, options: Dict[str, object], parent: QWidget = None):
def __init__(self, address: str, port: int, updateCountSignal: Signal, options: Dict[str, object], parent: QWidget):
super().__init__(options, parent)

QApplication.instance().aboutToQuit.connect(self.onClose)
Expand All @@ -40,7 +41,7 @@ def onConnection(self) -> asyncio.Protocol:
return tab.getProtocol()

def createLivePlayerTab(self):
tab = LiveTab()
tab = LiveTab(parent=self)
tab.addIconToTab.connect(self.addIconToTab)
tab.renameTab.connect(self.renameLivePlayerTab)
tab.connectionClosed.connect(self.onConnectionClosed)
Expand Down
14 changes: 2 additions & 12 deletions pyrdp/player/MainWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
from typing import List

from PySide2.QtCore import Qt, Signal
from PySide2.QtGui import QResizeEvent
from PySide2.QtWidgets import QAction, QFileDialog, QInputDialog, QMainWindow, QTabWidget

from pyrdp.player import BaseTab
Expand Down Expand Up @@ -35,8 +34,8 @@ def __init__(self, bind_address: str, port: int, filesToRead: [str]):
"closeTabOnCtrlW": True # Allow user to toggle Ctrl+W passthrough.
}

self.liveWindow = LiveWindow(bind_address, port, self.updateCountSignal, self.options)
self.replayWindow = ReplayWindow(self.options, mainWindow=self)
self.liveWindow = LiveWindow(bind_address, port, self.updateCountSignal, self.options, parent=self)
self.replayWindow = ReplayWindow(self.options, mainWindow=self, parent=self)
Res260 marked this conversation as resolved.
Show resolved Hide resolved
self.tabManager = QTabWidget()
self.tabManager.addTab(self.liveWindow, "Live connections")
self.tabManager.addTab(self.replayWindow, "Replays")
Expand Down Expand Up @@ -141,12 +140,3 @@ def updateTabConnectionCount(self):
"""

self.tabManager.setTabText(0, "Live connections (%d)" % self.liveWindow.count())

def addObserver(self, observer: BaseTab):
self.resizeObservers.append(observer)
observer.mainWindowResized(self.width(), self.height())

def resizeEvent(self, event: QResizeEvent):
for observer in self.resizeObservers:
observer.mainWindowResized(event.size().width(), event.size().height())
super().resizeEvent(event)
20 changes: 15 additions & 5 deletions pyrdp/player/ReplayTab.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class ReplayTab(BaseTab):
Tab that displays a RDP Connection that is being replayed from a file.
"""

def __init__(self, fileName: str, parent: QWidget = None):
def __init__(self, fileName: str, parent: QWidget):
"""
:param fileName: name of the file to read.
:param parent: parent widget.
Expand All @@ -45,7 +45,7 @@ def __init__(self, fileName: str, parent: QWidget = None):
self.controlBar.pause.connect(self.thread.pause)
self.controlBar.seek.connect(self.thread.seek)
self.controlBar.speedChanged.connect(self.thread.setSpeed)
self.controlBar.scaleCheckbox.stateChanged.connect(self.widget.setScaleToWindow)
self.controlBar.scaleCheckbox.stateChanged.connect(self.setScaleToWindow)
self.controlBar.button.setDefault(True)

self.tabLayout.insertWidget(0, self.controlBar)
Expand Down Expand Up @@ -90,12 +90,22 @@ def onClose(self):
self.thread.close()
self.thread.wait()

def mainWindowResized(self, width: int, height: int):
def setScaleToWindow(self, status: int):
"""
Called when the scale to window checkbox is checked or unchecked, refresh
the scaling calculation.
:param status: state of the checkbox
"""
self.parentResized(self.parent().width(), self.parent().height())
self.widget.setScaleToWindow(status)

def parentResized(self, width: int, height: int):
"""
Called when the main PyRDP window is resized to allow to scale the current
RDP session being displayed.
:param width: The new width of the main window
:param height: The new height of the main window
"""
self.widget.scale((height - self.text.height() - 200) / self.widget.sessionHeight)
self.thread.mainWindowResized()
newScale = (self.scrollViewer.height() - self.scrollViewer.horizontalScrollBar().height()) / self.widget.sessionHeight
self.widget.scale(newScale)
self.thread.parentResized()
2 changes: 1 addition & 1 deletion pyrdp/player/ReplayThread.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def setSpeed(self, speed: float):
def close(self):
self.queue.put(ReplayThreadEvent.EXIT)

def mainWindowResized(self):
def parentResized(self):
"""
Seeks to current time to allow to rerender the image on the resized widget.
"""
Expand Down
11 changes: 8 additions & 3 deletions pyrdp/player/ReplayWindow.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

from typing import Dict

from PySide2.QtGui import QResizeEvent
from PySide2.QtWidgets import QWidget

from pyrdp.player import MainWindow
Expand All @@ -18,7 +19,7 @@ class ReplayWindow(BaseWindow):
Class for managing replay tabs.
"""

def __init__(self, options: Dict[str, object], mainWindow: MainWindow, parent: QWidget = None):
def __init__(self, options: Dict[str, object], mainWindow: MainWindow, parent: QWidget):
super().__init__(options, parent=parent)
self.mainWindow = mainWindow

Expand All @@ -27,9 +28,13 @@ def openFile(self, fileName: str, autoplay: bool = False):
Open a replay file and open a new tab.
:param fileName: replay path.
"""
tab = ReplayTab(fileName)
self.mainWindow.addObserver(tab)
tab = ReplayTab(fileName, parent=self)
self.addTab(tab, fileName)
self.log.debug("Loading replay file %(arg1)s", {"arg1": fileName})
if autoplay:
tab.play()

def resizeEvent(self, event: QResizeEvent):
alxbl marked this conversation as resolved.
Show resolved Hide resolved
super().resizeEvent(event)
for i in range(self.count()):
self.widget(i).parentResized(event.size().width(), event.size().height())
Res260 marked this conversation as resolved.
Show resolved Hide resolved