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()
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
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)