Example #1
0
    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()
Example #3
0
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()