def _init_widgets(self): layout = QVBoxLayout() # address lbl_addr = QLabel() lbl_addr.setText("Address") txt_addr = QLineEdit() txt_addr.returnPressed.connect(self._on_address_entered) self._txt_addr = txt_addr top_layout = QHBoxLayout() top_layout.addWidget(lbl_addr) top_layout.addWidget(txt_addr) self._view = QMemoryView(self.workspace) area = QScrollArea() self._scrollarea = area area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) area.setWidgetResizable(True) area.setWidget(self._view) layout.addLayout(top_layout) layout.addWidget(area) layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout)
def _init_widgets(self): state = self._state if state is None: return if state.arch.name not in self.ARCH_REGISTERS: l.error( "Architecture %s is not listed in QRegisterViewer.ARCH_REGISTERS.", state.arch.name) return layout = QVBoxLayout() area = QScrollArea() area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) area.setWidgetResizable(True) regs = self.ARCH_REGISTERS[state.arch.name] # common ones common_regs = regs['common'] for reg_name in common_regs: sublayout = QHBoxLayout() lbl_reg_name = QLabel(self) lbl_reg_name.setProperty('class', 'reg_viewer_label') lbl_reg_name.setText(reg_name) lbl_reg_name.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sublayout.addWidget(lbl_reg_name) sublayout.addSpacing(10) reg_value = QASTViewer(None, parent=self) self._registers[reg_name] = reg_value sublayout.addWidget(reg_value) layout.addLayout(sublayout) layout.setSpacing(0) layout.addStretch(0) layout.setContentsMargins(2, 2, 2, 2) # the container container = QFrame() container.setAutoFillBackground(True) palette = container.palette() palette.setColor(container.backgroundRole(), Qt.white) container.setPalette(palette) container.setLayout(layout) area.setWidget(container) base_layout = QVBoxLayout() base_layout.addWidget(area) self.setLayout(base_layout)
def __init__(self, qpframe): QVBoxLayout.__init__(self) scroll = QScrollArea() scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) scroll.setWidgetResizable(True) subWidget = QWidget() subWidget.setLayout(qpframe) scroll.setWidget(subWidget) self.addWidget(scroll) self.scroll = scroll
def _init_widgets(self): area = QScrollArea() area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) area.setWidgetResizable(True) self._area = area base_layout = QVBoxLayout() base_layout.addWidget(area) self.setLayout(base_layout)
class Form(QDialog): def __init__(self, state, parent=None): super().__init__(parent) Lib.prepareModalDialog(self) self.setSizePolicy(QSizePolicy.Minimum, QSizePolicy.Expanding) self.setWindowTitle("Copy Character — {}".format( QApplication.applicationName())) QShortcut(QKeySequence(QKeySequence.FindNext), self, self.findNext) self.state = state self.createWidgets() self.layoutWidgets() self.createConnections() self.findSizes(self.fontComboBox.currentFont()) self.setToFamily(self.state.stdFontFamily) self.setToNearestSize(self.state.stdFontSize) settings = QSettings() self.updateToolTips( bool( int( settings.value(Gopt.Key.ShowDialogToolTips, Gopt.Default.ShowDialogToolTips)))) def createWidgets(self): self.fontLabel = QLabel("Fon&t:") self.fontComboBox = QFontComboBox() self.tooltips.append((self.fontComboBox, """\ <p><b>Font</b></p> <p>The font for displaying the characters.</p>""")) self.fontLabel.setBuddy(self.fontComboBox) self.sizeLabel = QLabel("&Size:") self.sizeComboBox = QComboBox() self.tooltips.append((self.sizeComboBox, """\ <p><b>Size</b></p> <p>The size of font for displaying the characters.</p>""")) self.sizeLabel.setBuddy(self.sizeComboBox) self.scrollArea = QScrollArea() self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.panel = Panel() self.scrollArea.setWidget(self.panel) self.copyTextLabel = QLabel("Copy T&ext") self.copyTextLineEdit = QLineEdit() self.tooltips.append((self.copyTextLineEdit, """\ <p><b>Copy Text editor</b></p> <p>The text for copying to the clipboard when <b>Copy</b> is pressed.</p>""")) self.copyTextLabel.setBuddy(self.copyTextLineEdit) self.findTextLabel = QLabel("&Find Text") self.findTextLineEdit = QLineEdit() self.tooltips.append((self.findTextLineEdit, """\ <p><b>Find Text editor</b></p> <p>The name or partial name of Unicode characters to be found, e.g., “star” will match many characters, including U+22C6 “Star operator”.</p>""")) self.findTextLabel.setBuddy(self.findTextLineEdit) self.buttonBox = QDialogButtonBox() self.addSelectedButton = QPushButton(QIcon(":/add.svg"), "&Add Selected") self.tooltips.append((self.addSelectedButton, """\ <p><b>Add Selected</b></p> <p>Append the selected character to the <b>Copy Text</b> editor.</p>""")) self.buttonBox.addButton(self.addSelectedButton, QDialogButtonBox.ActionRole) self.findNextButton = QPushButton(QIcon(":/edit-find.svg"), "Find &Next") self.tooltips.append((self.findNextButton, """\ <p><b>Find Next</b></p> <p>Find the next character whose Unicode name contains or equals the <b>Find Text</b>.</p>""")) self.buttonBox.addButton(self.findNextButton, QDialogButtonBox.ActionRole) self.helpButton = QPushButton(QIcon(":/help.svg"), "Help") self.tooltips.append( (self.helpButton, "Help on the Copy Character dialog")) self.buttonBox.addButton(self.helpButton, QDialogButtonBox.HelpRole) self.closeButton = QPushButton(QIcon(":/dialog-close.svg"), "&Close") self.tooltips.append((self.closeButton, """<p><b>Cancel</b></p> <p>Close the dialog.</p>""")) self.buttonBox.addButton(self.closeButton, QDialogButtonBox.RejectRole) def layoutWidgets(self): topLayout = QHBoxLayout() topLayout.addWidget(self.fontLabel) topLayout.addWidget(self.fontComboBox, 1) topLayout.addWidget(self.sizeLabel) topLayout.addWidget(self.sizeComboBox) bottomLayout = QHBoxLayout() bottomLayout.addWidget(self.copyTextLabel) bottomLayout.addWidget(self.copyTextLineEdit) bottomLayout.addWidget(self.findTextLabel) bottomLayout.addWidget(self.findTextLineEdit) layout = QVBoxLayout() layout.addLayout(topLayout) layout.addWidget(self.scrollArea, 1) layout.addLayout(bottomLayout) layout.addWidget(self.buttonBox) self.setLayout(layout) def createConnections(self): self.fontComboBox.activated[str].connect(self.panel.updateFont) self.sizeComboBox.currentIndexChanged[str].connect( self.panel.updateSize) self.panel.characterSelected.connect(self.copyTextLineEdit.insert) self.panel.fontResized.connect(self.updateSize) self.addSelectedButton.clicked.connect(self.addSelected) self.helpButton.clicked.connect(self.help) self.buttonBox.rejected.connect(self.accept) self.findNextButton.clicked.connect(self.findNext) self.findTextLineEdit.returnPressed.connect(self.findNext) def help(self): self.state.help("xix_ref_dlg_copychr.html") def findSizes(self, font): fontDatabase = QFontDatabase() currentSize = self.sizeComboBox.currentText() with Lib.BlockSignals(self.sizeComboBox): self.sizeComboBox.clear() if fontDatabase.isSmoothlyScalable(font.family(), fontDatabase.styleString(font)): for size in QFontDatabase.standardSizes(): self.sizeComboBox.addItem(str(size)) else: for size in fontDatabase.smoothSizes( font.family(), fontDatabase.styleString(font)): self.sizeComboBox.addItem(str(size)) self.sizeComboBox.setEditable(False) sizeIndex = self.sizeComboBox.findText(currentSize) if sizeIndex == -1: self.sizeComboBox.setCurrentIndex( max(0, self.sizeComboBox.count() / 3)) else: self.sizeComboBox.setCurrentIndex(sizeIndex) def accept(self): clipboard = QApplication.clipboard() text = self.copyTextLineEdit.text() or self.panel.currentChar clipboard.setText(text, QClipboard.Clipboard) clipboard.setText(text, QClipboard.Selection) if text: say("Copied “{}” to the clipboard".format(text), SAY_TIMEOUT) super().accept() def addSelected(self): char = self.panel.currentChar if char: self.copyTextLineEdit.setText(self.copyTextLineEdit.text() + char) self.findNextButton.setFocus() def setToFamily(self, family): family = family.casefold() for i in range(self.fontComboBox.count()): if self.fontComboBox.itemText(i).casefold() == family: self.fontComboBox.setCurrentIndex(i) break def setToNearestSize(self, size): below = 0 belowIndex = -1 above = 999 aboveIndex = -1 for i in range(self.sizeComboBox.count()): sz = int(self.sizeComboBox.itemText(i)) if sz == size: self.sizeComboBox.setCurrentIndex(i) break if sz < size and sz > below: below = sz belowIndex = i if sz > size and sz < above: above = sz aboveIndex = i else: if abs(size - below) < abs(size - above): self.sizeComboBox.setCurrentIndex(belowIndex) else: self.sizeComboBox.setCurrentIndex(aboveIndex) def findNext(self): text = self.findTextLineEdit.text().strip().casefold() if text: start = self.panel.currentChar start = ord(start) if start else ord(" ") for i in range(start + 1, MAX_CHAR): try: char = chr(i) name = unicodedata.name(char).casefold() if text in name: self.panel.currentChar = char self.panel.update() y = (self.panel.squareSize * i) // COLUMNS self.scrollArea.ensureVisible(0, y) break except ValueError: pass else: self.panel.currentChar = " " self.findNext() def keyPressEvent(self, event): key = event.key() if key in {Qt.Key_Enter, Qt.Key_Return}: if self.findTextLineEdit.text().strip(): self.findNext() else: self.addSelectedButton.setFocus() def updateSize(self, squareSize): self.setMinimumWidth((COLUMNS + (1.5 if WIN else 1)) * squareSize)
class MetadataView(QAbstractItemView): MESSAGE_NO_SELECTION = 'Metadata' MESSAGE_SINGLE_SELECTION = 'Metadata for 1 box' MESSAGE_MULTIPLE_SELECTION = 'Metadata for {0} boxes' def __init__(self, parent=None): # This view is never made visible super(MetadataView, self).__init__() # A container for the controls self._form_container = FormContainer() # A scrollable container for the form self._form_scroll = QScrollArea(parent) self._form_scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self._form_scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self._form_scroll.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self._form_scroll.setWidget(self._form_container) # Make the controls fill the available horizontal space # http://qt-project.org/forums/viewthread/11012 self._form_scroll.setWidgetResizable(True) # Title self._title = QLabel() # Title is fixed at the top - form can be scrolled layout = QVBoxLayout() layout.addWidget(self._title) layout.addWidget(self._form_scroll) # Top-level container for the title and form self.widget = QWidget(parent) self.widget.setLayout(layout) def reset(self): """QAbstractItemView virtual """ debug_print('MetadataView.reset') super(MetadataView, self).reset() # Clear the controls self.selectionChanged([], []) def selectionChanged(self, selected, deselected): """QAbstractItemView slot """ debug_print('MetadataView.selectionChanged') selected = self.selectionModel().selectedIndexes() # Set title if 1 == len(selected): title = self.MESSAGE_SINGLE_SELECTION elif selected: title = self.MESSAGE_MULTIPLE_SELECTION.format(len(selected)) else: title = self.MESSAGE_NO_SELECTION self._title.setText(title) # TODO Combo should indicate multiple and unrecognised values # Put values into the controls metadata = [i.data(MetadataRole) for i in selected] for field, control in self._form_container.controls.iteritems(): values = {m.get(field, '') for m in metadata} control.selection_changed(selected, values)
class PointsWidget(QWidget): """ PointsWidget """ activeLandmarkChanged = Signal(int) landmarkDeleted = Signal(int) def __init__(self): super(PointsWidget, self).__init__() self.landmarkWidgets = [] self.activeIndex = 0 self.scrollArea = QScrollArea(self) self.scrollArea.setFrameShape(QFrame.NoFrame) self.scrollArea.setAutoFillBackground(False) self.scrollArea.setAttribute(Qt.WA_TranslucentBackground) self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.scrollArea.setWidgetResizable(True) landmarkLocationsLayout = QGridLayout() landmarkLocationsLayout.setSpacing(0) landmarkLocationsLayout.setContentsMargins(0, 0, 0, 0) landmarkLocationsLayout.setAlignment(Qt.AlignTop) self.landmarkLocationsWidget = QWidget() Style.styleWidgetForTab(self.landmarkLocationsWidget) self.landmarkLocationsWidget.setLayout(landmarkLocationsLayout) self.scrollArea.setWidget(self.landmarkLocationsWidget) layout = QGridLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.scrollArea) self.setLayout(layout) @Slot(list) def setPoints(self, points): self._clearLandmarkWidgets() layout = self.landmarkLocationsWidget.layout() for index in range(len(points)): landmarkWidget = LandmarkLocationWidget() landmarkWidget.setIndex(index) landmarkWidget.active = (index == self.activeIndex) landmarkWidget.activated.connect(self.activateLandmark) landmarkWidget.deleted.connect(self.deleteLandmark) landmarkWidget.setLandmarkSet(points[index]) layout.addWidget(landmarkWidget, index, 0) self.landmarkWidgets.append(landmarkWidget) def _clearLandmarkWidgets(self): layout = self.landmarkLocationsWidget.layout() for widget in self.landmarkWidgets: widget.activated.disconnect() layout.removeWidget(widget) widget.deleteLater() self.landmarkWidgets = [] @Slot(int, object) def activateLandmark(self, index, state): if not state: self.activeIndex = len(self.landmarkWidgets) else: self.activeIndex = index self.activeLandmarkChanged.emit(self.activeIndex) @Slot(int) def deleteLandmark(self, index): self.activateLandmark(index, False) self.landmarkDeleted.emit(index)
class UserDetailsWindow(UberSquareWindow): def __init__(self, user, parent): super(UserDetailsWindow, self).__init__(parent) self.user = user self.centralWidget = QWidget() self.setCentralWidget(self.centralWidget) layout = QVBoxLayout() layout.setSpacing(0) layout.setContentsMargins(11, 11, 11, 11) self.centralWidget.setLayout(layout) self.container = QWidget() self.scrollArea = QScrollArea() self.scrollArea.setWidget(self.container) self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) layout.addWidget(self.scrollArea) self.scrollArea.setWidgetResizable(True) gridLayout = QGridLayout() self.container.setLayout(gridLayout) firstName = user['user']['firstName'] name = firstName if 'lastName' in user['user']: name += " " + user['user']['lastName'] self.setWindowTitle(name) photo_label = QLabel() photo = QImage(foursquare.image(self.user['user']['photo'])) photo_label.setPixmap(QPixmap(photo)) i = 0 gridLayout.addWidget(UserProfile(user), i, 0, 1, 2) ### checkin button if user['user']['relationship'] != "self": i += 1 self.shoutText = QLineEdit(self) self.shoutText.setPlaceholderText("Shout something") gridLayout.addWidget(self.shoutText, i, 0) checkinButton = QPushButton("Check-in with " + firstName) self.connect(checkinButton, SIGNAL("clicked()"), self.checkin) gridLayout.addWidget(checkinButton, i, 1) # TODO! #if user['user']['relationship'] == "friend": # i += 1 # gridLayout.addWidget(QLabel("TODO: Unfriend"), i, 0, 1, 2) elif user['user']['relationship'] == "self": i += 1 gridLayout.addWidget(QLabel("It's you!"), i, 0, 1, 2) if user['user']['id'] == "17270875": i += 1 gridLayout.addWidget(QLabel("<b>This is the UberSquare developer!</b>"), i, 0, 1, 2) i += 1 checkins = user['user']['checkins']['count'] gridLayout.addWidget(QLabel(str(checkins) + " checkins"), i, 0) i += 1 badges = user['user']['badges']['count'] gridLayout.addWidget(QLabel(str(badges) + " badges"), i, 0) i += 1 mayorships = user['user']['mayorships']['count'] if mayorships > 0: mayorshipsButton = QPushButton(str(mayorships) + " mayorships") mayorshipsButton.setIcon(QIcon(foursquare.image("https://foursquare.com/img/points/mayor.png"))) self.connect(mayorshipsButton, SIGNAL("clicked()"), self.mayorships_pushed) gridLayout.addWidget(mayorshipsButton, i, 0, 1, 2) else: gridLayout.addWidget(QLabel("No mayorships"), i, 0) i += 1 # TODO! #gridLayout.addWidget(QPushButton("TODO: See places " + firstName + " has been to."), i, 0, 1, 2) #i += 1 update_user_button = QPushButton("Refresh user details") update_user_button.setIcon(QIcon.fromTheme("general_refresh")) self.connect(update_user_button, SIGNAL("clicked()"), self.__update) gridLayout.addWidget(update_user_button, i, 0, 1, 2) showUser = Signal() self.connect(self, SIGNAL("showUser()"), self.__showUser) def __update(self): print "updating..." t = UserDetailsThread(self.user['user']['id'], self) t.start() self.showWaitingDialog.emit() def __showUser(self): time.sleep(0.15) self.close() self.uid = self.user['user']['id'] user = foursquare.get_user(self.uid, foursquare.CacheOrNull) if user: self.userWindow = UserDetailsWindow(user, self) self.userWindow.show() def checkin(self): venue = self.user['user']['checkins']['items'][0]['venue'] c = CheckinConfirmation(self, venue) c.exec_() if c.result() == QDialog.Accepted: try: # TODO: do this in a separate thread ll = LocationProvider().get_ll(venue) response = foursquare.checkin(venue, ll, self.shoutText.text(), c.broadcast()) CheckinDetails(self, response).show() except IOError: self.networkError.emit() def mayorships_pushed(self): # TODO: show user's name venueListWindow = VenueListWindow("Mayorships", None, self) dataSource = UserMayorships(venueListWindow, self.user['user']['id'], self) venues = dataSource.getVenues(foursquare.Cache.CacheOrNull) dataSource.start() if venues: self.setVenues(venues) venueListWindow.updateVenues.emit() else: self.showWaitingDialog.emit() def setVenues(self, venues): self.__venues = venues def venues(self): return self.__venues