Esempio n. 1
0
    def __init__(self, server):
        super().__init__()
        self.exit_condition = exit_condition
        self.server = server
        self.timer = QTimer()
        self.timer.timeout.connect(self.show_message)
        self.timer.start(500)

        self.setWindowIcon(QIcon(os.path.join('pictures', 'raven.jpg')))
        self.setWindowTitle("RavenChat")

        # creating main labels
        self.user_host = QLabel(
            'Your host: ({}, {})'.format(self.server.server_ip,
                                         self.server.server_port), self)
        self.user_name = QLabel("Your name: {}".format(self.server.name), self)
        self.online_label = QLabel("Users online", self)

        # creating scroll bar
        qsb = QScrollBar()
        qsb.setTracking(False)
        qsb.setSliderPosition(qsb.maximum())

        # creating window to show users online
        self.users_online = QTextEdit()
        self.users_online.setReadOnly(True)
        self.users_online.setHorizontalScrollBar(qsb)
        self.users_online.setMaximumWidth(200)
        self.users_online.setMinimumWidth(170)

        # creating window to show chat messages
        self.chat_window = QTextEdit()
        self.chat_window.setReadOnly(True)
        self.chat_window.setHorizontalScrollBar(qsb)

        # creating button to send messages
        self.sending_button = QPushButton(self)
        self.sending_button.setIcon(
            QIcon(os.path.join('pictures', 'feather.png')))
        self.sending_button.setMaximumSize(100, 50)
        self.sending_button.clicked.connect(self.send_message)

        # creating menu
        self.create_connection_action = QAction("Create connection")
        self.create_connection_action.triggered.connect(self.create_connection)
        self.change_name_action = QAction("Change name")
        self.change_name_action.triggered.connect(self.change_name)
        bar = self.menuBar()
        self.bar = bar.addMenu('Settings')
        self.bar.addAction(self.create_connection_action)
        self.bar.addAction(self.change_name_action)

        # creating line to write messages
        self.send_line = QLineEdit()

        # creating button to send files
        self.file_sending_button = QPushButton(self)
        self.file_sending_button.setIcon(
            QIcon(os.path.join('pictures', 'file.png')))
        self.file_sending_button.setMaximumSize(70, 50)
        self.file_sending_button.clicked.connect(self.offer_file)

        self.main_widget = QWidget()
        self.main_widget.grid = QGridLayout()

        # adding labels, windows and buttons in grid
        self.main_widget.grid.addWidget(self.user_host, 1, 1, 1, 2)
        self.main_widget.grid.addWidget(self.user_name, 2, 1, 1, 2)
        self.main_widget.grid.addWidget(self.online_label, 3, 1, 1, 2)
        self.main_widget.grid.addWidget(self.users_online, 4, 1, 1, 2)

        self.main_widget.grid.addWidget(self.chat_window, 1, 3, 4, 1)
        self.main_widget.grid.addWidget(self.send_line, 5, 3)
        self.main_widget.grid.addWidget(self.sending_button, 5, 2)
        self.main_widget.grid.addWidget(self.file_sending_button, 5, 1)
        self.main_widget.setLayout(self.main_widget.grid)
        self.setCentralWidget(self.main_widget)
        self.main_widget.setGeometry(300, 300, 300, 300)
        self.update_online_connections()
        self.create_downloads_folder()
Esempio n. 2
0
class ControlEventsGraph(ControlBase, QWidget):
	"""
		Timeline events editor
	"""

	def __init__(self, label="", default=0, min=0, max=100, **kwargs):
		"""
		
		:param label: 
		:param default: 
		:param min: 
		:param max: 
		:param kwargs: 
		"""
		QWidget.__init__(self)
		ControlBase.__init__(self, label, default, **kwargs)
		self.add_popup_menu_option('Export to CSV', self.__export)

	def init_form(self):
		vlayout = QVBoxLayout()

		if conf.PYFORMS_USE_QT5:
			vlayout.setContentsMargins(0,0,0,0)
		else:
			vlayout.setMargin(0)

		self.setLayout(vlayout)

		self._scroll = QScrollBar(QtCore.Qt.Horizontal)

		scrollarea = QScrollArea()
		scrollarea.setMinimumHeight(140)
		scrollarea.setWidgetResizable(True)

		self._events_widget = EventsWidget(scroll=self._scroll)
		scrollarea.setWidget(self._events_widget)

		self._scroll.actionTriggered.connect(self.__scroll_changed)

		vlayout.addWidget(scrollarea)  # The timeline widget
		vlayout.addWidget(self._scroll)  # Add scroll

		self._scroll.setMaximum(0)
		self._scroll.setSliderPosition(0)

	##########################################################################
	#### HELPERS/PUBLIC FUNCTIONS ############################################
	##########################################################################

	def add_track(self, title=None):
		"""
		
		:param title: 
		"""
		self._events_widget.add_track(title)

	def add_event(self, begin, end, title='', track=0, color='#FFFF00'):
		"""
		
		:param begin: 
		:param end: 
		:param title: 
		:param track: 
		:param color: 
		:return: 
		"""
		return self._events_widget.add_event(begin, end, title, track, color)

	##########################################################################
	#### EVENTS ##############################################################
	##########################################################################

	def __scroll_changed(self, change): self.repaint()

	def get_export_filename(self): return "untitled.csv"

	def __export(self):
		"""Export annotations to a file."""
		filename = QFileDialog.getSaveFileName(parent=self,
		                                       caption="Export annotations file",
		                                       directory=self.get_export_filename(),
		                                       filter="CSV Files (*.csv)",
		                                       options=QFileDialog.DontUseNativeDialog)
		if filename != '':
			self.export_csv(filename)

	def export_csv(self, filename):
		"""
		Export annotations to a file.
		:param str filename: filename to open 
		"""
		with open(filename, 'wb') as csvfile:
			spamwriter = csv.writer(csvfile, dialect='excel')
			self._events_widget.export_csv(spamwriter)

	def repaint(self):
		"""
		
		"""
		self._events_widget.repaint()

	##########################################################################
	#### PROPERTIES ##########################################################
	##########################################################################
	"""
	Overwrite the changed event from the ControlBase
	"""

	@property
	def changed_event(self): return self._events_widget._pointer.moveEvent

	@changed_event.setter
	def changed_event(self, value): self._events_widget._pointer.moveEvent = value

	@property
	def value(self): return self._events_widget.position

	@value.setter
	def value(self, value): self._events_widget.position = value

	@property
	def form(self): return self

	@property
	def tracks(self): return self._events_widget.tracks

	@property
	def tracks_height(self): return self._events_widget.tracks_height

	@tracks_height.setter
	def tracks_height(self, value): self._events_widget.tracks_height = value

	@property
	def scale(self): return self._events_widget.scale

	@scale.setter
	def scale(self, value): self._events_widget.scale = value
Esempio n. 3
0
class EditorMapComponent:

    current = None

    def __init__(self, tabbed=True, parent=None):
        EditorMapComponent.current = self

        self.workspace = Workspace()
        self.gc_state = GraphicContextState()

        if tabbed:
            self.tab_widget = QTabWidget(parent)
            self.widget = QWidget(self.tab_widget)
            self.tab_widget.addTab(self.widget, "A Label")
        else:
            self.tab_widget = None
            self.widget = QWidget(parent)

        self.layout = QGridLayout(self.widget)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.setHorizontalSpacing(0)
        self.layout.setVerticalSpacing(0)

        self.scroll_horz = QScrollBar(Qt.Horizontal)
        self.scroll_vert = QScrollBar(Qt.Vertical)
        self.editormap_widget = EditorMapWidget(self, None)

        self.scroll_horz.valueChanged.connect(self.move_to_x)
        self.scroll_vert.valueChanged.connect(self.move_to_y)

        self.layout.addWidget(self.editormap_widget, 0, 0)
        self.layout.addWidget(self.scroll_horz, 1, 0)
        self.layout.addWidget(self.scroll_vert, 0, 1)

        self.sig_drop = Signal()
        self.editormap_widget.sig_drop.connect(self.on_drop)

    def on_drop(self, data, pos):
        """sends (brush, pos)"""
        brush_id = pickle.loads(data)
        brush = ObjectSelector.current.get_brush(brush_id)
        return self.sig_drop(brush, pos)

    def get_workspace(self):
        return self.workspace

    def grab_mouse(self):
        self.editormap_widget.grabMouse()

    def release_mouse(self):
        self.editormap_widget.releaseMouse()

    # ifdef GRUMBEL
    # void
    # EditorMapComponentImpl::on_key_down(const CL_InputEvent& event)
    # {
    #   if (event.id >= 0 && event.id < 256)
    #   {
    #     Rect rect = parent.get_position()
    #     key_bindings[event.id](CL_Mouse::get_x() - rect.left,
    #                            CL_Mouse::get_y() - rect.top)
    #   }

    #   if (event.repeat_count == 0)
    #   {
    #     Rect rect = parent.get_position()
    #     CL_InputEvent ev2 = event
    #     ev2.mouse_pos = Point(CL_Mouse::get_x() - rect.left,
    #                           CL_Mouse::get_y() - rect.top)
    #     workspace.key_down(InputEvent(ev2))
    #   }
    # }

    # void
    # EditorMapComponentImpl::on_key_up(const CL_InputEvent& event)
    # {
    #   Rect rect = parent.get_position()
    #   CL_InputEvent ev2 = event
    #   ev2.mouse_pos = Point(CL_Mouse::get_x() - rect.left,
    #                         CL_Mouse::get_y() - rect.top)
    #   workspace.key_up(InputEvent(ev2))
    # }

    # void
    # EditorMapComponentImpl::draw ()
    # {
    #   if (workspace.get_map().is_null()) return

    #   Display::push_cliprect(parent.get_screen_rect())

    #   Display::push_modelview()
    #   Display::add_translate(parent.get_screen_x(), parent.get_screen_y())

    #   // Update scrollbars (FIXME: move me to function)
    #   scrollbar_v.set_range(0, workspace.get_map().get_bounding_rect().height)
    #   scrollbar_v.set_pagesize(parent.height/gc_state.get_zoom())
    #   scrollbar_v.set_pos(gc_state.get_pos().y)

    #   scrollbar_h.set_range(0, workspace.get_map().get_bounding_rect().width)
    #   scrollbar_h.set_pagesize(parent.width/gc_state.get_zoom())
    #   scrollbar_h.set_pos(gc_state.get_pos().x)

    #   gc_state.push()
    #   {
    #     GraphicContext gc(gc_state, CL_Display::get_current_window().get_gc())
    #     workspace.draw(gc)
    #   }
    #   gc_state.pop()

    #   Display::pop_modelview()
    #   Display::pop_cliprect()
    # }
    # endif

    def screen2world(self, pos):
        return self.gc_state.screen2world(pos)

    def set_zoom(self, z):
        self.gc_state.set_zoom(z)

        self.editormap_widget.repaint()
        self.update_scrollbars()

    def zoom_out(self, pos):
        self.gc_state.set_zoom(self.gc_state.get_zoom() / 1.25,
                               Pointf(pos.x, pos.y))

        self.editormap_widget.repaint()
        self.update_scrollbars()

    def zoom_in(self, pos):
        self.gc_state.set_zoom(self.gc_state.get_zoom() * 1.25,
                               Pointf(pos.x, pos.y))

        self.editormap_widget.repaint()
        self.update_scrollbars()

    def zoom_to(self, rect):
        self.gc_state.zoom_to(rect)

        self.editormap_widget.repaint()
        self.update_scrollbars()

    def get_clip_rect(self):
        return self.gc_state.get_clip_rect()

    def move_to(self, x, y):
        self.gc_state.set_pos(Pointf(x, y))

        self.editormap_widget.repaint()
        self.update_scrollbars()

    def move_to_x(self, x):

        self.gc_state.set_pos(Pointf(x, self.gc_state.get_pos().y))

        self.editormap_widget.repaint()
        self.update_scrollbars()

    def move_to_y(self, y):
        self.gc_state.set_pos(Pointf(self.gc_state.get_pos().x, y))

        self.editormap_widget.repaint()
        self.update_scrollbars()

    def sig_on_key(self, keyseq_str):
        key_sequence = QKeySequence(keyseq_str)
        if key_sequence.isEmpty():
            raise RuntimeError("invalid key binding: '%s'" % keyseq_str)

        shortcut = QShortcut(key_sequence, self.editormap_widget)
        signal = Signal()

        def on_key(*args):
            pos = self.editormap_widget.mapFromGlobal(QCursor.pos())
            # pos = self.gc_state.screen2world(Point.from_qt(pos))
            signal(pos.x(), pos.y())

        shortcut.activated.connect(on_key)

        return signal

    def get_gc_state(self):
        return self.gc_state

    def get_widget(self):
        return self.tab_widget or self.widget

    def update_scrollbars(self):
        rect = self.workspace.get_map().get_bounding_rect()
        border = 128

        self.scroll_horz.setMinimum(rect.left - border)
        self.scroll_horz.setMaximum(rect.right + border)
        self.scroll_horz.setPageStep(self.editormap_widget.width())
        self.scroll_horz.setSliderPosition(int(self.gc_state.get_pos().x))

        self.scroll_vert.setMinimum(rect.top - border)
        self.scroll_vert.setMaximum(rect.bottom + border)
        self.scroll_vert.setPageStep(self.editormap_widget.height())
        self.scroll_vert.setSliderPosition(int(self.gc_state.get_pos().y))

    def set_sector_tab_label(self, index, text):
        self.tab_widget.setTabText(index, "Sector \"%s\"" % text)