|
@ -1,3 +1,8 @@ |
|
|
|
|
|
"""Magic-Wormhole bundled up inside a PyGtk GUI.""" |
|
|
|
|
|
|
|
|
|
|
|
import asyncio |
|
|
|
|
|
|
|
|
|
|
|
import asyncio_glib |
|
|
import gi |
|
|
import gi |
|
|
|
|
|
|
|
|
gi.require_version("Gtk", "3.0") |
|
|
gi.require_version("Gtk", "3.0") |
|
@ -7,58 +12,75 @@ from gi.repository import Gdk as gdk |
|
|
from gi.repository import GLib as glib |
|
|
from gi.repository import GLib as glib |
|
|
from gi.repository import Gtk as gtk |
|
|
from gi.repository import Gtk as gtk |
|
|
|
|
|
|
|
|
|
|
|
asyncio.set_event_loop_policy(asyncio_glib.GLibEventLoopPolicy()) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DropShip: |
|
|
|
|
|
"""Drag it, drop it, ship it.""" |
|
|
|
|
|
|
|
|
class Main: |
|
|
|
|
|
def __init__(self): |
|
|
def __init__(self): |
|
|
|
|
|
self.GLADE_FILE = "dropship.glade" |
|
|
|
|
|
self.CSS_FILE = "dropship.css" |
|
|
|
|
|
|
|
|
|
|
|
# Initiate the drag and drop area |
|
|
|
|
|
# https://python-gtk-3-tutorial.readthedocs.io/en/latest/drag_and_drop.html |
|
|
|
|
|
self.files_to_send = "" |
|
|
|
|
|
|
|
|
|
|
|
# todo check the target flags, https://lazka.github.io/pgi-docs/Gtk-3.0/flags.html#Gtk.TargetFlags |
|
|
|
|
|
self.enforce_target = gtk.TargetEntry.new("text/plain", gtk.TargetFlags(4), 129) |
|
|
|
|
|
|
|
|
|
|
|
self.main_window_id = "mainWindow" |
|
|
|
|
|
|
|
|
|
|
|
self.drop_box_id = "dropBox" |
|
|
|
|
|
self.drop_box_label = "dropLabel" |
|
|
|
|
|
|
|
|
# Connect to the Glade file |
|
|
self.init_glade() |
|
|
|
|
|
self.init_css() |
|
|
|
|
|
self.init_drop_box() |
|
|
|
|
|
|
|
|
|
|
|
def init_glade(self): |
|
|
|
|
|
"""Initialise the GUI from Glade file.""" |
|
|
self.builder = gtk.Builder() |
|
|
self.builder = gtk.Builder() |
|
|
self.builder.add_from_file("dropship.glade") |
|
|
self.builder.add_from_file(self.GLADE_FILE) |
|
|
self.builder.connect_signals(self) |
|
|
self.builder.connect_signals(self) |
|
|
|
|
|
|
|
|
# Connect to the Stylesheet |
|
|
def init_css(self): |
|
|
|
|
|
"""Initialise CSS injection.""" |
|
|
screen = gdk.Screen.get_default() |
|
|
screen = gdk.Screen.get_default() |
|
|
provider = gtk.CssProvider() |
|
|
provider = gtk.CssProvider() |
|
|
provider.load_from_path("./dropship.css") |
|
|
provider.load_from_path(self.CSS_FILE) |
|
|
gtk.StyleContext.add_provider_for_screen( |
|
|
gtk.StyleContext.add_provider_for_screen( |
|
|
screen, provider, gtk.STYLE_PROVIDER_PRIORITY_APPLICATION |
|
|
screen, provider, gtk.STYLE_PROVIDER_PRIORITY_APPLICATION |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
window = self.builder.get_object("mainWindow") |
|
|
async def init_window(self): |
|
|
|
|
|
"""Initialise the GUI window.""" |
|
|
|
|
|
window = self.builder.get_object(self.main_window_id) |
|
|
window.connect("delete-event", gtk.main_quit) |
|
|
window.connect("delete-event", gtk.main_quit) |
|
|
window.show() |
|
|
window.show() |
|
|
|
|
|
|
|
|
# self.stack = self.builder.get_object("sendReceiveStack") |
|
|
def init_drop_box(self): |
|
|
|
|
|
"""Initialise the drag & drop box.""" |
|
|
# Initiate the drag and drop area |
|
|
self.dropBox = self.builder.get_object(self.drop_box_id) |
|
|
# https://python-gtk-3-tutorial.readthedocs.io/en/latest/drag_and_drop.html |
|
|
|
|
|
self.files_to_send = "" |
|
|
|
|
|
|
|
|
|
|
|
# todo check the target flags, https://lazka.github.io/pgi-docs/Gtk-3.0/flags.html#Gtk.TargetFlags |
|
|
|
|
|
enforce_target = gtk.TargetEntry.new("text/plain", gtk.TargetFlags(4), 129) |
|
|
|
|
|
|
|
|
|
|
|
self.dropBox = self.builder.get_object("dropBox") |
|
|
|
|
|
self.dropBox.drag_dest_set( |
|
|
self.dropBox.drag_dest_set( |
|
|
gtk.DestDefaults.ALL, [enforce_target], gdk.DragAction.COPY |
|
|
gtk.DestDefaults.ALL, [self.enforce_target], gdk.DragAction.COPY |
|
|
) |
|
|
) |
|
|
self.dropBox.connect("drag-data-received", self.onDrop) |
|
|
self.dropBox.connect("drag-data-received", self.on_drop) |
|
|
self.dropLabel = self.builder.get_object("dropLabel") |
|
|
self.dropLabel = self.builder.get_object(self.drop_box_label) |
|
|
|
|
|
|
|
|
def onDrop(self, widget, drag_context, x, y, data, info, time): |
|
|
def on_drop(self, widget, drag_context, x, y, data, info, time): |
|
|
print(drag_context, x, y, data, info, time) |
|
|
|
|
|
files = data.get_text().split() |
|
|
files = data.get_text().split() |
|
|
|
|
|
|
|
|
if len(files) == 1: |
|
|
if len(files) == 1: |
|
|
print(files) |
|
|
# TODO: wormhole send that file |
|
|
self.dropLabel.set_text("Sending..") |
|
|
self.dropLabel.set_text("Sending..") |
|
|
elif len(files) > 1: |
|
|
|
|
|
print("multiple files!") |
|
|
|
|
|
print(files) |
|
|
|
|
|
self.dropLabel.set_text("\n".join(files)) |
|
|
|
|
|
|
|
|
|
|
|
self.files_to_send = files |
|
|
self.files_to_send = files |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def main(): |
|
|
|
|
|
"""The application entrypoint.""" |
|
|
|
|
|
dropship = DropShip() |
|
|
|
|
|
await dropship.init_window() |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
if __name__ == "__main__": |
|
|
Main() |
|
|
asyncio.run(main()) |
|
|
gtk.main() |
|
|
|
|
|