Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
98efc08
Add PySide6 GUI for QuickSync4Linux
pandinusimp Jun 1, 2026
d9b3f86
Rename module to QuickSync4LinuxQT
pandinusimp Jun 1, 2026
f1513c7
Rename module to QuickSync4LinuxGui
pandinusimp Jun 1, 2026
2119e13
Startfehler behoben
pandinusimp Jun 1, 2026
e227b65
added Screenshot images and update readme.md
pandinusimp Jun 1, 2026
ca10f1c
updates screenshots
pandinusimp Jun 1, 2026
c6f1e11
Clear message when calling Filemanager
pandinusimp Jun 1, 2026
ab5533e
Changes to Screenshot
pandinusimp Jun 1, 2026
a3c6eaa
Renamed Screenshot folder
pandinusimp Jun 1, 2026
404f43a
changes to readme.md
pandinusimp Jun 1, 2026
56b18bb
another change to readme.md
pandinusimp Jun 1, 2026
23ce6a3
another change to readme.md to fit Screenshots
pandinusimp Jun 1, 2026
797a99f
another change to readme.md to fit Screenshots
pandinusimp Jun 1, 2026
363d91d
Add RotatingFileHandler for log management
pandinusimp Jun 1, 2026
4101791
Separate gui from function
pandinusimp Jun 3, 2026
89b9289
Rename gui_qt.py to gui.py and make changes to open file dialog
pandinus Jun 3, 2026
c68f33a
Change Logflie function
pandinusimp Jun 3, 2026
8424979
Optimization to Logfile function
pandinusimp Jun 3, 2026
8aef843
Log function and open dialog improved
pandinusimp Jun 4, 2026
fff7b7b
Logic improved
pandinusimp Jun 5, 2026
67fe3ac
cleaned aup the code
pandinusimp Jun 5, 2026
c1a9591
fixed som bugs
pandinusimp Jun 5, 2026
3a0bc8d
Prefer Gigaset device on startup
pandinusimp Jun 5, 2026
277c82c
back to riginal main.py
pandinusimp Jun 5, 2026
35e2931
Auto-check connection on startup, improve BT error messages
pandinusimp Jun 6, 2026
fea4f8c
Filter BT devices to phones only, add Bluetooth/Serial toggle
pandinusimp Jun 6, 2026
79b4f0e
Open home directory in upload file dialog
pandinusimp Jun 7, 2026
0dbedde
Fix Screenshots typo, update README to English
pandinusimp Jun 11, 2026
926e961
Make PySide6 optional, fix Screenshots typo, update README
pandinusimp Jun 11, 2026
e1ab108
Translate GUI and error messages to English
pandinusimp Jun 11, 2026
c3047d6
Refactor: replace subprocess calls with direct quicksync function cal…
pandinusimp Jun 11, 2026
20580c3
i18n: translate remaining English strings in backend and GUI
pandinusimp Jun 11, 2026
98f32c1
i18n: translate remaining English strings in backend and GUI
pandinusimp Jun 11, 2026
eeef216
i18n: fix translations for FileManagerWindow and ContactsWindow contexts
pandinusimp Jun 11, 2026
83e3b95
gui: replace fixed sidebar with resizable QSplitter
pandinusimp Jun 11, 2026
4a63b24
build: fix hatchling wheel packaging and add GUI desktop entry
pandinusimp Jun 11, 2026
f0a378d
docs: add desktop entry installation instructions to README
pandinusimp Jun 11, 2026
c05eaaa
i18n: add missing backend error string translations to de.ts
pandinusimp Jun 11, 2026
d113706
i18n: fix missing translations for backend errors and status messages
pandinusimp Jun 11, 2026
30e5daa
docs: use English screenshot filenames in README
pandinusimp Jun 11, 2026
8d7bfdb
docs: fix desktop file name capitalization in README
pandinusimp Jun 11, 2026
eede8a7
docs: rename screenshot files to English
pandinusimp Jun 11, 2026
b74267d
feat: add language selection to settings sidebar
pandinusimp Jun 11, 2026
9158ce5
i18n: fix remaining hardcoded strings, use English as tr() source and…
pandinusimp Jun 11, 2026
e55c187
i18n: add all remaining missing translation strings to de.ts
pandinusimp Jun 12, 2026
b63fc06
fix: undefined 'self' reference in standalone simple_input()
pandinusimp Jun 12, 2026
00bb4b2
chore: remove leftover QT_LOGGING_RULES from __main__.py
pandinusimp Jun 12, 2026
06c3ea7
i18n: fix remaining hardcoded German strings in file manager
pandinusimp Jun 13, 2026
ea5b874
added language settings screenshot and updated Readme.md
pandinusimp Jun 13, 2026
a6a8907
build: add optional 'gui' dependency group for PySide6
pandinusimp Jun 14, 2026
4359a07
docs: polish GUI comments and requirements file
pandinusimp Jun 14, 2026
6ed2e05
refactor: split GUI into separate QuickSync4LinuxGui package
pandinusimp Jun 17, 2026
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: 9 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Translation workflow
# 1. Extract strings from source
update-ts:
pyside6-lupdate QuickSync4LinuxGui/QuickSync4LinuxGui/gui.py -ts QuickSync4LinuxGui/QuickSync4LinuxGui/lang/de.ts
# 2. Compile .ts to .qm
compile-ts:
lrelease6 QuickSync4LinuxGui/QuickSync4LinuxGui/lang/de.ts
# Do both
i18n: update-ts compile-ts
3 changes: 1 addition & 2 deletions QuickSync4Linux/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,4 @@
__license__ = 'GPL-3.0'
__version__ = '1.0'
__website__ = 'https://github.com/schorschii/QuickSync4Linux'

__all__ = [__author__, __license__, __version__]
__all__ = [__author__, __license__, __version__]
2 changes: 1 addition & 1 deletion QuickSync4Linux/__main__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from . import quicksync

if __name__ == '__main__':
quicksync.main()
quicksync.main()
71 changes: 71 additions & 0 deletions QuickSync4Linux/btserial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
#!/usr/bin/env python3

import socket
import select
import time
import fcntl
import struct
import termios

from serial import SerialTimeoutException


class BluetoothSerial:
"""Drop-in replacement for serial.Serial backed by an RFCOMM socket.
Implements only the subset of pyserial's API used by quicksync:
name, write, read, in_waiting."""

def __init__(self, address, channel=1, write_timeout=None):
self.name = f'bt:{address}@{channel}'
self._write_timeout = write_timeout
self._sock = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
self._sock.connect((address, channel))
self._sock.setblocking(False)

@property
def in_waiting(self):
buf = fcntl.ioctl(self._sock.fileno(), termios.FIONREAD, b'\x00\x00\x00\x00')
return struct.unpack('I', buf)[0]

def write(self, data):
total = 0
deadline = time.monotonic() + self._write_timeout if self._write_timeout else None
while total < len(data):
remaining = (deadline - time.monotonic()) if deadline is not None else None
if remaining is not None and remaining <= 0:
raise SerialTimeoutException('Write timeout')
_, w, _ = select.select([], [self._sock], [], remaining)
if not w:
raise SerialTimeoutException('Write timeout')
try:
sent = self._sock.send(data[total:])
except BlockingIOError:
continue
if sent == 0:
raise OSError('Bluetooth socket closed by peer')
total += sent
return total

def read(self, n):
if n <= 0:
return b''
try:
return self._sock.recv(n)
except BlockingIOError:
return b''

def close(self):
self._sock.close()


BT_ADDR_RE = __import__('re').compile(r'^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}(@\d+)?$')

def isBluetoothAddress(s):
return BT_ADDR_RE.match(s) is not None

def parseBluetoothAddress(s):
"""Returns (mac, channel) where channel defaults to 1."""
if '@' in s:
mac, ch = s.rsplit('@', 1)
return mac, int(ch)
return s, 1
Loading