def build_canvas(self, e): self.document = OCCanvas(self.netobj.canvas_size, self.netobj.total_layer_count) self.canvas = TiledDrawWidget(document=self.document) self.wTree.get_object("drawingviewport").add(self.canvas) # Connect network -> local_viewport self.netobj.connect( 'draw', lambda e, l, b, p: self.document.draw_points(l, b, p)) self.netobj.connect('clear-layer', lambda e, l: self.document.clear_layer(l)) self.netobj.connect('undo-request', lambda e, l: self.document.undo_layer_action(l)) # Connect local_viewport -> network self.document.stroke_observers.append(self.on_stroke) self.canvas.show()
def build_canvas(self, e): self.document = OCCanvas(self.netobj.canvas_size, self.netobj.total_layer_count) self.canvas = TiledDrawWidget(document = self.document) self.wTree.get_object("drawingviewport").add(self.canvas) # Connect network -> local_viewport self.netobj.connect('draw', lambda e,l,b,p: self.document.draw_points(l,b,p)) self.netobj.connect('clear-layer', lambda e,l: self.document.clear_layer(l)) self.netobj.connect('undo-request', lambda e,l: self.document.undo_layer_action(l)) # Connect local_viewport -> network self.document.stroke_observers.append(self.on_stroke) self.canvas.show()
class DrawGUI: remote_host = "127.0.0.1" remote_port = 9001 canvas = None def __init__(self): self.netobj = None self.build_gui() self.connect() def connect(self): # Do connection factory = self.ClientFactory(self.on_connect, "Python OC", "") reactor.connectTCP(self.remote_host, self.remote_port, factory) reactor.run() def on_connect(self, netobj): self.netobj = netobj self.netobj.connect('update-users', self.on_userlist_change) self.netobj.connect('ready', self.build_canvas) self.netobj.connect('message', self.on_message) def send_chat_message(self): tb = self.wTree.get_object('chat_typing_area') message = tb.get_text() tb.set_text('') tb.grab_focus() if self.netobj: self.netobj.send_chat_message(message) cb = self.wTree.get_object("chat_text_buffer") cb.insert(cb.get_end_iter(), '[' + self.netobj.username + '] ' + message + "\n") def build_gui(self): self.wTree = gtk.Builder() self.wTree.add_from_file("oc.glade") self.wTree.get_object("main_window").connect('destroy', lambda a: sys.exit()) self.wTree.get_object("chat_send_button").connect( 'clicked', lambda w: self.send_chat_message()) self.wTree.get_object("main_window").show_all() self.update_input_devices() def build_canvas(self, e): self.document = OCCanvas(self.netobj.canvas_size, self.netobj.total_layer_count) self.canvas = TiledDrawWidget(document=self.document) self.wTree.get_object("drawingviewport").add(self.canvas) # Connect network -> local_viewport self.netobj.connect( 'draw', lambda e, l, b, p: self.document.draw_points(l, b, p)) self.netobj.connect('clear-layer', lambda e, l: self.document.clear_layer(l)) self.netobj.connect('undo-request', lambda e, l: self.document.undo_layer_action(l)) # Connect local_viewport -> network self.document.stroke_observers.append(self.on_stroke) self.canvas.show() def on_stroke(self, stroke, brush): points = [] brush_settings = {'size': 1, 'color': 0, 'pressure_correct': 1.0} layer_number = 3 version, data = stroke.stroke_data[0], stroke.stroke_data[1:] assert version == '2' data = np.fromstring(data, dtype='float64') data.shape = (len(data) / 6, 6) lx, ly = data[0][1:3] for dtime, x, y, pressure, xtilt, ytilt in data[1:]: ox = 2 * x - lx oy = 2 * y - ly points.append([ox, oy, pressure * 1024.0]) self.netobj.send_strokes(layer_number, brush_settings, points) def on_userlist_change(self, e): ls = self.wTree.get_object("user_list").get_model() ls.clear() [ls.append([user[0]]) for user in self.netobj.user_list] def on_message(self, e, uid, message): name = filter(lambda u: u[2] == uid, self.netobj.user_list)[0][0] cb = self.wTree.get_object("chat_text_buffer") cb.insert(cb.get_end_iter(), '[' + name + '] ' + message + "\n") def update_input_devices(self): # init extended input devices self.pressure_devices = [] for device in gtk.gdk.devices_list(): #print device.name, device.source #if device.source in [gdk.SOURCE_PEN, gdk.SOURCE_ERASER]: # The above contition is True sometimes for a normal USB # Mouse. https://gna.org/bugs/?11215 # In fact, GTK also just guesses this value from device.name. last_word = device.name.split()[-1].lower() if last_word == 'pad': # Setting the intuos3 pad into "screen mode" causes # glitches when you press a pad-button in mid-stroke, # and it's not a pointer device anyway. But it reports # axes almost identical to the pen and eraser. # # device.name is usually something like "wacom intuos3 6x8 pad" or just "pad" print 'Ignoring "%s" (probably wacom keypad device)' % device.name continue if last_word == 'touchpad': # eg. "SynPS/2 Synaptics TouchPad" # Cannot paint at all, cannot select brushes, if we enable this one. print 'Ignoring "%s" (probably laptop touchpad which screws up gtk+ if enabled)' % device.name continue if last_word == 'cursor': # this is a "normal" mouse and does not work in screen mode print 'Ignoring "%s" (probably wacom mouse device)' % device.name continue for use, val_min, val_max in device.axes: # Some mice have a third "pressure" axis, but without # minimum or maximum. https://gna.org/bugs/?14029 if use == gtk.gdk.AXIS_PRESSURE and val_min != val_max: if 'mouse' in device.name.lower(): # Real fix for the above bug https://gna.org/bugs/?14029 print 'Ignoring "%s" (probably a mouse, but it reports extra axes)' % device.name continue self.pressure_devices.append(device.name) modesetting = 'screen' mode = getattr(gtk.gdk, 'MODE_' + modesetting.upper()) if device.mode != mode: print 'Setting %s mode for "%s"' % (modesetting, device.name) device.set_mode(mode) break class ClientFactory(protocol.ClientFactory): protocol = OC11NetworkProtocol def __init__(self, on_create, *args, **kwargs): self.args = args self.kwargs = kwargs self.on_create = on_create # Callback for factory creation def buildProtocol(self, address): p = self.protocol(*self.args, **self.kwargs) p.factory = self if self.on_create: self.on_create(p) return p def clientConnectionFailed(self, connector, reason): print "Connection failed, disconnecting." reactor.stop() def clientConnectionLost(self, connector, reason): print "Connection lost." reactor.stop()
class DrawGUI: remote_host = "127.0.0.1" remote_port = 9001 canvas = None def __init__(self): self.netobj = None self.build_gui() self.connect() def connect(self): # Do connection factory = self.ClientFactory(self.on_connect, "Python OC", "") reactor.connectTCP(self.remote_host, self.remote_port, factory) reactor.run() def on_connect(self, netobj): self.netobj = netobj self.netobj.connect('update-users', self.on_userlist_change) self.netobj.connect('ready', self.build_canvas) self.netobj.connect('message', self.on_message) def send_chat_message(self): tb = self.wTree.get_object('chat_typing_area') message = tb.get_text() tb.set_text('') tb.grab_focus() if self.netobj: self.netobj.send_chat_message(message) cb = self.wTree.get_object("chat_text_buffer") cb.insert(cb.get_end_iter(), '['+self.netobj.username+'] '+message+"\n") def build_gui(self): self.wTree = gtk.Builder() self.wTree.add_from_file("oc.glade") self.wTree.get_object("main_window").connect('destroy', lambda a: sys.exit()) self.wTree.get_object("chat_send_button").connect('clicked', lambda w:self.send_chat_message()) self.wTree.get_object("main_window").show_all() self.update_input_devices() def build_canvas(self, e): self.document = OCCanvas(self.netobj.canvas_size, self.netobj.total_layer_count) self.canvas = TiledDrawWidget(document = self.document) self.wTree.get_object("drawingviewport").add(self.canvas) # Connect network -> local_viewport self.netobj.connect('draw', lambda e,l,b,p: self.document.draw_points(l,b,p)) self.netobj.connect('clear-layer', lambda e,l: self.document.clear_layer(l)) self.netobj.connect('undo-request', lambda e,l: self.document.undo_layer_action(l)) # Connect local_viewport -> network self.document.stroke_observers.append(self.on_stroke) self.canvas.show() def on_stroke(self, stroke, brush): points = [] brush_settings = { 'size': 1, 'color': 0, 'pressure_correct': 1.0 } layer_number = 3 version, data = stroke.stroke_data[0], stroke.stroke_data[1:] assert version == '2' data = np.fromstring(data, dtype='float64') data.shape = (len(data)/6, 6) lx, ly = data[0][1:3] for dtime, x, y, pressure, xtilt, ytilt in data[1:]: ox = 2 * x - lx oy = 2 * y - ly points.append([ox, oy, pressure * 1024.0]) self.netobj.send_strokes(layer_number, brush_settings, points) def on_userlist_change(self, e): ls = self.wTree.get_object("user_list").get_model() ls.clear() [ls.append([user[0]]) for user in self.netobj.user_list] def on_message(self, e, uid, message): name = filter(lambda u: u[2]==uid,self.netobj.user_list)[0][0] cb = self.wTree.get_object("chat_text_buffer") cb.insert(cb.get_end_iter(), '['+name+'] '+message+"\n") def update_input_devices(self): # init extended input devices self.pressure_devices = [] for device in gtk.gdk.devices_list(): #print device.name, device.source #if device.source in [gdk.SOURCE_PEN, gdk.SOURCE_ERASER]: # The above contition is True sometimes for a normal USB # Mouse. https://gna.org/bugs/?11215 # In fact, GTK also just guesses this value from device.name. last_word = device.name.split()[-1].lower() if last_word == 'pad': # Setting the intuos3 pad into "screen mode" causes # glitches when you press a pad-button in mid-stroke, # and it's not a pointer device anyway. But it reports # axes almost identical to the pen and eraser. # # device.name is usually something like "wacom intuos3 6x8 pad" or just "pad" print 'Ignoring "%s" (probably wacom keypad device)' % device.name continue if last_word == 'touchpad': # eg. "SynPS/2 Synaptics TouchPad" # Cannot paint at all, cannot select brushes, if we enable this one. print 'Ignoring "%s" (probably laptop touchpad which screws up gtk+ if enabled)' % device.name continue if last_word == 'cursor': # this is a "normal" mouse and does not work in screen mode print 'Ignoring "%s" (probably wacom mouse device)' % device.name continue for use, val_min, val_max in device.axes: # Some mice have a third "pressure" axis, but without # minimum or maximum. https://gna.org/bugs/?14029 if use == gtk.gdk.AXIS_PRESSURE and val_min != val_max: if 'mouse' in device.name.lower(): # Real fix for the above bug https://gna.org/bugs/?14029 print 'Ignoring "%s" (probably a mouse, but it reports extra axes)' % device.name continue self.pressure_devices.append(device.name) modesetting = 'screen' mode = getattr(gtk.gdk, 'MODE_' + modesetting.upper()) if device.mode != mode: print 'Setting %s mode for "%s"' % (modesetting, device.name) device.set_mode(mode) break class ClientFactory(protocol.ClientFactory): protocol = OC11NetworkProtocol def __init__(self, on_create, *args, **kwargs): self.args = args self.kwargs = kwargs self.on_create = on_create # Callback for factory creation def buildProtocol(self, address): p = self.protocol(*self.args, **self.kwargs) p.factory = self if self.on_create: self.on_create(p) return p def clientConnectionFailed(self, connector, reason): print "Connection failed, disconnecting." reactor.stop() def clientConnectionLost(self, connector, reason): print "Connection lost." reactor.stop()