def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Customize Your Desktop</h2>")) vlayout = QVBoxLayout(self) labelLayout = QHBoxLayout() imageLabel = QLabel() imageLabel.setMaximumSize(64, 64) imageLabel.setPixmap(QIcon.fromTheme("preferences-desktop-color").pixmap(64, 64)) labelLayout.addWidget(imageLabel) label = QLabel(self) label.setText(self.tr("<p>Choose your favorite theme and desktop type. Customize KaOS with different styles and themes.</p>")) labelLayout.addWidget(label) vlayout.addLayout(labelLayout) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) self.createGroupBox(vlayout) self.createDesktopOption(vlayout) self.desktopCount = 2 self.desktopType = "org.kde.desktopcontainment" self.iconSet = None self.showDesktop = False self.widgetStyle = "qtcurve" self.windowStyle = None self.colorScheme = None self.desktopTheme = None
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Save Your Settings</h2>")) vlayout = QVBoxLayout(self) label = QLabel(self) label.setWordWrap(True) label.setText(self.tr("<p>You have successfully finished all steps. Here's a summary of the settings you want to apply. \ Click <strong>Apply Settings</strong> to save them now. You are now ready to enjoy KaOS!</p>")) vlayout.addWidget(label) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) groupBox = QGroupBox() groupBox.setTitle(self.tr("The following settings will be applied")) groupBox.setMinimumHeight(350) groupLayout = QHBoxLayout(groupBox) self.labelSummary = QLabel() self.labelSummary.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop) groupLayout.addWidget( self.labelSummary) self.labelSummary2 = QLabel() self.labelSummary2.setAlignment(Qt.AlignLeading|Qt.AlignLeft|Qt.AlignTop) groupLayout.addWidget( self.labelSummary2) vlayout.addWidget(groupBox) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) self.summary = {} self.parent().summaryVisible.connect(self.summaryWrite)
class MainCalcWindow(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.initUi() self.initLayouts() def initUi(self): self.calc = Calculator() self.dPage = Delovie_Browser() def initLayouts(self): self.spacer_1 = QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding) self.spacer_2 = QSpacerItem(0, 0, QSizePolicy.Maximum, QSizePolicy.Expanding) self.mainLayout = QHBoxLayout() self.leftLayout = QVBoxLayout() self.leftTopLayout = QHBoxLayout() self.mainLayout.addLayout(self.leftLayout) self.leftLayout.addLayout(self.leftTopLayout) self.leftTopLayout.addWidget(self.calc) self.leftTopLayout.addItem(self.spacer_1) self.leftLayout.addItem(self.spacer_1) self.leftLayout.addItem(self.spacer_2) self.mainLayout.addWidget(self.dPage) self.setLayout(self.mainLayout)
class Bool(SimpleBlackbox): author = "DrLuke" name = "Bool" modulename = "drluke.builtin.bool" Category = ["Builtin"] placeable = True implementation = BoolImplementation def __init__(self, *args, **kwargs): super(Bool, self).__init__(*args, **kwargs) self.propertiesWidget = QWidget() self.vlayout = QVBoxLayout() self.toggle = QCheckBox("Output") self.toggle.toggled.connect(self.toggleTrueFalse) self.vlayout.addWidget(self.toggle) self.vlayout.addItem(QSpacerItem(40, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)) self.propertiesWidget.setLayout(self.vlayout) def toggleTrueFalse(self, bool): self.sendDataToImplementations(bool) def getPropertiesWidget(self): return self.propertiesWidget def defineIO(self): self.addOutput(bool, "boolout", "Bool out")
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Customize Your Desktop</h2>")) vlayout = QVBoxLayout(self) labelLayout = QHBoxLayout() imageLabel = QLabel() imageLabel.setMaximumSize(64, 64) imageLabel.setPixmap( QIcon.fromTheme("preferences-desktop-color").pixmap(64, 64)) labelLayout.addWidget(imageLabel) label = QLabel(self) label.setText( self. tr("<p>Choose your favorite theme and desktop type. Customize Pisi Linux with colorful styles and themes.</p>" )) labelLayout.addWidget(label) vlayout.addLayout(labelLayout) vlayout.addItem( QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) self.createGroupBox(vlayout) self.createDesktopOption(vlayout) self.desktopCount = 1 self.desktopType = "org.kde.desktopcontainment" self.iconSet = None self.showDesktop = False self.widgetStyle = "breeze" self.windowStyle = None self.colorScheme = None self.desktopTheme = None
def __init__(self, parent): super(RegisterDialog, self).__init__(parent) self.scene = Scene() # self.scene.addPixmap(QPixmap(":/images/avatar/1.png")) self.viewer = Canvas(self.scene) self.b_register = Button("Register") self.spin_box = QSpinBox() self.spin_box.valueChanged.connect(self.changeAvatar) splitter = QSplitter() # self.address = QLineEdit("192.168.20.20:8088") self.address = QLineEdit("192.168.1.113:8088") layout = QHBoxLayout() layout.addWidget(self.viewer) layout.addWidget(splitter) sublayout = QVBoxLayout() spacer = QSpacerItem(30, 15) sublayout.addWidget(self.spin_box) sublayout.addItem(spacer) sublayout.addWidget(self.address) sublayout.addWidget(self.b_register) # address.add layout.addLayout(sublayout) self.setLayout(layout) self.viewer.show()
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Welcome to Pisi Linux!</h2>")) vlayout = QVBoxLayout(self) vlayout.addItem(QSpacerItem(20, 150, QSizePolicy.Preferred, QSizePolicy.Minimum)) hlayout = QHBoxLayout(self) label = QLabel(self) label.setText(self.tr("""<h1>What is Pisi Linux?</h1> <p><strong>Pisi Linux</strong> is a reliable, secure, fast and user friendly operating system.</p> <p>With Pisi Linux, you can connect to the internet, read your e-mails, work with your office documents, watch movies, play music, develop applications, play games and much more!</p> <p><strong>Kaptan</strong>, will help you personalize your Pisi Linux workspace easily and quickly. Please click <strong>Next</strong> in order to begin.</p>""")) label.setWordWrap(True) label.setAlignment(Qt.AlignLeft) hlayout.addWidget(label) kaptan_logo = QLabel(self) kaptan_logo.setPixmap(QPixmap(":/data/images/kaptan_welcome.png")) kaptan_logo.setAlignment(Qt.AlignRight) kaptan_logo.setMaximumSize(157, 181) hlayout.addWidget(kaptan_logo) vlayout.addLayout(hlayout) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred))
def __init__(self, *args): super(QMainWindow, self).__init__(*args) centerWidget = QWidget(self) self.setCentralWidget(centerWidget) mainLayout = QGridLayout(centerWidget) previewGroupBox = QGroupBox("Preview") self.previewArea = IconPreviewArea(previewGroupBox) previewLayout = QVBoxLayout(previewGroupBox) previewLayout.addWidget(self.previewArea) mainLayout.addWidget(previewGroupBox, 0, 0, 1, 2) mainLayout.addWidget(self.createImagesGroupBox(), 1, 0) vbox = QVBoxLayout() vbox.addWidget(self.createIconSizeGroupBox()) #vbox.addWidget(self.createHighDpiIconSizeGroupBox()) vbox.addItem( QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding)) mainLayout.addLayout(vbox, 1, 1) self.createActions() self.setWindowTitle("Icons") self.checkCurrentStyle()
def __init__(self, winParent, pose3d): super(percentajeWidget, self).__init__() self.winParent = winParent self.map = cv2.imread("resources/images/mapgrannyannie.png", cv2.IMREAD_GRAYSCALE) self.map = cv2.resize(self.map, (500, 500)) self.pose3d = pose3d self.percentajeHouse = 0 self.numPixels = self.calculatePixelsWhite() self.numPixelsWalked = 0 vLayout = QVBoxLayout() self.percentajeWalked() self.Percentaje = QLabel("Percentaje: " + str(round(self.percentajeHouse, 3)) + ' %') vLayout.addWidget(self.Percentaje, 0) self.bar = QProgressBar() self.bar.setValue(self.percentajeHouse) st = "QProgressBar::chunk {background-color: #ff0000;}\n QProgressBar {border: 1px solid grey;border-radius: 2px;text-align: center;background: #eeeeee;}" self.bar.setStyleSheet(st) self.bar.setTextVisible(False) vLayout.addWidget(self.Percentaje, 0) vLayout.addWidget(self.bar, 0) vSpacer = QSpacerItem(30, 80, QSizePolicy.Ignored, QSizePolicy.Ignored) vLayout.addItem(vSpacer) self.setLayout(vLayout)
def render_page(self, page, selected=None): selected = selected or [] old_layout = self.FomodOptionsGroup.layout() if old_layout: QWidget().setLayout(old_layout) self.FomodOptionsGroup.setTitle(page.name) self.FomodOptionsGroup.setData([]) groups_layout = QVBoxLayout() for i, group in enumerate(page): groupbox = FomodOptionsGroup(self.FomodOptionsGroup) groupbox.setGroup(group) if i == 0 and groupbox.firstOptionItem(): self.render_option_hover(groupbox.firstOptionItem()) groupbox.selectFrom(selected) groupbox.mouseEnteredOption.connect(self.render_option_hover) groups_layout.addWidget(groupbox) self.FomodOptionsGroup.data().extend(groupbox.optionItems()) v_spacer = QSpacerItem(10, 10, QSizePolicy.Minimum, QSizePolicy.Expanding) groups_layout.addItem(v_spacer) self.FomodOptionsGroup.setLayout(groups_layout)
def __init__(self): super().__init__() self.setWindowTitle('Paint Application') self.setWindowIcon(QIcon('icons/paint.png')) self.setGeometry(600, 150, 1020, 510) self.canvas = Canvas(1000, 500) widget = QWidget() layout = QVBoxLayout() widget.setLayout(layout) layout.addWidget(self.canvas) for menu in self.canvas.get_menu(): self.menuBar().addMenu(menu) self.canvas.menuBar().hide() palette = QHBoxLayout() self.add_palette_buttons(palette) layout.addLayout(palette) spacer = QSpacerItem(1, 1, QSizePolicy.Expanding, QSizePolicy.MinimumExpanding) layout.addItem(spacer) self.setCentralWidget(widget)
class Bool(SimpleBlackbox): author = "DrLuke" name = "Bool" modulename = "drluke.builtin.bool" Category = ["Builtin"] placeable = True implementation = BoolImplementation def __init__(self, *args, **kwargs): super(Bool, self).__init__(*args, **kwargs) self.propertiesWidget = QWidget() self.vlayout = QVBoxLayout() self.toggle = QCheckBox("Output") self.toggle.toggled.connect(self.toggleTrueFalse) self.vlayout.addWidget(self.toggle) self.vlayout.addItem( QSpacerItem(40, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)) self.propertiesWidget.setLayout(self.vlayout) def toggleTrueFalse(self, bool): self.sendDataToImplementations(bool) def getPropertiesWidget(self): return self.propertiesWidget def defineIO(self): self.addOutput(bool, "boolout", "Bool out")
class Window(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.vert_layout = QVBoxLayout(self) self.grid_layout = QGridLayout() self.grid_layout.setSpacing(0) self.status_label = QLabel('no btn') c = 0 for x in range(5): for y in range(5): button = (QToolButton(self)) button.setText(str(c)) button.setObjectName(str([x, y])) button.released.connect(self.button_released) self.grid_layout.addWidget(button, x, y) c = c + 1 # [[self.grid_layout.addWidget(QToolButton(self), x, y) for x in range(5)] for y in range(5)] self.vert_layout.addItem(self.grid_layout) self.vert_layout.addWidget(self.status_label) def button_released(self): sending_button = self.sender() print(sending_button.objectName()) self.status_label.setText('{} Clicked!'.format( str(sending_button.objectName())))
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Customize Your Desktop</h2>")) vlayout = QVBoxLayout(self) labelLayout = QHBoxLayout() imageLabel = QLabel() imageLabel.setMaximumSize(64, 64) imageLabel.setPixmap(QPixmap(":/data/images/preferences-desktop-color.png")) labelLayout.addWidget(imageLabel) label = QLabel(self) label.setText(self.tr("<p>Choose your favorite theme and desktop type. Customize Pisi Linux with colorful styles and themes.</p>")) labelLayout.addWidget(label) vlayout.addLayout(labelLayout) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) self.createGroupBox(vlayout) self.createDesktopOption(vlayout) self.desktopCount = 1 self.desktopType = "org.kde.desktopcontainment" self.iconSet = "breeze" self.themeSet = None
def setupUi(self): self.resize(1200, 900) gr = pg.PlotWidget(parent=self, background=[255, 255, 255]) dtait = pg.PlotDataItem(pen=pg.mkPen('r', width=4)) dtait2 = pg.PlotDataItem(pen=pg.mkPen('b', width=4)) dtait.setVisible(True) gr.plotItem.addItem(dtait) gr.plotItem.addItem(dtait2) pl = gr.getPlotItem() vl = QVBoxLayout(self) vl.addWidget(gr) self.graph = gr self._plot_rms = dtait self._plot_ave = dtait2 hl = QHBoxLayout() vl.addItem(hl) self.dirs = sorted([f for f in os.listdir() if os.path.isdir(f)]) self.cb_dirs = QComboBox(self) self.cb_dirs.addItems(self.dirs) self.cb_dirs.currentTextChanged.connect(self._changedir) hl.addWidget(self.cb_dirs) self.cb_planes = QComboBox(self) self.cb_planes.addItems(self.planes + ('Wlkick', )) self.cb_planes.currentTextChanged.connect(self._changePlane) hl.addWidget(self.cb_planes)
def __init__(self, object_name, object_type): QDialog.__init__(self) self.object_name = object_name self.object_type = object_type self.label = QLabel( f'{self.object_name} is already in the list.\n' f'Would you like to run a download for this {self.object_type.lower()}' ) self.download_button = QPushButton( f'Download {self.object_type.lower()}') self.close_button = QPushButton('Close') self.download_button.clicked.connect(self.accept) self.close_button.clicked.connect(self.close) button_box = QHBoxLayout() button_box.setSpacing(15) button_box.addWidget(self.download_button) button_box.addWidget(self.close_button) layout = QVBoxLayout() layout.setSpacing(10) layout.addWidget(self.label) layout.addItem(button_box) self.setLayout(layout)
def __init__(self, prodotto, parent=None): super(VistaProdotto, self).__init__(parent) self.controller = ControlloreProdotto(prodotto) v_layout = QVBoxLayout() label_nome = QLabel(self.controller.get_prodotto()) font_nome = label_nome.font() font_nome.setPointSize(30) label_nome.setFont(font_nome) v_layout.addWidget(label_nome) v_layout.addItem( QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)) v_layout.addWidget( self.get_info("Prodotto: {}".format( self.controller.get_prodotto()))) v_layout.addWidget( self.get_info("Prezzo: {}€\n".format( self.controller.get_prezzo()))) v_layout.addWidget(self.get_info("Ingredienti:")) for a in self.controller.get_ingredienti(): v_layout.addWidget( self.get_info( "{}".format(a) + ": {}".format(self.controller.get_ingredienti()[a]))) v_layout.addWidget( self.get_info("\n{}".format(self.controller.get_isDisponibile()))) self.setLayout(v_layout) self.setWindowTitle(self.controller.get_prodotto())
class Slider(QWidget): def __init__(self, minimum, maximum, variable, parent=None): super(Slider, self).__init__(parent=parent) self.verticalLayout = QHBoxLayout(self) self.label = QLabel(self) self.verticalLayout.addWidget(self.label) self.horizontalLayout = QVBoxLayout() spacerItem = QSpacerItem(0, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.slider = QSlider(self) self.slider.setOrientation(Qt.Horizontal) self.horizontalLayout.addWidget(self.slider) spacerItem1 = QSpacerItem(0, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.verticalLayout.addLayout(self.horizontalLayout) self.resize(self.sizeHint()) self.minimum = minimum self.maximum = maximum self.variable = variable self.slider.valueChanged.connect(self.setLabelValue) self.x = None self.setLabelValue(self.slider.value()) def setLabelValue(self, value): self.x = self.minimum + ( float(value) / (self.slider.maximum() - self.slider.minimum())) * (self.maximum - self.minimum) self.label.setText(f"{self.variable}: \n {int(self.x)}")
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Choose Wallpaper</h2>")) vlayout = QVBoxLayout(self) labelLayout = QHBoxLayout() labelImage = QLabel() labelImage.setMaximumSize(64, 64) labelImage.setPixmap( QIcon.fromTheme("preferences-desktop-wallpaper").pixmap(64, 64)) labelLayout.addWidget(labelImage) label = QLabel(self) label.setText( self. tr("<p>Choose your favorite wallpaper for Pisi Linux. Don't forget to check out \ <strong>Desktop Settings</strong> for downloading new and cool wallpapers.</p>" )) label.setWordWrap(True) labelLayout.addWidget(label) vlayout.addLayout(labelLayout) vlayout.addItem( QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) groupBox = QGroupBox(self) groupBox.setTitle(self.tr("Wallpapers")) groupBox.setMinimumHeight(350) grLayout = QVBoxLayout(groupBox) self.listWidget = QListWidget() self.listWidget.setViewMode(QListView.IconMode) self.listWidget.setIconSize(QSize(250, 150)) grLayout.addWidget(self.listWidget) vlayout.addWidget(groupBox) vlayout.addItem( QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) hlayout = QHBoxLayout() self.button = QPushButton() self.button.setText(self.tr("Choose wallpaper from file")) hlayout.addWidget(self.button) hlayout.addItem( QSpacerItem(400, 20, QSizePolicy.Preferred, QSizePolicy.Preferred)) self.checkbox = QCheckBox() self.checkbox.setText(self.tr("Don't change wallpaper")) hlayout.addWidget(self.checkbox) vlayout.addLayout(hlayout) self.checkbox.clicked.connect(self.wallpaperChecked) self.button.clicked.connect(self.wallpaperSelectDialog) self.listWidget.itemClicked.connect(self.wallpaperSelect) self.selectWallpaper = None self.wallpapersParser()
def setUpLayouts_old(self): vboxPrev = QVBoxLayout() self.prevLay = QHBoxLayout() sp = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) vboxPrev.addItem(sp) vboxPrev.addWidget(self.bot_prev) sp = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.prevLay.addLayout(vboxPrev) self.prevLay.addItem(sp) vboxPrev = QVBoxLayout() self.nextLay = QHBoxLayout() sp = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) vboxPrev.addWidget(self.bot_next) vboxPrev.addItem(sp) sp = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.nextLay.addLayout(vboxPrev) self.nextLay.addItem(sp) self.centLay = QVBoxLayout() self.centLay.addWidget(self.combo) self.centLay.addWidget(self.table) self.finalLay = QHBoxLayout() self.finalLay.addLayout(self.prevLay) self.finalLay.addLayout(self.centLay) self.finalLay.addLayout(self.nextLay) self.setLayout(self.finalLay)
def create_widget(self, **kwargs): filter_item_widget = QWidget() model_label = QLabel(kwargs.get('model', None)) field_label = QLabel(kwargs.get('field', None)) operator_label = QLabel(kwargs.get('operator', None)) # space added to this label text because it's the only way I could get it to stop cutting off the end of text value_label = QLabel(str(kwargs.get('value', None)) + ' ') close_button = QToolButton() close_button.setText('X') close_button.clicked.connect( lambda: self.remove_filter(filter_item_widget)) v_layout = QVBoxLayout() title_layout = QHBoxLayout() title_layout.addWidget(model_label) title_layout.addWidget(close_button) h_layout = QHBoxLayout() h_layout.addWidget(field_label) h_layout.addWidget(self.get_line()) h_layout.addWidget(operator_label) h_layout.addWidget(self.get_line()) h_layout.addWidget(value_label) v_layout.addItem(title_layout) v_layout.addItem(h_layout) h_layout.setSpacing(5) v_layout.setSpacing(2) filter_item_widget.setLayout(v_layout) return filter_item_widget
def __init__(self, object_type, *args): QDialog.__init__(self) self.object_type = object_type.lower() self.multiple = len(args) > 1 self.label = QLabel( f'{", ".join(args)} {"are" if self.multiple else "is"} already in the list.\n' f'Would you like to run a download for {"these" if self.multiple else "this"} ' f'{self.object_type} {"s" if self.multiple else ""}?') self.download_button = QPushButton( f'Download {self.object_type.title()}{"s" if self.multiple else ""}' ) self.close_button = QPushButton('Close') self.download_button.clicked.connect(self.accept) self.close_button.clicked.connect(self.close) button_box = QHBoxLayout() button_box.setSpacing(15) button_box.addWidget(self.download_button) button_box.addWidget(self.close_button) layout = QVBoxLayout() layout.setSpacing(10) layout.addWidget(self.label) layout.addItem(button_box) self.setLayout(layout)
def __init__(self, inputTab): super().__init__() self.input = inputTab self.timeSelection = DoubleTimeSelection() self.btnCompute = QPushButton('Compute', icon=self.style().standardIcon(QStyle.SP_DialogApplyButton)) self.btnCompute.setFixedSize(105, 50) self.resultTextBox = QPlainTextEdit() self.btnCompute.clicked.connect(self.btnComputeEvent) mainLayout = QVBoxLayout() mainLayout.addItem(QSpacerItem(10, 10)) mainLayout.addWidget(self.timeSelection) mainLayout.addItem(QSpacerItem(10, 10)) hlayout = QHBoxLayout() hlayout.addWidget(self.btnCompute) hlayout.setAlignment(self.btnCompute, Qt.AlignTop) hlayout.setAlignment(Qt.AlignHCenter) vlayout = QVBoxLayout() vlayout.addWidget(self.resultTextBox) hlayout.addItem(QSpacerItem(10, 1)) hlayout.addLayout(vlayout) mainLayout.addLayout(hlayout) self.setLayout(mainLayout) self.template = '=== Comparison between Ref (frame {}) and Test (frame {}) ===\n'\ 'MSD (Mean signed deviation) \t{:<30}\n' \ 'MAD (Mean absolute deviation) \t{:<30}\n' \ 'RMSD (Root mean square deviation) \t{:<30}\n'
def change_func_name(self): dialog = QDialog() layout = QVBoxLayout() edit_layout = QHBoxLayout() name_label = QLabel('New Name') edit_layout.addWidget(name_label) new_name = QLineEdit() edit_layout.addWidget(new_name) layout.addItem(edit_layout) buttons = QHBoxLayout() buttons.addStretch() done = QPushButton('Accept') done.clicked.connect(dialog.accept) buttons.addWidget(done) cancel = QPushButton('Cancel') cancel.clicked.connect(dialog.reject) buttons.addWidget(cancel) layout.addItem(buttons) dialog.setLayout(layout) if dialog.exec(): self.func_name = new_name.text() self.name_label.setText(' ' + self.func_name + ' ')
def _setLayout(self): mainLayout = QVBoxLayout() mainLayout.addItem(QSpacerItem(1, 10)) mainLayout.addWidget(self.timeSlider) mainLayout.addWidget(self.timeSelection) mainLayout.addItem(QSpacerItem(1, 10)) hlayout = QHBoxLayout() hlayout.addItem(QSpacerItem(50, 10)) hlayout.addWidget(self.btnAdd) lb = QLabel('Double click on the cells to edit Arrival / Duration variable names') hlayout.addWidget(lb) hlayout.setAlignment(lb, Qt.AlignBottom | Qt.AlignRight) mainLayout.addLayout(hlayout) mainLayout.addItem(QSpacerItem(1, 5)) mainLayout.addWidget(self.conditionTable) mainLayout.addItem(QSpacerItem(1, 10)) hlayout = QHBoxLayout() hlayout.addItem(QSpacerItem(50, 10)) hlayout.addWidget(self.btnSubmit) hlayout.addItem(QSpacerItem(10, 10)) vlayout = QVBoxLayout() vlayout.addWidget(QLabel('Time unit')) vlayout.addWidget(self.unitBox) hlayout.addLayout(vlayout) hlayout.addItem(QSpacerItem(10, 10)) hlayout.addWidget(self.singlePrecisionBox) hlayout.addItem(QSpacerItem(50, 10)) mainLayout.addLayout(hlayout) mainLayout.addItem(QSpacerItem(30, 15)) mainLayout.addWidget(QLabel(' Message logs')) mainLayout.addWidget(self.logTextBox.widget) self.setLayout(mainLayout)
def initUI(self, show=True): layout = QVBoxLayout() tools = QHBoxLayout() self.start = QPushButton('', self) self.start.setIcon( QIcon(os.path.dirname(__file__) + r'\icons\start.png')) self.start.setIconSize(QSize(18, 18)) self.start.clicked.connect(self.toggleCapture) tools.addWidget(self.start) self.trigType = QComboBox(self) self.trigType.addItems(['external', 'program']) self.trigType.currentIndexChanged.connect(self.changeTrig) tools.addWidget(self.trigType) tools.addStretch(1) restart = QPushButton('', self) restart.setIcon( QIcon(os.path.dirname(__file__) + r'\icons\restart.png')) restart.setIconSize(QSize(18, 18)) restart.clicked.connect(self.connectCamera) tools.addWidget(restart) layout.addItem(tools) layout.addWidget(self.plotArea) self.setLayout(layout) self.show() self.trigType.setCurrentIndex(self.trig) return
def create_login(self): title_frame = QFrame() title_layout = QVBoxLayout() #TEMP USED AS LOGO login_label = QLabel() pixmap = QPixmap(icon_path) login_label.setPixmap(pixmap) login_label.setAlignment(Qt.AlignCenter) login_label.setAlignment(Qt.AlignCenter) login_label.setStyleSheet("font-size: 48px;") title_layout.addWidget(login_label) title_frame.setLayout(title_layout) form_layout = self.create_form_layout() wrapper_layout = QVBoxLayout() wrapper_vspacer = QSpacerItem(0, 150, QSizePolicy.Minimum, QSizePolicy.Expanding) wrapper_titleform_spacer = QSpacerItem(0, 50, QSizePolicy.Minimum, QSizePolicy.Expanding) wrapper_layout.setAlignment(Qt.AlignCenter) wrapper_layout.addItem(wrapper_vspacer) wrapper_layout.addWidget(title_frame) wrapper_layout.addItem(wrapper_titleform_spacer) wrapper_layout.addLayout(form_layout) wrapper_layout.addStretch(1) return wrapper_layout
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Setup Mouse Behavior</h2>")) vlayout = QVBoxLayout(self) labelLayout = QHBoxLayout() imageLabel = QLabel() imageLabel.setPixmap(QPixmap(":/data/images/preferences-desktop-peripherals.png")) imageLabel.setMaximumSize(64, 64) labelLayout.addWidget(imageLabel) mouseLabel = QLabel(self) mouseLabel.setText(self.tr("""<p>The <strong>clicking behavior</strong> defines how many times you want to click when you are opening a file. If you are <strong>left handed</strong>, you may prefer to swap the left and right buttons of your pointing device.</p>""")) mouseLabel.setWordWrap(True) labelLayout.addWidget(mouseLabel) vlayout.addLayout(labelLayout) vlayout.addItem(QSpacerItem(20, 100, QSizePolicy.Preferred, QSizePolicy.Preferred)) hlayout = QHBoxLayout() vlayout.addLayout(hlayout) self.createGroupBox(hlayout) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) self.folderSingleClick = False self.mouseButtonMap = "RightHanded" self.reverseScrollPolarity = False
def specifyTaskInfo(self): """Create the dialog box where the user to write more information about their current selected task.""" self.task_info_dialog = QDialog(self) task_header = QLabel(self.title) task_header.setObjectName("TaskHeader") description_label = QLabel("Description") description_label.setObjectName("DescriptionLabel") self.enter_task_desc_text = QTextEdit() self.enter_task_desc_text.setText(self.task_description) # The cursor will appear at the end of the text edit input field self.enter_task_desc_text.moveCursor(QTextCursor.End) save_button = QPushButton("Save") save_button.clicked.connect(self.confirmTaskDescription) cancel_button = QPushButton("Cancel") cancel_button.clicked.connect(self.task_info_dialog.reject) # Create layout for the dialog's buttons button_h_box = QHBoxLayout() button_h_box.addWidget(save_button) button_h_box.addSpacing(15) button_h_box.addWidget(cancel_button) # Create layout and add widgets for the dialog box dialog_v_box = QVBoxLayout() dialog_v_box.addWidget(task_header) dialog_v_box.addWidget(description_label, Qt.AlignLeft) dialog_v_box.addWidget(self.enter_task_desc_text) dialog_v_box.addItem(button_h_box) self.task_info_dialog.setLayout(dialog_v_box) self.task_info_dialog.show() # Display dialog box
def add_to_layout(layout, *items): """Add items to QVBox and QHBox layouts easily. Keyword arguments: layout -- a layout oject (QVBoxLayout or QHBoxLayout) or a string if "v" or "h" create a QVBox or QHBox respectively *items -- list with items to be added """ if isinstance(layout, str): if layout == "v": layout = QVBoxLayout() elif layout == "h": layout = QHBoxLayout() else: raise TypeError("Invalid layout!") for item in items: if isinstance(item, QWidget): layout.addWidget(item) elif isinstance(item, QLayout): layout.addLayout(item) elif isinstance(item, QSpacerItem): layout.addItem(item) elif item is None: layout.addStretch() else: raise TypeError("Argument of wrong type!") return layout
def __init__(self): super(create_movie, self).__init__() self.setWindowTitle("Create Movie") self.name = QLineEdit() self.duration = QLineEdit() self.releaseDate = QLineEdit() #change to calendar self.b1 = QPushButton("Back") self.b2 = QPushButton("Create") vbox = QVBoxLayout() row1 = QHBoxLayout() row2 = QHBoxLayout() row3 = QHBoxLayout() row1.addWidget(QLabel('Name')) row1.addWidget(self.name) row1.addWidget(QLabel('Duration')) row1.addWidget(self.duration) row2.addWidget(QLabel('Release Date')) row2.addWidget(self.releaseDate) row3.addWidget(self.b1) row3.addWidget(self.b2) vbox.addItem(row1) vbox.addItem(row2) vbox.addItem(row3) self.setLayout(vbox)
def createNewTask(self): """Set up the dialog box that allows the user to create a new task.""" self.new_task_dialog = QDialog(self) self.new_task_dialog.setWindowTitle("Create New Task") self.new_task_dialog.setModal(True) # Create a modal dialog self.enter_task_line = QLineEdit() self.enter_task_line.setPlaceholderText( "Enter a title for this task...") self.add_task_button = QPushButton("Add Task") self.add_task_button.clicked.connect(self.confirmTask) cancel_button = QPushButton("Cancel") cancel_button.clicked.connect(self.new_task_dialog.reject) # Create layout for the dialog's buttons button_h_box = QHBoxLayout() button_h_box.addWidget(self.add_task_button) button_h_box.addSpacing(15) button_h_box.addWidget(cancel_button) # Create layout and add widgets for the dialog box dialog_v_box = QVBoxLayout() dialog_v_box.addWidget(self.enter_task_line) dialog_v_box.addItem(button_h_box) self.new_task_dialog.setLayout(dialog_v_box) self.new_task_dialog.show()
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Welcome to Pisi Linux!</h2>")) vlayout = QVBoxLayout(self) vlayout.addItem( QSpacerItem(20, 150, QSizePolicy.Preferred, QSizePolicy.Minimum)) hlayout = QHBoxLayout(self) label = QLabel(self) label.setText( self.tr("""<h1>What is Pisi Linux?</h1> <p><strong>Pisi Linux</strong> is a reliable, secure, fast and user friendly operating system.</p> <p>With Pisi Linux, you can connect to the internet, read your e-mails, work with your office documents, watch movies, play music, develop applications, play games and much more!</p> <p><strong>Kaptan</strong>, will help you personalize your Pisi Linux workspace easily and quickly. Please click <strong>Next</strong> in order to begin.</p>""")) label.setWordWrap(True) label.setAlignment(Qt.AlignLeft) hlayout.addWidget(label) kaptan_logo = QLabel(self) kaptan_logo.setScaledContents(True) kaptan_logo.setPixmap(QPixmap(":/data/images/kaptan_welcome.svg")) kaptan_logo.setAlignment(Qt.AlignRight) kaptan_logo.setFixedSize(196, 196) hlayout.addWidget(kaptan_logo) vlayout.addLayout(hlayout) vlayout.addItem( QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred))
def __init__(self,winParent, pose3d): super(percentajeWidget, self).__init__() self.winParent=winParent self.map = cv2.imread("resources/images/mapgrannyannie.png", cv2.IMREAD_GRAYSCALE) self.map = cv2.resize(self.map, (500, 500)) image = QtGui.QImage(self.map.data, self.map.shape[1], self.map.shape[0], self.map.shape[1], QtGui.QImage.Format_Indexed8); self.pixmap = QtGui.QPixmap.fromImage(image) self.pose3d = pose3d self.percentajeHouse = 0 self.numPixels = self.calculatePixelsWhite() self.numPixelsWalked = 0 vLayout = QVBoxLayout() self.percentajeWalked() self.Percentaje = QLabel("Percentaje: " + str(round(self.percentajeHouse, 3)) + ' %') vLayout.addWidget(self.Percentaje, 0) self.bar = QProgressBar() self.bar.setValue(self.percentajeHouse) st = "QProgressBar::chunk {background-color: #ff0000;}\n QProgressBar {border: 1px solid grey;border-radius: 2px;text-align: center;background: #eeeeee;}" self.bar.setStyleSheet(st) self.bar.setTextVisible(False) vLayout.addWidget(self.Percentaje, 0) vLayout.addWidget(self.bar, 0) vSpacer = QSpacerItem(30, 80, QSizePolicy.Ignored, QSizePolicy.Ignored) vLayout.addItem(vSpacer) self.setLayout(vLayout)
def __init_ui(self): title_layout = QHBoxLayout() label_title = QLabel() label_title.setText('Title: ') title_layout.addWidget(label_title) title_layout.addWidget(self.te_title) content_layout = QHBoxLayout() label_content = QLabel() label_content.setText('From : ') content_layout.addWidget(label_content) content_layout.addWidget(self.te_content) space = QSpacerItem(0, 48) send_layout = QHBoxLayout() space2 = QSpacerItem(0, 0) self.btn_send.setText("Send") self.btn_send.setMinimumHeight(48) send_layout.addItem(space2) send_layout.addWidget(self.btn_send) father_layout = QVBoxLayout() father_layout.addLayout(title_layout, 1) father_layout.addLayout(content_layout, 5) father_layout.addItem(space) father_layout.addLayout(send_layout) self.setLayout(father_layout)
def __init__(self, member_list, contacts, parent=None): super(MemberListWidget, self).__init__(parent) self.setMinimumSize(200, 600) self.user_home = os.path.expanduser('~') #self.setAcceptDrops(True) self.app_home = self.user_home + '/.wechat/' self.head_home = ("%s/heads" % (self.app_home)) self.cache_home = ("%s/cache/" % (self.app_home)) self.cache_image_home = "%s/image/" % (self.cache_home) self.contact_head_home = ("%s/contact/" % (self.head_home)) self.default_head_icon = './resource/images/default.png' self.default_member_icon = './resource/images/webwxgeticon.png' self.members = member_list self.contacts = contacts #self.setWindowFlags(Qt.FramelessWindowHint)#|Qt.Popup self.membersTable = QTableView() self.membersTable.verticalHeader().setDefaultSectionSize(60) self.membersTable.verticalHeader().setVisible(False) self.membersTable.horizontalHeader().setDefaultSectionSize(60) self.membersTable.horizontalHeader().setVisible(False) #More self.more = QPushButton(wechatutil.unicode('顯示更多')) self.verticalSpacer = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Expanding) self.membersTableModel = QStandardItemModel(0, 4) self.initinal_member_list_widget(self.members) mainLayout = QVBoxLayout() mainLayout.addWidget(self.membersTable) mainLayout.addWidget(self.more) mainLayout.addItem(self.verticalSpacer) self.setLayout(mainLayout)
def __init__(self, parent=None): super().__init__(parent=parent) v_layout = QVBoxLayout(self) self.shift_right_btn = QPushButton(">", self) self.shift_right_btn.setObjectName("add_rm_btn") ar_w = 50 self.shift_right_btn.setFixedSize(QSize(ar_w, int(ar_w))) self.shift_left_btn = QPushButton("<", self) self.shift_left_btn.setObjectName("add_rm_btn") self.shift_left_btn.setFixedSize(QSize(ar_w, int(ar_w))) v_layout.setSpacing(2) v_layout.setContentsMargins(0, 0, 0, 0) h_spacer = QSpacerItem(20, 40, QSizePolicy.Fixed, QSizePolicy.Expanding) h_spacer2 = QSpacerItem(20, 40, QSizePolicy.Fixed, QSizePolicy.Expanding) v_layout.addItem(h_spacer) v_layout.addWidget(self.shift_right_btn) v_layout.addWidget(self.shift_left_btn) v_layout.addItem(h_spacer2)
def test(self): tab1 = QWidget() scrollArea = QScrollArea(tab1) scrollArea.setMinimumSize(984, 550) scrollArea.setWidgetResizable(True) labelsContainer = QWidget() labelsContainer.setMinimumSize(0, 1500) scrollArea.setWidget(labelsContainer) layout = QVBoxLayout(labelsContainer) time = [ '2019-04-20 08:09:00', '2019-04-20 08:09:00', '2019-04-20 08:09:00', '2019-04-20 08:09:00' ] value = [1.2, 2, 1, 4] xdict = dict(enumerate(time)) ticks = [list(zip(range(4), tuple(time)))] vb = CustomViewBox() plt = pg.PlotWidget(title="标题这里填写", viewBox=vb) plt.setBackground(background=None) plt.plot(list(xdict.keys()), value) plt.getPlotItem().getAxis("bottom").setTicks(ticks) temp = QWidget() temp.setMinimumSize(900, 300) temp.setMaximumSize(900, 300) layout1 = QVBoxLayout(temp) layout1.addWidget(plt) layout.addWidget(temp) spacerItem = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) layout.addItem(spacerItem) self.tabWidget.addTab(tab1, '这里tabWidget修改标签')
class PMFlowAreaWidget(QWidget): def __init__(self): super().__init__() from pmgwidgets import PMFlowLayout self.outer_layout = QVBoxLayout() self.flow_layout = PMFlowLayout() self.setMinimumWidth(100) self.outer_layout.addLayout(self.flow_layout) spacer_v = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Expanding) self.outer_layout.addItem(spacer_v) self.setLayout(self.outer_layout) def add_widget(self, w: 'QWidget'): self.flow_layout.add_widget(w) def setup_ui(self): if hasattr(self.widget(), 'setup_ui'): self.widget().setup_ui() def resizeEvent(self, a0: 'QResizeEvent') -> None: super().resizeEvent(a0) layout: 'PMFlowLayout' = self.flow_layout layout.on_resize()
def __init__(self, parent): super().__init__(parent) self._preferences = parent vbox = QVBoxLayout(self) self._font = settings.FONT # Group widgets group_typo = QGroupBox( translations.TR_PREFERENCES_EDITOR_GENERAL_TYPOGRAPHY) group_scheme = QGroupBox("Editor Color Scheme") # Font settings grid_typo = QGridLayout(group_typo) self._btn_editor_font = QPushButton('') grid_typo.addWidget(QLabel( translations.TR_PREFERENCES_EDITOR_GENERAL_EDITOR_FONT), 0, 0) grid_typo.addWidget(self._btn_editor_font, 0, 1) self._check_font_antialiasing = QCheckBox("Antialiasing") grid_typo.addWidget(self._check_font_antialiasing, 1, 0) # Scheme settings box = QVBoxLayout(group_scheme) self._combo_themes = QComboBox() box.addWidget(self._combo_themes) schemes = json_manager.load_editor_schemes() for scheme_name, colors in schemes.items(): self._combo_themes.addItem(scheme_name, colors) self.__current_scheme = settings.EDITOR_SCHEME # self._list_view_scheme = QListView() # schemes = json_manager.load_editor_schemes() # from collections import namedtuple # CategoryEntry = namedtuple('CategoryEntry', 'name color') # list_of_categories = [] # for scheme_name, categories in schemes.items(): # for category_name in categories.keys(): # category = CategoryEntry( # category_name, # categories[category_name]['color'] # ) # list_of_categories.append(category) # model = ListModelScheme(list_of_categories) # model.set_font(self._font) # self._list_view_scheme.setModel(model) # box.addWidget(self._list_view_scheme) # Add group widgets vbox.addWidget(group_typo) vbox.addWidget(group_scheme) vbox.addItem( QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)) # Initial Settings btn_text = ', '.join(self._font.toString().split(',')[0:2]) self._btn_editor_font.setText(btn_text) self._check_font_antialiasing.setChecked(settings.FONT_ANTIALIASING) self._combo_themes.setCurrentText(settings.EDITOR_SCHEME) # Connections self._btn_editor_font.clicked.connect(self._load_editor_font) self._preferences.savePreferences.connect(self._save)
class PortStatus(QWidget): def __init__(self, parent): super(PortStatus, self).__init__(parent) self.con = utils.connect_db() self.port = model.Port(self.con) self.vbox_layout = QVBoxLayout() self.vbox_layout.setSpacing(0) self.vbox_layout.setContentsMargins(10,0,10,0) self.setLayout(self.vbox_layout) self.ship_views = [] self.now_deck = 1 self.deckselector = DeckSelector(self.con, self) self.deckselector.deck_selected.connect(self.on_deck_selected) self.vbox_layout.addWidget(self.deckselector) self.deckselector.show() for _ in range(6): ui = ShipStatus(self) self.ship_views.append(ui) self.vbox_layout.addWidget(ui) ui.hide() self.vbox_layout.addItem(QSpacerItem(40, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)) @pyqtSlot() def on_status_change(self): deck = self.port.deck(self.now_deck) self.deckselector.update() for (i,ship) in enumerate(deck.ships()): ui = self.ship_views[i] ui.set_ship(ship) @pyqtSlot(int) def on_deck_selected(self, deck_no): self.now_deck = deck_no self.on_status_change() def closeEvent(self, event): self.con.close() event.accept() # for apply stylesheet def paintEvent(self, pe): opt = QStyleOption() opt.initFrom(self) p = QPainter(self) s = self.style() s.drawPrimitive(QStyle.PE_Widget, opt, p, self)
def __init__(self, parent): super(EditorCompletion, self).__init__() self._preferences = parent vbox = QVBoxLayout(self) groupBoxClose = QGroupBox(translations.TR_PREF_EDITOR_COMPLETE) formClose = QGridLayout(groupBoxClose) formClose.setContentsMargins(5, 15, 5, 5) self._checkParentheses = QCheckBox( translations.TR_PREF_EDITOR_PARENTHESES + " ()") self._checkParentheses.setChecked('(' in settings.BRACES) self._checkKeys = QCheckBox(translations.TR_PREF_EDITOR_KEYS + " {}") self._checkKeys.setChecked('{' in settings.BRACES) self._checkBrackets = QCheckBox( translations.TR_PREF_EDITOR_BRACKETS + " []") self._checkBrackets.setChecked('[' in settings.BRACES) self._checkSimpleQuotes = QCheckBox( translations.TR_PREF_EDITOR_SIMPLE_QUOTES) self._checkSimpleQuotes.setChecked("'" in settings.QUOTES) self._checkDoubleQuotes = QCheckBox( translations.TR_PREF_EDITOR_DOUBLE_QUOTES) self._checkDoubleQuotes.setChecked('"' in settings.QUOTES) self._checkCompleteDeclarations = QCheckBox( translations.TR_PREF_EDITOR_COMPLETE_DECLARATIONS.format( resources.get_shortcut("Complete-Declarations").toString( QKeySequence.NativeText))) self._checkCompleteDeclarations.setChecked( settings.COMPLETE_DECLARATIONS) formClose.addWidget(self._checkParentheses, 1, 1, alignment=Qt.AlignTop) formClose.addWidget(self._checkKeys, 1, 2, alignment=Qt.AlignTop) formClose.addWidget(self._checkBrackets, 2, 1, alignment=Qt.AlignTop) formClose.addWidget(self._checkSimpleQuotes, 2, 2, alignment=Qt.AlignTop) formClose.addWidget(self._checkDoubleQuotes, 3, 1, alignment=Qt.AlignTop) vbox.addWidget(groupBoxClose) groupBoxCode = QGroupBox(translations.TR_PREF_EDITOR_CODE_COMPLETION) formCode = QGridLayout(groupBoxCode) formCode.setContentsMargins(5, 15, 5, 5) self._checkCodeDot = QCheckBox( translations.TR_PREF_EDITOR_ACTIVATE_COMPLETION) self._checkCodeDot.setChecked(settings.CODE_COMPLETION) formCode.addWidget(self._checkCompleteDeclarations, 5, 1, alignment=Qt.AlignTop) formCode.addWidget(self._checkCodeDot, 6, 1, alignment=Qt.AlignTop) vbox.addWidget(groupBoxCode) vbox.addItem(QSpacerItem(0, 10, QSizePolicy.Expanding, QSizePolicy.Expanding)) self._preferences.savePreferences.connect(self.save)
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Choose Wallpaper</h2>")) vlayout = QVBoxLayout(self) labelLayout = QHBoxLayout() labelImage = QLabel() labelImage.setMaximumSize(64,64) labelImage.setPixmap(QIcon.fromTheme("preferences-desktop-wallpaper").pixmap(64, 64)) labelLayout.addWidget(labelImage) label = QLabel(self) label.setText(self.tr("<p>Choose your favorite wallpaper for KaOS. Don't forget to check out \ <strong>Desktop Settings</strong> for downloading new and cool wallpapers.</p>")) label.setWordWrap(True) labelLayout.addWidget(label) vlayout.addLayout(labelLayout) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) groupBox = QGroupBox(self) groupBox.setTitle(self.tr("Wallpapers")) groupBox.setMinimumHeight(350) grLayout = QVBoxLayout(groupBox) self.listWidget = QListWidget() self.listWidget.setViewMode(QListView.IconMode) self.listWidget.setIconSize(QSize(250, 150)) grLayout.addWidget(self.listWidget) vlayout.addWidget(groupBox) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) hlayout = QHBoxLayout() self.button = QPushButton() self.button.setText(self.tr("Choose wallpaper from file")) hlayout.addWidget(self.button) hlayout.addItem(QSpacerItem(400, 20, QSizePolicy.Preferred, QSizePolicy.Preferred)) self.checkbox = QCheckBox() self.checkbox.setText(self.tr("Don't change wallpaper")) hlayout.addWidget(self.checkbox) vlayout.addLayout(hlayout) self.checkbox.clicked.connect(self.wallpaperChecked) self.button.clicked.connect(self.wallpaperSelectDialog) self.listWidget.itemClicked.connect(self.wallpaperSelect) self.selectWallpaper = None self.wallpapersParser()
class FullScreenQuad(SimpleBlackbox): author = "DrLuke" name = "Fullscreen Quad" modulename = "drluke.opengl.fullscreenquad" Category = ["OpenGL", "Primitives"] placeable = True implementation = FullScreenQuadImplementation def __init__(self, *args, **kwargs): super(FullScreenQuad, self).__init__(*args, **kwargs) self.propertiesWidget = QWidget() self.vlayout = QVBoxLayout() self.xoffsetWidget = QDoubleSpinBox() self.xoffsetWidget.setMaximum(9999) self.xoffsetWidget.setMinimum(-9999) self.yoffsetWidget = QDoubleSpinBox() self.yoffsetWidget.setMaximum(9999) self.yoffsetWidget.setMinimum(-9999) self.vlayout.addWidget(self.xoffsetWidget) self.vlayout.addWidget(self.yoffsetWidget) self.xoffsetWidget.valueChanged.connect(self.offsetchange) self.yoffsetWidget.valueChanged.connect(self.offsetchange) self.vlayout.addItem(QSpacerItem(40, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)) self.propertiesWidget.setLayout(self.vlayout) def defineIO(self): self.addOutput(vboVaoContainer, "vbovaoout", "Quad Out") def offsetchange(self, value): self.sendDataToImplementations({"xoffset": self.xoffsetWidget.value(), "yoffset": self.yoffsetWidget.value()}) def serialize(self): return {"xoffset": self.xoffsetWidget.value(), "yoffset": self.yoffsetWidget.value()} def deserialize(self, data): if "xoffset" in data: self.xoffsetWidget.setValue(data["xoffset"]) if "yoffset" in data: self.yoffsetWidget.setValue(data["yoffset"]) def getPropertiesWidget(self): return self.propertiesWidget
class AccountReassignPanel(Panel): PERSISTENT_NAME = 'accountReassignPanel' def __init__(self, model, mainwindow): Panel.__init__(self, mainwindow) self._setupUi() self.model = model self.accountComboBox = ComboboxModel(model=self.model.account_list, view=self.accountComboBoxView) self.continueButton.clicked.connect(self.accept) self.cancelButton.clicked.connect(self.reject) def _setupUi(self): if ISWINDOWS: self.resize(250, 140) else: self.resize(340, 165) self.setWindowTitle(tr("Re-assign Account")) self.verticalLayout = QVBoxLayout(self) self.label = QLabel(self) self.label.setWordWrap(True) self.label.setText(tr( "You\'re about to delete a non-empty account. Select an account to re-assign its " "transactions to." )) self.verticalLayout.addWidget(self.label) self.accountComboBoxView = QComboBox(self) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.accountComboBoxView.sizePolicy().hasHeightForWidth()) self.accountComboBoxView.setSizePolicy(sizePolicy) self.accountComboBoxView.setMinimumSize(QSize(200, 0)) self.verticalLayout.addWidget(self.accountComboBoxView) spacerItem = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.horizontalLayout = QHBoxLayout() spacerItem1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) self.cancelButton = QPushButton(self) self.cancelButton.setText(tr("Cancel")) self.cancelButton.setShortcut("Esc") self.horizontalLayout.addWidget(self.cancelButton) self.continueButton = QPushButton(self) self.continueButton.setDefault(True) self.continueButton.setText(tr("Continue")) self.horizontalLayout.addWidget(self.continueButton) self.verticalLayout.addLayout(self.horizontalLayout)
class ShipHp(QWidget): def __init__(self, parent): super(ShipHp, self).__init__(parent) self.vbox = QVBoxLayout() self.vbox.setSpacing(0) self.vbox.setContentsMargins(0,3,0,3) self.setLayout(self.vbox) self.hp = QLabel(self) #self.hp.setMinimumSize(QSize(0, 50)) self.vbox.addWidget(self.hp) self.hp_bar = QProgressBar(self) self.vbox.addWidget(self.hp_bar) sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.hp_bar.setSizePolicy(sizePolicy) self.hp_bar.setMinimumSize(QSize(100, 10)) self.hp_bar.setMaximumSize(QSize(100, 10)) self.vbox.addItem(QSpacerItem(40, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)) def set_hp(self, hp, maxhp): self.hp.setText(HP_FORMAT.format(hp, maxhp)) self.hp_bar.setValue(hp*100/maxhp) self.hp_bar.setFormat('') rate = float(hp) / float(maxhp) if rate <= 0.25: self.setProperty('damage', 'serious') elif rate <= 0.50: self.setProperty('damage', 'middle') elif rate <= 0.75: self.setProperty('damage', 'slight') else: self.setProperty('damage', 'none') self.style().unpolish(self.hp_bar) self.style().polish(self.hp_bar) self.update() # for apply stylesheet def paintEvent(self, pe): opt = QStyleOption() opt.initFrom(self) p = QPainter(self) s = self.style() s.drawPrimitive(QStyle.PE_Widget, opt, p, self)
class String(SimpleBlackbox): author = "DrLuke" name = "String" modulename = "drluke.builtin.string" Category = ["Builtin"] placeable = True implementation = StringImplementation def __init__(self, *args, **kwargs): super(String, self).__init__(*args, **kwargs) self.text = "" self.propertiesWidget = QWidget() self.vlayout = QVBoxLayout() self.lineEdit = QLineEdit() self.lineEdit.textChanged.connect(self.textChanged) self.vlayout.addWidget(self.lineEdit) self.vlayout.addItem(QSpacerItem(40, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)) self.propertiesWidget.setLayout(self.vlayout) def textChanged(self, text): self.text = text self.sendDataToImplementations(text) def getPropertiesWidget(self): return self.propertiesWidget def defineIO(self): self.addOutput(str, "strout", "String out") def serialize(self): return self.text def deserialize(self, data): if type(data) is str: self.text = data self.lineEdit.setText(self.text)
def setupUi(self): self.resize(1000, 900) gr = pg.PlotWidget(parent=self, background=[255, 255, 255]) dtait = pg.PlotDataItem(pen=pg.mkPen('r', width=4)) gr.plotItem.addItem(dtait) pl = gr.getPlotItem() vl = QVBoxLayout(self) self.setLayout(vl) vl.addWidget(gr) self.graph = gr self._plot = dtait hl = QHBoxLayout() vl.addItem(hl) hl.addWidget(QLabel("Turn Number", self)) self._lb_turn = QLabel("None", self) hl.addWidget(self._lb_turn) # hl.addWidget(QLabel("Current", self)) # self._lb_curr = QLabel("None", self) # hl.addWidget(self._lb_curr) pb1 = QPushButton("Start", self) pb1.clicked.connect(self.timer.start) hl.addWidget(pb1) pb2 = QPushButton("Stop", self) pb2.clicked.connect(self.timer.stop) hl.addWidget(pb2) self.dirs = sorted([f for f in os.listdir() if os.path.isdir(f)]) self.cb_dirs = QComboBox(self) self.cb_dirs.addItems(self.dirs) self.cb_dirs.currentTextChanged.connect(self._changedir) hl.addWidget(self.cb_dirs) self.cb_planes = QComboBox(self) self.cb_planes.addItems(['ss', 'de']) self.cb_planes.currentTextChanged.connect(self._changePlane) hl.addWidget(self.cb_planes)
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Select Menu Style</h2>")) texts = [ self.tr("<p>Application Menu is the default for KaOS because of its \ extremely lightweight (and fast) structure.</p>"), self.tr("<p>Application Launcher is the standard for KDE. \ Application shortcuts are arranged under a tab structure.</p>"), self.tr("<p>Application Panel is a full screen menu style. \ Application shortcuts are arranged so that you can access them quickly and easily.</p>") ] self.menus = [[":/data/images/menu-kicker.png", texts[0]], [":/data/images/menu-kickoff.png", texts[1]], [":/data/images/menu-kimpanel.png", texts[2]]] vlayout = QVBoxLayout(self) labelLayout = QHBoxLayout() iconLabel = QLabel() iconLabel.setMaximumSize(64, 64) iconLabel.setPixmap(QIcon.fromTheme("kde").pixmap(64, 64)) labelLayout.addWidget(iconLabel) label = QLabel(self) label.setText(self.tr("<p>You can also customize your <strong>KDE menu</strong> as you like. \ Please choose one from the following styles.</p>")) labelLayout.addWidget(label) vlayout.addLayout(labelLayout) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) self.comboBox = QComboBox(self) self.comboBox.addItem(self.tr("Application Menu")) self.comboBox.addItem(self.tr("Application Launcher")) self.comboBox.addItem(self.tr("Application Dashboard")) vlayout.addWidget(self.comboBox) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) hlayout = QHBoxLayout(self) self.labelMenu = QLabel(self) self.labelMenu.setPixmap(QPixmap(self.menus[0][0])) self.labelMenu.setMaximumSize(350 ,214) hlayout.addWidget(self.labelMenu) self.labelText = QLabel(self) self.labelText.setWordWrap(True) self.labelText.setText(self.tr(self.menus[0][1])) hlayout.addWidget(self.labelText) vlayout.addLayout(hlayout) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) self.comboBox.currentIndexChanged.connect(self.menuSelect) self.menuSelected = 0
def __init__(self,winParent, laser1, laser2, laser3): super(qualityWidget, self).__init__() self.winParent=winParent self.laser1 = laser1 self.laser2 = laser2 self.laser3 = laser3 self.numCrash = 0 self.MAX_CRASH = 1000 vLayout = QVBoxLayout() crashLabel = QLabel("Crash:") self.bar = QProgressBar() self.bar.setValue(self.numCrash) st = "QProgressBar::chunk {background-color: #ff0000;}\n QProgressBar {border: 1px solid grey;border-radius: 2px;text-align: center;background: #eeeeee;}" self.bar.setStyleSheet(st) self.bar.setTextVisible(False) vLayout.addWidget(crashLabel, 0) vLayout.addWidget(self.bar, 0) vSpacer = QSpacerItem(30, 80, QSizePolicy.Ignored, QSizePolicy.Ignored) vLayout.addItem(vSpacer) self.setLayout(vLayout)
def __init__(self): super(TestNinePatchLabel, self).__init__() self.resize(400, 600) self.listWidget = QListWidget(self) self.listWidget.setObjectName("listWidget") self.listWidget.setStyleSheet(""" QListWidget::item:selected { background: rgba(0,0,0,0); } QListWidget::item:hover { background: rgba(0,0,0,0); } """) self.textEdit = QTextEdit(self) self.textEdit.setMaximumHeight(100) self.textEdit.setObjectName("textEdit") self.sendBtn = QPushButton("发送", self) self.sendBtn.setObjectName("sendBtn") hlayout = QHBoxLayout() hlayout.setContentsMargins(0, 0, 0, 0) hlayout.setSpacing(0) hlayout.addWidget(self.textEdit) hlayout.addWidget(self.sendBtn) vlayout = QVBoxLayout(self) vlayout.setContentsMargins(0, 0, 0, 0) vlayout.setSpacing(0) vlayout.addWidget(self.listWidget) vlayout.addItem(hlayout) QMetaObject.connectSlotsByName(self) # 通过objectname注册信号 self.init() self.setStyleSheet(SCROLLBARSTYLE)
def __init__(self, parent=None): super().__init__(parent) self.setSubTitle(self.tr("<h2>Welcome to KaOS</h2>")) vlayout = QVBoxLayout(self) vlayout.addItem(QSpacerItem(20, 30, QSizePolicy.Preferred, QSizePolicy.Minimum)) hlayout = QHBoxLayout(self) label = QLabel(self) label.setText(self.tr("""<h1>What is KaOS?</h1> <p>The idea behind KaOS is to create a tightly integrated rolling and<br /> transparent distribution for the modern desktop, build from scratch with<br /> a very specific focus. Focus on one DE (KDE), one toolkit (Qt) & one architecture (x86_64).<br /> Plus a focus on evaluating and selecting the most suitable tools and applications.</p> <p>This wizard will help you personalize your KaOS workspace easily and quickly.</p> <p>Please click <code style=color:#3498DB>Next</code> in order to begin. Click <code style=color:#3498DB>Cancel</code> anytime and changes won't be saved.</p>""")) label.setWordWrap(True) label.setAlignment(Qt.AlignLeft) hlayout.addWidget(label) kaptan_logo = QLabel(self) kaptan_logo.setPixmap(QPixmap(":/data/images/welcome.png")) kaptan_logo.setAlignment(Qt.AlignRight) kaptan_logo.setMaximumSize(157, 181) hlayout.addWidget(kaptan_logo) vlayout.addLayout(hlayout) vlayout.addItem(QSpacerItem(20, 40, QSizePolicy.Preferred, QSizePolicy.Preferred)) desktop_file = os.path.join(os.environ["HOME"], ".config", "autostart", "kaptan.desktop") if os.path.exists(desktop_file): self.checkBox = QCheckBox() self.checkBox.setText(self.tr("Run on system startup")) self.checkBox.setChecked(True) self.checkBox.clicked.connect(self.autoRemove) vlayout.addWidget(self.checkBox)
class SubSheet(SimpleBlackbox): author = "DrLuke" name = "Subsheet" modulename = "subsheet" Category = ["Builtin"] placeable = True implementation = SubSheetImplementation def __init__(self, *args, **kwargs): self.ownsheet = None self.sheets = None self.selectedSheet = None self.listSheetItems = {} super(SubSheet, self).__init__(*args, **kwargs) self.propertiesWidget = QWidget() self.vlayout = QVBoxLayout() self.listWidget = QListWidget() self.listWidget.itemClicked.connect(self.listClicked) self.vlayout.addWidget(self.listWidget) self.vlayout.addItem(QSpacerItem(40, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)) self.propertiesWidget.setLayout(self.vlayout) def getPropertiesWidget(self): return self.propertiesWidget def updateSheets(self): if self.sheets is not None and self.ownsheet is not None: self.listSheetItems = {} self.listWidget.clear() for sheetId in self.sheets: if not sheetId == self.ownsheet: newItem = QListWidgetItem(self.sheets[sheetId]) newItem.setToolTip(str(sheetId)) newItem.setData(Qt.UserRole, sheetId) self.listSheetItems[sheetId] = newItem self.listWidget.addItem(newItem) if sheetId == self.selectedSheet: boldFont = QFont() boldFont.setBold(True) newItem.setFont(boldFont) def listClicked(self, item): normalFont = QFont() boldFont = QFont() boldFont.setBold(True) for i in range(self.listWidget.count()): itemnormal = self.listWidget.item(i) itemnormal.setFont(normalFont) self.selectedSheet = item.data(Qt.UserRole) self.sendDataToImplementations({"subsheetid": self.selectedSheet}) item.setFont(boldFont) def serialize(self): return {"subsheetid": self.selectedSheet} def deserialize(self, data): if data is not None: if "subsheetid" in data: self.selectedSheet = data["subsheetid"] self.sendDataToImplementations({"subsheetid": self.selectedSheet}) def selectedChanged(self, state): if state: self.mainRect.setPen(QPen(Qt.red)) else: self.mainRect.setPen(QPen(Qt.blue)) def defineIO(self): self.addInput(execType, "execInit", "Execute Init") self.addInput(execType, "execLoop", "Execute Loop") self.addOutput(execType, "ExecInitOut", "Init Done") self.addOutput(execType, "ExecLoopOut", "Loop Done")
def runInputDialog(self, title, c1Text, c2Text, opText, outText, cell1, cell2, outCell): rows = [] cols = [] for r in range(self.table.rowCount()): rows.append(str(r + 1)) for c in range(self.table.columnCount()): cols.append(chr(ord('A') + c)) addDialog = QDialog(self) addDialog.setWindowTitle(title) group = QGroupBox(title, addDialog) group.setMinimumSize(250, 100) cell1Label = QLabel(c1Text, group) cell1RowInput = QComboBox(group) c1Row, c1Col = decode_pos(cell1) cell1RowInput.addItems(rows) cell1RowInput.setCurrentIndex(c1Row) cell1ColInput = QComboBox(group) cell1ColInput.addItems(cols) cell1ColInput.setCurrentIndex(c1Col) operatorLabel = QLabel(opText, group) operatorLabel.setAlignment(Qt.AlignHCenter) cell2Label = QLabel(c2Text, group) cell2RowInput = QComboBox(group) c2Row, c2Col = decode_pos(cell2) cell2RowInput.addItems(rows) cell2RowInput.setCurrentIndex(c2Row) cell2ColInput = QComboBox(group) cell2ColInput.addItems(cols) cell2ColInput.setCurrentIndex(c2Col) equalsLabel = QLabel("=", group) equalsLabel.setAlignment(Qt.AlignHCenter) outLabel = QLabel(outText, group) outRowInput = QComboBox(group) outRow, outCol = decode_pos(outCell) outRowInput.addItems(rows) outRowInput.setCurrentIndex(outRow) outColInput = QComboBox(group) outColInput.addItems(cols) outColInput.setCurrentIndex(outCol) cancelButton = QPushButton("Cancel", addDialog) cancelButton.clicked.connect(addDialog.reject) okButton = QPushButton("OK", addDialog) okButton.setDefault(True) okButton.clicked.connect(addDialog.accept) buttonsLayout = QHBoxLayout() buttonsLayout.addStretch(1) buttonsLayout.addWidget(okButton) buttonsLayout.addSpacing(10) buttonsLayout.addWidget(cancelButton) dialogLayout = QVBoxLayout(addDialog) dialogLayout.addWidget(group) dialogLayout.addStretch(1) dialogLayout.addItem(buttonsLayout) cell1Layout = QHBoxLayout() cell1Layout.addWidget(cell1Label) cell1Layout.addSpacing(10) cell1Layout.addWidget(cell1ColInput) cell1Layout.addSpacing(10) cell1Layout.addWidget(cell1RowInput) cell2Layout = QHBoxLayout() cell2Layout.addWidget(cell2Label) cell2Layout.addSpacing(10) cell2Layout.addWidget(cell2ColInput) cell2Layout.addSpacing(10) cell2Layout.addWidget(cell2RowInput) outLayout = QHBoxLayout() outLayout.addWidget(outLabel) outLayout.addSpacing(10) outLayout.addWidget(outColInput) outLayout.addSpacing(10) outLayout.addWidget(outRowInput) vLayout = QVBoxLayout(group) vLayout.addItem(cell1Layout) vLayout.addWidget(operatorLabel) vLayout.addItem(cell2Layout) vLayout.addWidget(equalsLabel) vLayout.addStretch(1) vLayout.addItem(outLayout) if addDialog.exec_(): cell1 = cell1ColInput.currentText() + cell1RowInput.currentText() cell2 = cell2ColInput.currentText() + cell2RowInput.currentText() outCell = outColInput.currentText() + outRowInput.currentText() return True, cell1, cell2, outCell return False, None, None, None
class EditorMainWindow(QMainWindow): def __init__(self): super().__init__() self.setupUi(self) self.retranslateUi(self) self.level = None path = get_default_path() if path is None: self.default_path = "" else: self.default_path = path self.dragging = False self.last_x = None self.last_y = None self.dragged_time = None self.deleting_item = False # Hack for preventing focusing on next item after deleting the previous one self.moving = False self.resetting = False self.entity_list_widget.currentItemChanged.connect(self.action_listwidget_change_selection) self.button_zoom_in.pressed.connect(self.zoom_in) self.button_zoom_out.pressed.connect(self.zoom_out) self.button_remove_entity.pressed.connect(self.remove_position) self.button_move_entity.pressed.connect(self.move_entity) self.button_clone_entity.pressed.connect(self.action_clone_entity) self.button_show_passengers.pressed.connect(self.action_passenger_window) self.button_edit_xml.pressed.connect(self.action_open_xml_editor) self.button_edit_base_xml.pressed.connect(self.action_open_basexml_editor) self.lineedit_angle.editingFinished.connect(self.action_lineedit_changeangle) self.bw_map_screen.mouse_clicked.connect(self.get_position) self.bw_map_screen.entity_clicked.connect(self.entity_position) self.bw_map_screen.mouse_dragged.connect(self.mouse_move) self.bw_map_screen.mouse_released.connect(self.mouse_release) self.bw_map_screen.mouse_wheel.connect(self.mouse_wheel_scroll_zoom) status = self.statusbar self.bw_map_screen.setMouseTracking(True) self.passenger_window = BWPassengerWindow() self.passenger_window.passengerlist.currentItemChanged.connect(self.passengerwindow_action_choose_entity) self.xmlobject_textbox = BWEntityXMLEditor() self.xmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_object_xml) self.xmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited) self.basexmlobject_textbox = BWEntityXMLEditor(windowtype="XML Base Object") self.basexmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_base_object_xml) self.basexmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited) self.types_visible = {} self.terrain_image = None status.showMessage("Ready") self.xml_windows = {} print("We are now ready!") def reset(self): self.resetting = True self.statusbar.clearMessage() self.dragged_time = None self.moving = False self.dragging = False self.last_x = None self.last_y = None self.dragged_time = None self.moving = False self.entity_list_widget.clearSelection() self.entity_list_widget.clear() self.bw_map_screen.reset() self.clear_visibility_toggles() for window in (self.passenger_window, self.xmlobject_textbox, self.basexmlobject_textbox): window.close() window.reset() for id in self.xml_windows: self.destroy_xml_editor(id) self.resetting = False print("reset done") def destroy_xml_editor(self, id): pass @catch_exception def open_xml_editor(self, objectid, offsetx=0, offsety=0): selected = objectid if self.level is not None and selected in self.level.obj_map: delete = [] for objid, window in self.xml_windows.items(): if not window.isVisible() and objid != selected: window.destroy() delete.append(objid) for objid in delete: del self.xml_windows[objid] if selected == self.basexmlobject_textbox.entity or selected == self.xmlobject_textbox.entity: pass # No need to make a new window elif selected in self.xml_windows and self.xml_windows[selected].isVisible(): self.xml_windows[selected].activateWindow() self.xml_windows[selected].update() else: xml_window = BWEntityXMLEditor() def xmleditor_save_object_unlimited(): self.statusbar.showMessage("Saving object changes...") try: xmlnode = xml_window.get_content() #assert self.bw_map_screen.current_entity == self.basexmlobject_textbox.entity assert xml_window.entity == xmlnode.get("id") # Disallow changing the id of the base object self.level.remove_object(xmlnode.get("id")) self.level.add_object(xmlnode) self.statusbar.showMessage("Saved base object {0} as {1}".format( xml_window.entity, self.level.obj_map[xmlnode.get("id")].name)) except: self.statusbar.showMessage("Saving object failed") traceback.print_exc() xml_window.button_xml_savetext.pressed.connect(xmleditor_save_object_unlimited) xml_window.triggered.connect(self.action_open_xml_editor_unlimited) obj = self.level.obj_map[selected] xml_window.set_title(obj.name) xml_window.set_content(obj._xml_node) #xml_window.move(QPoint(xml_editor_owner.pos().x()+20, xml_editor_owner.pos().y()+20)) xml_window.move(QPoint(offsetx, offsety)) xml_window.show() xml_window.update() self.xml_windows[selected] = xml_window @catch_exception def action_open_xml_editor_unlimited(self, xml_editor_owner): selected = xml_editor_owner.textbox_xml.textCursor().selectedText() self.open_xml_editor(selected, offsetx=xml_editor_owner.pos().x()+20, offsety=xml_editor_owner.pos().y()+20) @catch_exception def action_open_basexml_editor(self): """ if not self.basexmlobject_textbox.isVisible(): self.basexmlobject_textbox.destroy() self.basexmlobject_textbox = BWEntityXMLEditor(windowtype="XML Base Object") self.basexmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_base_object_xml) self.basexmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited) self.basexmlobject_textbox.show() self.basexmlobject_textbox.activateWindow()""" if self.level is not None and self.bw_map_screen.current_entity is not None: obj = self.level.obj_map[self.bw_map_screen.current_entity] if not obj.has_attr("mBase"): pass else: baseobj = self.level.obj_map[obj.get_attr_value("mBase")] #self.basexmlobject_textbox.set_title(baseobj.id) self.open_xml_editor(baseobj.id) def xmleditor_action_save_base_object_xml(self): self.statusbar.showMessage("Saving base object changes...") try: xmlnode = self.basexmlobject_textbox.get_content() #assert self.bw_map_screen.current_entity == self.basexmlobject_textbox.entity assert self.basexmlobject_textbox.entity == xmlnode.get("id") # Disallow changing the id of the base object self.level.remove_object(xmlnode.get("id")) self.level.add_object(xmlnode) self.statusbar.showMessage("Saved base object {0} as {1}".format( self.basexmlobject_textbox.entity, self.level.obj_map[xmlnode.get("id")].name)) except: self.statusbar.showMessage("Saving base object failed") traceback.print_exc() def action_open_xml_editor(self): """ if not self.xmlobject_textbox.isVisible(): self.xmlobject_textbox.destroy() self.xmlobject_textbox = BWEntityXMLEditor() self.xmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_object_xml) self.xmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited) self.xmlobject_textbox.show() self.xmlobject_textbox.activateWindow()""" if self.level is not None and self.bw_map_screen.current_entity is not None: entityobj = self.level.obj_map[self.bw_map_screen.current_entity] self.open_xml_editor(objectid=entityobj.id) update_mapscreen(self.bw_map_screen, self.level.obj_map[entityobj.id]) self.bw_map_screen.update() """self.xmlobject_textbox.set_title(entityobj.id) self.xmlobject_textbox.set_content(entityobj._xml_node) self.xmlobject_textbox.update()""" def xmleditor_action_save_object_xml(self): self.statusbar.showMessage("Saving object changes...") try: xmlnode = self.xmlobject_textbox.get_content() #assert self.bw_map_screen.current_entity == self.xmlobject_textbox.entity assert self.xmlobject_textbox.entity == xmlnode.get("id") or xmlnode.get("id") not in self.level.obj_map if self.passenger_window.isVisible(): self.passenger_window.close() if self.xmlobject_textbox.entity != xmlnode.get("id"): #obj = self.level.obj_map[xmlnode.get("id")] self.level.remove_object(self.xmlobject_textbox.entity) print("adding", xmlnode.get("id"), xmlnode.get("id") in self.level.obj_map ) self.level.add_object(xmlnode) pos = self.get_entity_item_pos(self.xmlobject_textbox.entity) item = self.entity_list_widget.takeItem(pos) self.entity_list_widget.removeItemWidget(item) self.add_item_sorted(xmlnode.get("id")) self.bw_map_screen.rename_entity(self.xmlobject_textbox.entity, xmlnode.get("id")) assert xmlnode.get("id") in self.level.obj_map self.xmlobject_textbox.entity = xmlnode.get("id") self.xmlobject_textbox.set_title(xmlnode.get("id")) else: self.level.remove_object(xmlnode.get("id")) self.level.add_object(xmlnode) update_mapscreen(self.bw_map_screen, self.level.obj_map[xmlnode.get("id")]) self.statusbar.showMessage("Saved object {0} as {1}".format( self.xmlobject_textbox.entity, self.level.obj_map[xmlnode.get("id")].name)) self.bw_map_screen.update() except: self.statusbar.showMessage("Saving object failed") traceback.print_exc() def action_clone_entity(self): entities = [] if self.bw_map_screen.current_entity is not None: entities.append(self.bw_map_screen.current_entity) elif len(self.bw_map_screen.selected_entities) > 0: entities.extend(self.bw_map_screen.selected_entities.keys()) if len(entities) > 0: dont_clone = {} for entity in entities: obj = self.level.obj_map[entity] if obj.has_attr("mPassenger"): passengers = obj.get_attr_elements("mPassenger") for passenger in passengers: if passenger != "0": dont_clone[passenger] = True select = [] for entity in entities: if entity in dont_clone: continue obj = self.level.obj_map[entity] xml_node = deepcopy(obj._xml_node) try: cloned_id = self.level.generate_unique_id(entity) xml_node.set("id", cloned_id) self.level.add_object(xml_node) bw_x, bw_y, angle = object_get_position(self.level, cloned_id) x, y = bw_coords_to_image_coords(bw_x, bw_y) self.add_item_sorted(cloned_id) self.bw_map_screen.add_entity(x, y, cloned_id, obj.type) clonedobj = self.level.obj_map[cloned_id] select.append(cloned_id) update_mapscreen(self.bw_map_screen, clonedobj) if clonedobj.has_attr("mPassenger"): orig_x = bw_x orig_y = bw_y passengers = clonedobj.get_attr_elements("mPassenger") passengers_added = [] for i, passenger in enumerate(passengers): if passenger != "0": obj = self.level.obj_map[passenger] xml_node = deepcopy(obj._xml_node) clonedpassenger_id = self.level.generate_unique_id(passenger) xml_node.set("id", clonedpassenger_id) #print("orig passenger: {0}, new passenger: {1}, alreadyexists: {2}".format( # passenger, clonedpassenger_id, clonedpassenger_id in self.level.obj_map #)) #print(type(passenger), type(clonedpassenger_id)) self.level.add_object(xml_node) #x, y = object_get_position(self.level, newid) x = orig_x + (i+1)*8 y = orig_y + (i+1)*8 #print(orig_x, orig_y, x, y) object_set_position(self.level, clonedpassenger_id, x, y) x, y = bw_coords_to_image_coords(x, y) self.add_item_sorted(clonedpassenger_id) self.bw_map_screen.add_entity(x, y, clonedpassenger_id, obj.type) update_mapscreen(self.bw_map_screen, self.level.obj_map[clonedpassenger_id]) passengers_added.append(passenger) clonedobj.set_attr_value("mPassenger", clonedpassenger_id, i) select.append(clonedpassenger_id) #print("passengers added:", passengers_added) self.bw_map_screen.selected_entities = {} if len(select) == 1: ent = select[0] self.set_entity_text(ent) self.bw_map_screen.choose_entity(ent) else: for ent in select: self.bw_map_screen.selected_entities[ent] = True self.set_entity_text_multiple(self.bw_map_screen.selected_entities) self.bw_map_screen.update() except: traceback.print_exc() def add_item_sorted(self, entity): max_count = self.entity_list_widget.count() entityobj = self.level.obj_map[entity] index = 0 entity_item = BWEntityEntry(entity, "{0}[{1}]".format(entity, entityobj.type)) # Similar to loading a level, we add the entity in a sorted way by # creating this string and comparing it for every item in the list. entity_string = get_type(entityobj.type)+entityobj.type+entityobj.id inserted = False for i in range(max_count): curritem = self.entity_list_widget.item(i) currobj = self.level.obj_map[curritem.xml_ref] currstring = get_type(currobj.type)+currobj.type+currobj.id # The list is already sorted, so if we find an item bigger than # the one we are inserting, we know the position we have to insert the item in. # String comparison should be alpabetically. if currstring > entity_string: self.entity_list_widget.insertItem(i, entity_item) inserted = True break # If we couldn't insert the item, i.e. there are no items at all # or all items are smaller than the item we add, we just add it at the end. if not inserted: self.entity_list_widget.addItem(entity_item) def get_entity_item_pos(self, entityid): for i in range(self.entity_list_widget.count()): item = self.entity_list_widget.item(i) if item.xml_ref == entityid: return i return None def action_passenger_window(self): #if self.passenger_window.isVisible() print("window is visible: ", self.passenger_window.isVisible()) #self.passenger_window.reset() if not self.passenger_window.isVisible(): self.passenger_window.destroy() self.passenger_window = BWPassengerWindow() self.passenger_window.passengerlist.currentItemChanged.connect(self.passengerwindow_action_choose_entity) self.passenger_window.show() self.passenger_window.activateWindow() if self.bw_map_screen.current_entity is not None: self.passenger_window.reset() entityobj = self.level.obj_map[self.bw_map_screen.current_entity] self.passenger_window.set_title(entityobj.id) if entityobj.has_attr("mPassenger"): for i, passenger in enumerate(entityobj.get_attr_elements("mPassenger")): if passenger in self.level.obj_map: passengerobj = self.level.obj_map[passenger] list_item_name = "{0}[{1}]".format(passenger, passengerobj.type) elif passenger == "0": list_item_name = "{0}<none>".format(passenger) else: list_item_name = "{0}<missing>".format(passenger) self.passenger_window.add_passenger(list_item_name, passenger) self.passenger_window.update() def passengerwindow_action_choose_entity(self, current, previous): try: if current is not None and current.xml_ref in self.level.obj_map: self.set_entity_text(current.xml_ref) self.bw_map_screen.choose_entity(current.xml_ref) elif current is not None: self.statusbar.showMessage("No such entity: {0}".format(current.xml_ref), 1000*2) except: traceback.print_exc() def move_entity(self): if not self.dragging: if not self.moving: self.moving = True currtext = self.button_move_entity.text() self.button_move_entity.setText("Stop [Move Entity]") else: self.moving = False currtext = "Move Entity" self.button_move_entity.setText(currtext) def button_load_level(self): try: print("ok", self.default_path) self.xmlPath = "" filepath, choosentype = QFileDialog.getOpenFileName( self, "Open File", self.default_path, BW_LEVEL+";;"+BW_COMPRESSED_LEVEL+";;All files (*)") print("doooone") if filepath: print("resetting") self.reset() print("done") print("chosen type:",choosentype) # Some BW levels are clear XML files, some are compressed with GZIP # We decide between the two either based on user choice or end of filepath if choosentype == BW_COMPRESSED_LEVEL or filepath.endswith(".gz"): print("OPENING AS COMPRESSED") file_open = gzip.open else: file_open = open with file_open(filepath, "rb") as f: try: self.level = BattWarsLevel(f) self.default_path = filepath set_default_path(filepath) self.setup_visibility_toggles() for obj_id, obj in sorted(self.level.obj_map.items(), key=lambda x: get_type(x[1].type)+x[1].type+x[1].id): #print("doing", obj_id) if get_position_attribute(obj) is None: continue #if not obj.has_attr("Mat"): # continue x, y, angle = object_get_position(self.level, obj_id) assert type(x) != str x, y = bw_coords_to_image_coords(x, y) item = BWEntityEntry(obj_id, "{0}[{1}]".format(obj_id, obj.type)) self.entity_list_widget.addItem(item) self.bw_map_screen.add_entity(x, y, obj_id, obj.type, update=False) #if obj.type == "cMapZone": update_mapscreen(self.bw_map_screen, obj) print("ok") self.bw_map_screen.update() path_parts = path.split(filepath) self.setWindowTitle("BW-MapEdit - {0}".format(path_parts[-1])) except Exception as error: print("error", error) traceback.print_exc() except Exception as er: print("errrorrr", er) traceback.print_exc() print("loaded") def button_save_level(self): if self.level is not None: filepath, choosentype = QFileDialog.getSaveFileName( self, "Save File", self.default_path, BW_LEVEL+";;"+BW_COMPRESSED_LEVEL+";;All files (*)") print(filepath, "saved") if filepath: # Simiar to load level if choosentype == BW_COMPRESSED_LEVEL or filepath.endswith(".gz"): file_open = gzip.open else: file_open = open try: with file_open(filepath, "wb") as f: self.level._tree.write(f) except Exception as error: print("COULDN'T SAVE:", error) traceback.print_exc() self.default_path = filepath else: pass # no level loaded, do nothing def entity_position(self, event, entity): try: # Make it possible to select objects in move mode, but don't make it too easy to lose # a selection. if not (self.moving and len(self.bw_map_screen.selected_entities) > 1): print("got entity:",entity, self.bw_map_screen.entities[entity][2]) print(entity_get_model(self.level, entity)) self.set_entity_text(entity) self.bw_map_screen.choose_entity(entity) pos = self.get_entity_item_pos(entity) print("searching:",pos) try: self.entity_list_widget.select_item(pos) except: traceback.print_exc() self.bw_map_screen.selected_entities = {} self.bw_map_screen.update() except: traceback.print_exc() def remove_position(self): #self.bw_map_screen.entities.pop() try: # Remove the entity from the map, the list widget and the level data self.deleting_item = True entities = [] if self.bw_map_screen.current_entity is not None: entities.append(self.bw_map_screen.current_entity) elif len(self.bw_map_screen.selected_entities) > 0: entities.extend(self.bw_map_screen.selected_entities.keys()) self.bw_map_screen.selected_entities = {} self.set_entity_text_multiple(self.bw_map_screen.selected_entities) if len(entities) > 0: for entity in entities: pos = self.get_entity_item_pos(entity) item = self.entity_list_widget.takeItem(pos) assert item.xml_ref == entity #self.entity_list_widget.clearSelection() self.entity_list_widget.clearFocus() self.entity_list_widget.removeItemWidget(item) self.level.remove_object(entity) self.bw_map_screen.remove_entity(entity) self.bw_map_screen.update() except: traceback.print_exc() raise #@catch_exception def get_position(self, event): self.dragging = True self.last_x = event.x() self.last_y = event.y() self.dragged_time = default_timer() mouse_x = event.x()/self.bw_map_screen.zoom_factor mouse_y = event.y()/self.bw_map_screen.zoom_factor if event.buttons() == QtCore.Qt.LeftButton: if not self.moving: self.bw_map_screen.set_selectionbox_start((event.x(), event.y())) else: if self.bw_map_screen.current_entity is not None: newx, newy = image_coords_to_bw_coords(mouse_x, mouse_y) object_set_position(self.level, self.bw_map_screen.current_entity, newx, newy) self.bw_map_screen.move_entity(self.bw_map_screen.current_entity, mouse_x, mouse_y) self.set_entity_text(self.bw_map_screen.current_entity) update_mapscreen(self.bw_map_screen, self.level.obj_map[self.bw_map_screen.current_entity]) elif len(self.bw_map_screen.selected_entities) > 0: for entity in self.bw_map_screen.selected_entities: first_entity = entity break #first_entity = self.bw_map_screen.selected_entities.keys()[0] x, y, entitytype, metadata = self.bw_map_screen.entities[first_entity] startx = endx = x starty = endy = y for entity in self.bw_map_screen.selected_entities: x, y, dontneed, dontneed = self.bw_map_screen.entities[entity] if x < startx: startx = x if x > endx: endx = x if y < starty: starty = y if y > endy: endy = y middle_x = (startx+endx) / 2 middle_y = (starty+endy) / 2 delta_x = mouse_x - middle_x delta_y = mouse_y - middle_y for entity in self.bw_map_screen.selected_entities: x, y, dontneed, dontneed = self.bw_map_screen.entities[entity] newx, newy = image_coords_to_bw_coords(x+delta_x, y+delta_y) object_set_position(self.level, entity, newx, newy) self.bw_map_screen.move_entity(entity, x+delta_x, y+delta_y) #self.set_entity_text(self.bw_map_screen.current_entity) update_mapscreen(self.bw_map_screen, self.level.obj_map[entity]) self.bw_map_screen.update() @catch_exception def mouse_move(self, event): x, y = image_coords_to_bw_coords(event.x()/self.bw_map_screen.zoom_factor, event.y()/self.bw_map_screen.zoom_factor) self.statusbar.showMessage("x: {0} y: {1}".format(round(x, 5), round(y, 5))) if self.dragging and default_timer() - self.dragged_time > 0.1: if event.buttons() == QtCore.Qt.RightButton: delta_x = (event.x()-self.last_x)/8 delta_y = (event.y()-self.last_y)/8 #print("hi",event.x(), event.y()) vertbar = self.scrollArea.verticalScrollBar() horizbar = self.scrollArea.horizontalScrollBar() vertbar.setSliderPosition(vertbar.value()-delta_y) horizbar.setSliderPosition(horizbar.value()-delta_x) elif event.buttons() == QtCore.Qt.LeftButton: self.bw_map_screen.set_selectionbox_end((event.x(), event.y())) if len(self.bw_map_screen.selected_entities) > 0 or self.bw_map_screen.current_entity is None: self.bw_map_screen.choose_entity(None) self.set_entity_text_multiple(self.bw_map_screen.selected_entities) self.bw_map_screen.update() def mouse_release(self, event): self.dragging = False if self.bw_map_screen.selectionbox_end is not None: self.bw_map_screen.clear_selection_box() self.bw_map_screen.update() def set_entity_text_multiple(self, entities): self.label_object_id.setText("{0} objects selected".format(len(entities))) MAX = 15 listentities = [self.level.obj_map[x].name for x in sorted(entities.keys())][0:MAX] listentities.sort() if len(entities) > MAX: listentities.append("... and {0} more".format(len(entities) - len(listentities))) self.label_position.setText("\n".join(listentities[:5])) self.label_model_name.setText("\n".join(listentities[5:10])) self.label_4.setText("\n".join(listentities[10:]))#15])) self.label_5.setText("")#("\n".join(listentities[12:16])) def set_entity_text(self, entityid): try: obj = self.level.obj_map[entityid] if obj.has_attr("mBase"): base = self.level.obj_map[obj.get_attr_value("mBase")] self.label_object_id.setText("{0}\n[{1}]\nBase: {2}\n[{3}]".format( entityid, obj.type, base.id, base.type)) else: self.label_object_id.setText("{0}\n[{1}]".format(entityid, obj.type)) self.label_model_name.setText("Model: {0}".format(entity_get_model(self.level, entityid))) x, y, angle = object_get_position(self.level, entityid) self.label_position.setText("x: {0}\ny: {1}".format(x, y)) self.lineedit_angle.setText(str(round(angle,2))) self.label_4.setText("Army: {0}".format(entity_get_army(self.level, entityid))) if not obj.has_attr("mPassenger"): self.label_5.setText("Icon Type: \n{0}".format(entity_get_icon_type(self.level, entityid))) else: passengers = 0 for passenger in obj.get_attr_elements("mPassenger"): if passenger != "0": passengers += 1 self.label_5.setText("Icon Type: \n{0}\n\nPassengers: {1}".format( entity_get_icon_type(self.level, entityid), passengers)) except: traceback.print_exc() def action_listwidget_change_selection(self, current, previous): #QtWidgets.QListWidgetItem. if not self.resetting and current is not None: print("ok") print("hi", current.text(), current.xml_ref) self.set_entity_text(current.xml_ref) self.bw_map_screen.choose_entity(current.xml_ref) posx, posy, typename, metadata = self.bw_map_screen.entities[current.xml_ref] zf = self.bw_map_screen.zoom_factor try: if not self.deleting_item: x_margin = min(100, 50*zf) y_margin = min(100, 50*zf) self.scrollArea.ensureVisible(posx*zf, posy*zf, xMargin=x_margin, yMargin=y_margin) else: self.deleting_item = False except: traceback.print_exc() def zoom_out(self, noslider=False): horizbar = self.scrollArea.horizontalScrollBar() vertbar = self.scrollArea.verticalScrollBar() print(horizbar.maximum(), vertbar.maximum()) if horizbar.maximum() > 0: widthratio = horizbar.value()/horizbar.maximum() else: widthratio = 0 if vertbar.maximum() > 0: heightratio = vertbar.value()/vertbar.maximum() else: heightratio = 0 #oldzf = self.bw_map_screen.zoom_factor / (0.1+1) #diff = oldzf - self.bw_map_screen.zoom_factor zf = self.bw_map_screen.zoom_factor self.bw_map_screen.zoom(calc_zoom_out_factor(zf))#diff) # if not noslider: horizbar.setSliderPosition(horizbar.maximum()*widthratio) vertbar.setSliderPosition(vertbar.maximum()*heightratio) self.bw_map_screen.update() self.statusbar.showMessage("Zoom: {0}x".format(self.bw_map_screen.zoom_factor)) def zoom_in(self, noslider=False): horizbar = self.scrollArea.horizontalScrollBar() vertbar = self.scrollArea.verticalScrollBar() if horizbar.maximum() > 0: widthratio = horizbar.value()/horizbar.maximum() else: widthratio = 0 if vertbar.maximum() > 0: heightratio = vertbar.value()/vertbar.maximum() else: heightratio = 0 zf = self.bw_map_screen.zoom_factor self.bw_map_screen.zoom(calc_zoom_in_factor(zf))#zf) # print("wedidit?") if not noslider: horizbar.setSliderPosition(horizbar.maximum()*widthratio) vertbar.setSliderPosition(vertbar.maximum()*heightratio) self.bw_map_screen.update() self.statusbar.showMessage("Zoom: {0}x".format(self.bw_map_screen.zoom_factor)) @catch_exception def mouse_wheel_scroll_zoom(self, wheel_event): print("scrolling", wheel_event) print("Scroll", wheel_event.x(), wheel_event.y(), wheel_event.angleDelta().y())#, wheel_event.delta()) wheel_delta = wheel_event.angleDelta().y() zf = self.bw_map_screen.zoom_factor norm_x = wheel_event.x()/zf norm_y = wheel_event.y()/zf if wheel_delta > 0: if zf <= 10: self.zoom_in(True) zf = self.bw_map_screen.zoom_factor xmargin = self.scrollArea.viewport().width()//2 - 200 ymargin = self.scrollArea.viewport().height()//2 - 200 self.scrollArea.ensureVisible(norm_x*zf, norm_y*zf, xmargin, ymargin) self.bw_map_screen.update() else: self.zoom_in() elif wheel_delta < 0: self.zoom_out() def action_lineedit_changeangle(self): if not self.resetting and self.bw_map_screen.current_entity is not None: print("ok") current = self.bw_map_screen.current_entity currx, curry, angle = object_get_position(self.level, current) newangle = self.lineedit_angle.text().strip() print(newangle, newangle.isdecimal()) try: angle = float(newangle) object_set_position(self.level, current, currx, curry, angle=angle) currentobj = self.level.obj_map[current] update_mapscreen(self.bw_map_screen, currentobj) self.bw_map_screen.update() except: traceback.print_exc() def button_terrain_load_action(self): try: print("ok", self.default_path) filepath, choosentype = QFileDialog.getOpenFileName( self, "Open File", self.default_path, "BW terrain files (*.out *out.gz);;All files (*)") print("doooone") if filepath: if filepath.endswith(".gz"): file_open = gzip.open else: file_open = open with file_open(filepath, "rb") as f: try: terrain = BWArchiveBase(f) if self.level is not None: waterheight = get_water_height(self.level) else: waterheight = None image, light_image = parse_terrain_to_image(terrain, waterheight) self.bw_map_screen.set_terrain(image, light_image) except: traceback.print_exc() except: traceback.print_exc() def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(820, 760) MainWindow.setMinimumSize(QSize(720, 560)) MainWindow.setWindowTitle("BW-MapEdit") #MainWindow.setWindowTitle("Nep-Nep") self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") MainWindow.setCentralWidget(self.centralwidget) self.horizontalLayout = QHBoxLayout(self.centralwidget) self.horizontalLayout.setObjectName("horizontalLayout") self.scrollArea = QScrollArea(self.centralwidget) self.scrollArea.setWidgetResizable(True) self.bw_map_screen = BWMapViewer(self.centralwidget) self.scrollArea.setWidget(self.bw_map_screen) self.horizontalLayout.addWidget(self.scrollArea) #self.horizontalLayout.addWidget(self.bw_map_screen) self.entity_list_widget = BWEntityListWidget(self.centralwidget) self.entity_list_widget.setMaximumSize(QSize(300, 16777215)) self.entity_list_widget.setObjectName("entity_list_widget") self.horizontalLayout.addWidget(self.entity_list_widget) spacerItem = QSpacerItem(10, 20, QSizePolicy.Minimum, QSizePolicy.Expanding) self.horizontalLayout.addItem(spacerItem) self.vertLayoutWidget = QWidget(self.centralwidget) self.vertLayoutWidget.setMaximumSize(QSize(250, 1200)) self.verticalLayout = QVBoxLayout(self.vertLayoutWidget) self.verticalLayout.setObjectName("verticalLayout") #self.verticalLayout. self.button_clone_entity = QPushButton(self.centralwidget) self.button_clone_entity.setObjectName("button_clone_entity") self.verticalLayout.addWidget(self.button_clone_entity) self.button_remove_entity = QPushButton(self.centralwidget) self.button_remove_entity.setObjectName("button_remove_entity") self.verticalLayout.addWidget(self.button_remove_entity) self.button_move_entity = QPushButton(self.centralwidget) self.button_move_entity.setObjectName("button_move_entity") self.verticalLayout.addWidget(self.button_move_entity) self.button_show_passengers = QPushButton(self.centralwidget) self.button_show_passengers.setObjectName("button_move_entity") self.verticalLayout.addWidget(self.button_show_passengers) self.gridLayout = QGridLayout() self.gridLayout.setObjectName("gridLayout") self.button_zoom_in = QPushButton(self.centralwidget) self.button_zoom_in.setObjectName("button_zoom_in") self.gridLayout.addWidget(self.button_zoom_in, 0, 0, 0, 1) self.button_zoom_out = QPushButton(self.centralwidget) self.button_zoom_out.setObjectName("button_zoom_out") self.gridLayout.addWidget(self.button_zoom_out, 0, 1, 0, 1) self.button_edit_xml = QPushButton(self.centralwidget) self.button_edit_xml.setObjectName("button_edit_xml") self.button_edit_base_xml = QPushButton(self.centralwidget) self.button_edit_base_xml.setObjectName("button_edit_base_xml") self.verticalLayout.addLayout(self.gridLayout) self.verticalLayout.addWidget(self.button_edit_xml) self.verticalLayout.addWidget(self.button_edit_base_xml) spacerItem1 = QSpacerItem(10, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.verticalLayout.addItem(spacerItem1) self.verticalLayout_2 = QVBoxLayout() self.verticalLayout_2.setObjectName("verticalLayout_2") self.lineedit_angle = QLineEdit(self.centralwidget) self.lineedit_angle.setObjectName("lineedit_angle") self.lineedit_angle.setPlaceholderText("Angle") self.label_object_id = QLabel(self.centralwidget) self.label_object_id.setObjectName("label_object_id") #TextSelectableByCursor self.label_position = QLabel(self.centralwidget) self.label_position.setObjectName("label_position") self.label_model_name = QLabel(self.centralwidget) self.label_model_name.setObjectName("label_model_name") self.label_4 = QLabel(self.centralwidget) self.label_4.setObjectName("label_4") self.label_5 = QLabel(self.centralwidget) self.label_5.setObjectName("label_5") for label in (self.label_object_id, self.label_position, self.label_model_name, self.label_4, self.label_5): label.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse) self.verticalLayout_2.addWidget(self.lineedit_angle) self.verticalLayout_2.addWidget(self.label_object_id) self.verticalLayout_2.addWidget(self.label_position) self.verticalLayout_2.addWidget(self.label_model_name) self.verticalLayout_2.addWidget(self.label_4) self.verticalLayout_2.addWidget(self.label_5) self.verticalLayout.addLayout(self.verticalLayout_2) self.horizontalLayout.addWidget(self.vertLayoutWidget) self.menubar = QMenuBar(MainWindow) self.menubar.setGeometry(QRect(0, 0, 820, 29)) self.menubar.setObjectName("menubar") self.file_menu = QMenu(self.menubar) self.file_menu.setObjectName("menuLoad") self.file_load_action = QAction("Load", self) self.file_load_action.triggered.connect(self.button_load_level) self.file_menu.addAction(self.file_load_action) self.file_save_action = QAction("Save", self) self.file_save_action.triggered.connect(self.button_save_level) self.file_menu.addAction(self.file_save_action) self.visibility_menu = MenuDontClose(self.menubar)#QMenu(self.menubar) self.visibility_menu.setObjectName("visibility") #self.visibility_menu.addAction(self.toggle_action) self.visibility_actions = [] self.terrain_menu = QMenu(self.menubar) self.terrain_menu.setObjectName("terrain") self.terrain_load_action = QAction("Load Terrain", self) self.terrain_load_action.triggered.connect(self.button_terrain_load_action) self.terrain_menu.addAction(self.terrain_load_action) self.terrain_display_actions = [] self.setup_terrain_display_toggles() #self.menuLoad_2 = QMenu(self.menubar) #self.menuLoad_2.setObjectName("menuLoad_2") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.menubar.addAction(self.file_menu.menuAction()) #self.menubar.addAction(self.menuLoad_2.menuAction()) self.menubar.addAction(self.visibility_menu.menuAction()) self.menubar.addAction(self.terrain_menu.menuAction()) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) def make_terrain_toggle(self, show_mode): def terraintoggle(toggled): print("I am", show_mode, "and I was pressed") if toggled is True: for action, toggle, mode in self.terrain_display_actions: if mode != show_mode: action.setChecked(False) self.bw_map_screen.set_show_terrain_mode(show_mode) elif toggled is False: self.bw_map_screen.set_show_terrain_mode(SHOW_TERRAIN_NO_TERRAIN) else: print("This shouldn't be possible", toggled, type(toggled)) self.bw_map_screen.update() return terraintoggle def setup_terrain_display_toggles(self): for mode, name in ((SHOW_TERRAIN_REGULAR, "Show Heightmap"), (SHOW_TERRAIN_LIGHT, "Show Lightmap")): toggle = self.make_terrain_toggle(mode) toggle_action = QAction(name, self) toggle_action.setCheckable(True) if mode == SHOW_TERRAIN_REGULAR: toggle_action.setChecked(True) else: toggle_action.setChecked(False) toggle_action.triggered.connect(toggle) self.terrain_menu.addAction(toggle_action) self.terrain_display_actions.append((toggle_action, toggle, mode)) def clear_terrain_toggles(self): try: for action, func, mode in self.terrain_display_actions: self.terrain_menu.removeAction(action) self.terrain_display_actions = [] except: traceback.print_exc() def make_toggle_function(self, objtype): def toggle(toggled): print("i was pressed") my_type = copy(objtype) self.types_visible[my_type] = toggled self.bw_map_screen.set_visibility(self.types_visible) self.bw_map_screen.update() return toggle def setup_visibility_toggles(self): for objtype in sorted(self.level.objtypes_with_positions): toggle = self.make_toggle_function(objtype) toggle_action = QAction(copy(objtype), self) toggle_action.setCheckable(True) toggle_action.setChecked(True) toggle_action.triggered.connect(toggle) self.types_visible[objtype] = True self.visibility_menu.addAction(toggle_action) self.visibility_actions.append((toggle_action, toggle)) toggle_all = QAction("Toggle All", self) toggle_all.triggered.connect(self.toggle_visiblity_all) self.visibility_menu.addAction(toggle_all) self.visibility_actions.append((toggle_all, self.toggle_visiblity_all)) def toggle_visiblity_all(self): for action, func in self.visibility_actions: if action.isCheckable(): objtype = action.text() toggle = self.types_visible[objtype] self.types_visible[objtype] = not toggle action.setChecked(not toggle) self.bw_map_screen.set_visibility(self.types_visible) self.bw_map_screen.update() def clear_visibility_toggles(self): try: for action, func in self.visibility_actions: self.visibility_menu.removeAction(action) self.visibility_actions = [] self.types_visible = {} except: traceback.print_exc() def retranslateUi(self, MainWindow): _translate = QCoreApplication.translate self.button_clone_entity.setText(_translate("MainWindow", "Clone Entity")) self.button_remove_entity.setText(_translate("MainWindow", "Delete Entity")) self.button_move_entity.setText(_translate("MainWindow", "Move Entity")) self.button_zoom_in.setText(_translate("MainWindow", "Zoom In")) self.button_zoom_out.setText(_translate("MainWindow", "Zoom Out")) self.button_show_passengers.setText(_translate("MainWindow", "Show Passengers")) self.button_edit_xml.setText("Edit Object XML") self.button_edit_base_xml.setText("Edit Base Object XML") self.label_model_name.setText(_translate("MainWindow", "TextLabel1")) self.label_object_id.setText(_translate("MainWindow", "TextLabel2")) self.label_position.setText(_translate("MainWindow", "TextLabel3")) self.label_4.setText(_translate("MainWindow", "TextLabel4")) self.label_5.setText(_translate("MainWindow", "TextLabel5")) self.file_menu.setTitle(_translate("MainWindow", "File")) self.visibility_menu.setTitle(_translate("MainWindow", "Visibility")) self.terrain_menu.setTitle("Terrain")
class PreferencesPanel(QDialog): def __init__(self, parent, app): # The flags we pass are that so we don't get the "What's this" button in the title bar QDialog.__init__(self, parent, Qt.WindowTitleHint | Qt.WindowSystemMenuHint) self.app = app self._setupUi() self.dateFormatEdit.editingFinished.connect(self.dateFormatEdited) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) def _setupUi(self): self.setWindowTitle(tr("Preferences")) self.resize(332, 170) self.verticalLayout = QVBoxLayout(self) self.formLayout = QFormLayout() self.autoSaveIntervalSpinBox = QSpinBox(self) self.autoSaveIntervalSpinBox.setMaximumSize(QSize(70, 0xffffff)) self.label_5 = QLabel(tr("minute(s) (0 for none)"), self) self.formLayout.addRow( tr("Auto-save interval:"), horizontalWrap([self.autoSaveIntervalSpinBox, self.label_5]) ) self.dateFormatEdit = QLineEdit(self) self.dateFormatEdit.setMaximumSize(QSize(140, 0xffffff)) self.formLayout.addRow(tr("Date format:"), self.dateFormatEdit) self.fontSizeSpinBox = QSpinBox() self.fontSizeSpinBox.setMinimum(5) self.fontSizeSpinBox.setMaximumSize(QSize(70, 0xffffff)) self.formLayout.addRow(tr("Font size:"), self.fontSizeSpinBox) self.languageComboBox = QComboBox(self) LANGNAMES = get_langnames() for lang in SUPPORTED_LANGUAGES: self.languageComboBox.addItem(LANGNAMES[lang]) self.languageComboBox.setMaximumSize(QSize(140, 0xffffff)) self.formLayout.addRow(tr("Language:"), self.languageComboBox) self.verticalLayout.addLayout(self.formLayout) self.scopeDialogCheckBox = QCheckBox(tr("Show scope dialog when modifying a scheduled transaction"), self) self.verticalLayout.addWidget(self.scopeDialogCheckBox) self.autoDecimalPlaceCheckBox = QCheckBox(tr("Automatically place decimals when typing"), self) self.verticalLayout.addWidget(self.autoDecimalPlaceCheckBox) self.debugModeCheckBox = QCheckBox(tr("Debug mode (restart required)"), self) self.verticalLayout.addWidget(self.debugModeCheckBox) self.verticalLayout.addItem(verticalSpacer()) self.buttonBox = QDialogButtonBox(self) self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel|QDialogButtonBox.Ok) self.verticalLayout.addWidget(self.buttonBox) def load(self): appm = self.app.model self.autoSaveIntervalSpinBox.setValue(appm.autosave_interval) self.dateFormatEdit.setText(self.app.prefs.dateFormat) self.fontSizeSpinBox.setValue(self.app.prefs.tableFontSize) self.scopeDialogCheckBox.setChecked(appm.show_schedule_scope_dialog) self.autoDecimalPlaceCheckBox.setChecked(appm.auto_decimal_place) self.debugModeCheckBox.setChecked(self.app.prefs.debugMode) try: langindex = SUPPORTED_LANGUAGES.index(self.app.prefs.language) except ValueError: langindex = 0 self.languageComboBox.setCurrentIndex(langindex) def save(self): restartRequired = False appm = self.app.model appm.autosave_interval = self.autoSaveIntervalSpinBox.value() if self.dateFormatEdit.text() != self.app.prefs.dateFormat: restartRequired = True self.app.prefs.dateFormat = self.dateFormatEdit.text() self.app.prefs.tableFontSize = self.fontSizeSpinBox.value() appm.show_schedule_scope_dialog = self.scopeDialogCheckBox.isChecked() appm.auto_decimal_place = self.autoDecimalPlaceCheckBox.isChecked() self.app.prefs.debugMode = self.debugModeCheckBox.isChecked() lang = SUPPORTED_LANGUAGES[self.languageComboBox.currentIndex()] oldlang = self.app.prefs.language if oldlang not in SUPPORTED_LANGUAGES: oldlang = 'en' if lang != oldlang: restartRequired = True self.app.prefs.language = lang if restartRequired: QMessageBox.information(self, "", tr("moneyGuru has to restart for these changes to take effect")) #--- Signals def dateFormatEdited(self): self.dateFormatEdit.setText(clean_format(self.dateFormatEdit.text()))
class EditWindow(QWidget): """ Window for adding reminders. Useful attributes ----------------- parentWindow : MainWindow object Parent of the window. taskArea : QScrollArea object Scroll area of window. rows : list of dictionaries Element of rows is a dictionary: {'date', 'text', 'edit', 'del'}. 'date' and 'text' are QLabels, 'edit' and 'del' are QPushButtons. Such dictionary represents one element from tasks list. grid : QGridLayout object Layout of objects in QScrollArea. activeTasks : list List of visible tasks in grid. filter : QHBoxLayout object Layout of filter widgets. (date|text)Field : QLineEdit object Filter widgets. """ def __init__(self, parent=None): super().__init__() self.parentWindow = parent self.parentWindow.editActive = True self.activeTasks = tasks self.dateFieldText = '' self.textFieldText = '' self.initUI() def initUI(self): """ Init user interface. """ # use QVBoxLayout to store two layouts vertically self.vl = QVBoxLayout() # widget for scrollArea self.topWidget = QWidget() self.grid = QGridLayout() self.topWidget.setLayout(self.grid) self.vl.addWidget(self.topWidget) # layout for filter self.filter = QHBoxLayout() # draw filter widgets self.drawFilter() spacer = QSpacerItem(10, 0, vPolicy=QSizePolicy.MinimumExpanding) self.vl.addItem(spacer) self.vl.addLayout(self.filter) self.setLayout(self.vl) self.rows = [] self.taskArea = QScrollArea(self) self.taskArea.setWidget(self.topWidget) self.taskArea.setWidgetResizable(True) self.taskArea.resize(500, 350) self.resize(500, 395) self.setMinimumSize(460, 90) self.filterApply() self.show() self.move(QApplication.desktop().screen().rect().center() - self.rect().center()) self.setWindowTitle(conf.lang.EDIT_TITLE) iconEdit = Icon(byte=icons.edit).convertToIcon().getIcon() self.setWindowIcon(iconEdit) def drawFilter(self): """ Draws filter widgets. """ clearLayout(self.filter) self.hideBtn = QPushButton() if conf.filter: self.hideBtn.setText(conf.lang.VISIBLE_F) self.hideBtn.setFixedSize(23, 23) self.vl.setContentsMargins(11, 11, 11, 11) else: self.hideBtn.setText(conf.lang.HIDDEN_F) self.hideBtn.setFixedSize(23, 15) self.vl.setContentsMargins(0, 0, 0, 0) self.hideBtn.clicked.connect(self.inverseFilter) self.filter.addWidget(self.hideBtn) if conf.filter: filterLbl = QLabel(conf.lang.FILTER) filterLbl.setStyleSheet('QLabel {' \ 'border-width: 0 1px 0 0;' \ 'border-style: solid;' \ 'border-color: black;' \ 'margin: 0 5px 0 0;' \ '}') self.filter.addWidget(filterLbl) dateLbl = QLabel(conf.lang.DATE_F) self.filter.addWidget(dateLbl) self.dateField = QLineEdit() self.dateField.setText(self.dateFieldText) self.filter.addWidget(self.dateField) textLbl = QLabel(conf.lang.TEXT_F) self.filter.addWidget(textLbl) self.textField = QLineEdit() self.textField.setText(self.textFieldText) self.filter.addWidget(self.textField) self.dateField.textChanged.connect(self.filterApply) self.textField.textChanged.connect(self.filterApply) def inverseFilter(self): """ Change state of filter. """ conf.filter = not conf.filter rewriteConfig() if not conf.filter: self.dateFieldText = self.dateField.text() self.textFieldText = self.textField.text() self.drawFilter() self.resizeEvent(QResizeEvent(QSize(self.width(), self.height()), QSize(self.width(), self.height()))) def fill(self): """ Fill self.taskArea by items that represens tasks. """ # delete items from self.grid clearLayout(self.grid) aTasks = self.activeTasks self.rows = [{} for i in range(len(aTasks))] if len(aTasks) == 0: noLbl = QLabel(conf.lang.NO_TASKS) noLbl.setAlignment(Qt.AlignCenter) self.grid.addWidget(noLbl, 0, 0, 1, 5) else: for i in range(len(aTasks)): datetime = ' '.join((dateToStr(aTasks[i].getDateTime())['date'], dateToStr(aTasks[i].getDateTime())['time'])) # replace newlines and tabs in text text = aTasks[i].text.replace('\n', ' ').replace('\t', ' ') row = {} row['date'] = QLabel(datetime) row['text'] = QLabel() # change label's resizeEvent # with passing QLabel and text row['text'].resizeEvent = \ lambda evt, lbl=row['text'], txt=text: \ self.labelResize(lbl, evt, txt) row['edit'] = QPushButton(conf.lang.EDIT) row['del'] = QPushButton(conf.lang.DELETE) row['edit'].setToolTip(conf.lang.EDIT_TOOLTIP_TEXT) row['del'].setToolTip(conf.lang.DELETE_TOOLTIP_TEXT) # pass k=i to lambda function to save value of i row['edit'].clicked.connect(lambda checked, k=i: self.edit(k)) row['del'].clicked.connect(lambda checked, k=i: self.delete(k)) self.rows[i] = row self.grid.addWidget(self.rows[i]['date'], i, 0) self.grid.addWidget(self.rows[i]['text'], i, 1, 1, 2) self.grid.addWidget(self.rows[i]['edit'], i, 3) self.grid.addWidget(self.rows[i]['del'], i, 4) # add spacer to pin rows to window's top side spacer = QSpacerItem(10, 0, vPolicy=QSizePolicy.MinimumExpanding) self.grid.addItem(spacer, len(aTasks), 0, 1, 5) self.grid.setColumnMinimumWidth(0, 100) self.grid.setColumnMinimumWidth(3, 80) self.grid.setColumnMinimumWidth(4, 80) for i in range(self.grid.columnCount()): self.grid.setColumnStretch(i, 0) self.grid.setColumnStretch(1, 1) def labelResize(self, label, event, text): """ Change label's text due to its size. """ width = self.taskArea.width() - 320 # if get width from event: width = event.size().width() # resizing will stop when full text is shown in label metrics = QFontMetrics(label.font()) ellipsis = metrics.elidedText(text, Qt.ElideRight, width) label.setText(ellipsis) def filterApply(self): """ Selects tasks to be shown. """ if conf.filter: date = self.dateField.text() text = self.textField.text().replace('\n', ' ').replace('\t', ' ') text = text.lower() else: date = '' text = '' aTasks = [] for i in tasks: datetime = ' '.join((dateToStr(i.getDateTime())['date'], dateToStr(i.getDateTime())['time'])) tasktext = i.text.replace('\n', ' ').replace('\t', ' ') tasktext = tasktext.lower() if datetime.find(date) > -1 and tasktext.find(text) > -1: aTasks.append(i) self.activeTasks = aTasks self.fill() def edit(self, index): """ Open addWindow with selected task. """ self.parentWindow.addActive = True self.parentWindow.showWindow('addAction') addWindow = self.parentWindow.addWindow addWindow.dateEdit.setText(dateToStr(tasks[index]. getDateTime())['date']) addWindow.timeEdit.setText(dateToStr(tasks[index]. getDateTime())['time']) addWindow.textEdit.setText(tasks[index].text) addWindow.parentWindow = self # pass index parameter to notice it in addWindow addWindow.index = index self.hide() def delete(self, index): """ Delete selected reminder from tasks list. """ entry = tasks[index] tasks.remove(entry) rewrite() self.filterApply() def resizeEvent(self, event): """ Resize taskArea due to size of window. """ width = event.size().width() height = self.size().height() if conf.filter: self.taskArea.resize(width, height - 45) else: self.taskArea.resize(width, height - 15) def closeEvent(self, event): """ Closes window. """ self.parentWindow.editActive = False event.ignore() self.hide()
class FileWatch(SimpleBlackbox): author = "DrLuke" name = "Filewatch" modulename = "drluke.builtin.filewatch" Category = ["Builtin"] placeable = True implementation = FileWatchImplementation def __init__(self, *args, **kwargs): super(FileWatch, self).__init__(*args, **kwargs) self.filePath = "" self.lastEdited = 0 self.fileContent = "" self.propertiesWidget = QWidget() self.vlayout = QVBoxLayout() self.lineEdit = QLineEdit() self.lineEdit.textChanged.connect(self.lineEditTextChanges) self.vlayout.addWidget(self.lineEdit) self.vlayout.addItem(QSpacerItem(40, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)) self.propertiesWidget.setLayout(self.vlayout) self.timer = QTimer() self.timer.timeout.connect(self.checkFileChange) self.timer.start(200) def getPropertiesWidget(self): return self.propertiesWidget def lineEditTextChanges(self, text): self.filePath = text self.checkFileChange() def defineIO(self): self.addOutput(bool, "change", "File Changed") self.addOutput(str, "file", "File content") def checkFileChange(self): if os.path.exists(self.filePath) and os.path.isfile(self.filePath): if os.path.getmtime(self.filePath) > self.lastEdited: self.lastEdited = os.path.getmtime(self.filePath) with open(self.filePath, "r") as f: self.fileContent = f.read() self.sendDataToImplementations({"filecontent": self.fileContent}) else: self.lastEdited = 0 def serialize(self): return {"filepath": self.filePath} def deserialize(self, data): if "filepath" in data: self.filePath = data["filepath"] self.checkFileChange()
class ConfigurationWidget(QWidget): """ Class implementing a dialog for the configuration of eric6. @signal preferencesChanged() emitted after settings have been changed @signal masterPasswordChanged(str, str) emitted after the master password has been changed with the old and the new password @signal accepted() emitted to indicate acceptance of the changes @signal rejected() emitted to indicate rejection of the changes """ preferencesChanged = pyqtSignal() masterPasswordChanged = pyqtSignal(str, str) accepted = pyqtSignal() rejected = pyqtSignal() DefaultMode = 0 HelpBrowserMode = 1 TrayStarterMode = 2 HexEditorMode = 3 def __init__(self, parent=None, fromEric=True, displayMode=DefaultMode, expandedEntries=[]): """ Constructor @param parent The parent widget of this dialog. (QWidget) @keyparam fromEric flag indicating a dialog generation from within the eric6 ide (boolean) @keyparam displayMode mode of the configuration dialog (DefaultMode, HelpBrowserMode, TrayStarterMode, HexEditorMode) @exception RuntimeError raised to indicate an invalid dialog mode @keyparam expandedEntries list of entries to be shown expanded (list of strings) """ assert displayMode in ( ConfigurationWidget.DefaultMode, ConfigurationWidget.HelpBrowserMode, ConfigurationWidget.TrayStarterMode, ConfigurationWidget.HexEditorMode, ) super(ConfigurationWidget, self).__init__(parent) self.fromEric = fromEric self.displayMode = displayMode self.__setupUi() self.itmDict = {} if not fromEric: from PluginManager.PluginManager import PluginManager try: self.pluginManager = e5App().getObject("PluginManager") except KeyError: self.pluginManager = PluginManager(self) e5App().registerObject("PluginManager", self.pluginManager) if displayMode == ConfigurationWidget.DefaultMode: self.configItems = { # key : [display string, pixmap name, dialog module name or # page creation function, parent key, # reference to configuration page (must always be last)] # The dialog module must have the module function 'create' to # create the configuration page. This must have the method # 'save' to save the settings. "applicationPage": [self.tr("Application"), "preferences-application.png", "ApplicationPage", None, None], "cooperationPage": [self.tr("Cooperation"), "preferences-cooperation.png", "CooperationPage", None, None], "corbaPage": [self.tr("CORBA"), "preferences-orbit.png", "CorbaPage", None, None], "emailPage": [self.tr("Email"), "preferences-mail_generic.png", "EmailPage", None, None], "graphicsPage": [self.tr("Graphics"), "preferences-graphics.png", "GraphicsPage", None, None], "hexEditorPage": [self.tr("Hex Editor"), "hexEditor.png", "HexEditorPage", None, None], "iconsPage": [self.tr("Icons"), "preferences-icons.png", "IconsPage", None, None], "ircPage": [self.tr("IRC"), "irc.png", "IrcPage", None, None], "logViewerPage": [self.tr("Log-Viewer"), "preferences-logviewer.png", "LogViewerPage", None, None], "mimeTypesPage": [self.tr("Mimetypes"), "preferences-mimetypes.png", "MimeTypesPage", None, None], "networkPage": [self.tr("Network"), "preferences-network.png", "NetworkPage", None, None], "notificationsPage": [self.tr("Notifications"), "preferences-notifications.png", "NotificationsPage", None, None], "pluginManagerPage": [self.tr("Plugin Manager"), "preferences-pluginmanager.png", "PluginManagerPage", None, None], "printerPage": [self.tr("Printer"), "preferences-printer.png", "PrinterPage", None, None], "pythonPage": [self.tr("Python"), "preferences-python.png", "PythonPage", None, None], "qtPage": [self.tr("Qt"), "preferences-qtlogo.png", "QtPage", None, None], "securityPage": [self.tr("Security"), "preferences-security.png", "SecurityPage", None, None], "shellPage": [self.tr("Shell"), "preferences-shell.png", "ShellPage", None, None], "tasksPage": [self.tr("Tasks"), "task.png", "TasksPage", None, None], "templatesPage": [self.tr("Templates"), "preferences-template.png", "TemplatesPage", None, None], "trayStarterPage": [self.tr("Tray Starter"), "erict.png", "TrayStarterPage", None, None], "vcsPage": [self.tr("Version Control Systems"), "preferences-vcs.png", "VcsPage", None, None], "0debuggerPage": [self.tr("Debugger"), "preferences-debugger.png", None, None, None], "debuggerGeneralPage": [self.tr("General"), "preferences-debugger.png", "DebuggerGeneralPage", "0debuggerPage", None], "debuggerPythonPage": [self.tr("Python"), "preferences-pyDebugger.png", "DebuggerPythonPage", "0debuggerPage", None], "debuggerPython3Page": [self.tr("Python3"), "preferences-pyDebugger.png", "DebuggerPython3Page", "0debuggerPage", None], "0editorPage": [self.tr("Editor"), "preferences-editor.png", None, None, None], "editorAPIsPage": [self.tr("APIs"), "preferences-api.png", "EditorAPIsPage", "0editorPage", None], "editorAutocompletionPage": [self.tr("Autocompletion"), "preferences-autocompletion.png", "EditorAutocompletionPage", "0editorPage", None], "editorAutocompletionQScintillaPage": [self.tr("QScintilla"), "qscintilla.png", "EditorAutocompletionQScintillaPage", "editorAutocompletionPage", None], "editorCalltipsPage": [self.tr("Calltips"), "preferences-calltips.png", "EditorCalltipsPage", "0editorPage", None], "editorCalltipsQScintillaPage": [self.tr("QScintilla"), "qscintilla.png", "EditorCalltipsQScintillaPage", "editorCalltipsPage", None], "editorGeneralPage": [self.tr("General"), "preferences-general.png", "EditorGeneralPage", "0editorPage", None], "editorFilePage": [self.tr("Filehandling"), "preferences-filehandling.png", "EditorFilePage", "0editorPage", None], "editorSearchPage": [self.tr("Searching"), "preferences-search.png", "EditorSearchPage", "0editorPage", None], "editorSpellCheckingPage": [self.tr("Spell checking"), "preferences-spellchecking.png", "EditorSpellCheckingPage", "0editorPage", None], "editorStylesPage": [self.tr("Style"), "preferences-styles.png", "EditorStylesPage", "0editorPage", None], "editorSyntaxPage": [self.tr("Code Checkers"), "preferences-debugger.png", "EditorSyntaxPage", "0editorPage", None], "editorTypingPage": [self.tr("Typing"), "preferences-typing.png", "EditorTypingPage", "0editorPage", None], "editorExportersPage": [self.tr("Exporters"), "preferences-exporters.png", "EditorExportersPage", "0editorPage", None], "1editorLexerPage": [self.tr("Highlighters"), "preferences-highlighting-styles.png", None, "0editorPage", None], "editorHighlightersPage": [self.tr("Filetype Associations"), "preferences-highlighter-association.png", "EditorHighlightersPage", "1editorLexerPage", None], "editorHighlightingStylesPage": [self.tr("Styles"), "preferences-highlighting-styles.png", "EditorHighlightingStylesPage", "1editorLexerPage", None], "editorKeywordsPage": [self.tr("Keywords"), "preferences-keywords.png", "EditorKeywordsPage", "1editorLexerPage", None], "editorPropertiesPage": [self.tr("Properties"), "preferences-properties.png", "EditorPropertiesPage", "1editorLexerPage", None], "1editorMouseClickHandlers": [self.tr("Mouse Click Handlers"), "preferences-mouse-click-handler.png", "EditorMouseClickHandlerPage", "0editorPage", None], "0helpPage": [self.tr("Help"), "preferences-help.png", None, None, None], "helpDocumentationPage": [self.tr("Help Documentation"), "preferences-helpdocumentation.png", "HelpDocumentationPage", "0helpPage", None], "helpViewersPage": [self.tr("Help Viewers"), "preferences-helpviewers.png", "HelpViewersPage", "0helpPage", None], "0projectPage": [self.tr("Project"), "preferences-project.png", None, None, None], "projectBrowserPage": [self.tr("Project Viewer"), "preferences-project.png", "ProjectBrowserPage", "0projectPage", None], "projectPage": [self.tr("Project"), "preferences-project.png", "ProjectPage", "0projectPage", None], "multiProjectPage": [self.tr("Multiproject"), "preferences-multiproject.png", "MultiProjectPage", "0projectPage", None], "0interfacePage": [self.tr("Interface"), "preferences-interface.png", None, None, None], "interfacePage": [self.tr("Interface"), "preferences-interface.png", "InterfacePage", "0interfacePage", None], "viewmanagerPage": [self.tr("Viewmanager"), "preferences-viewmanager.png", "ViewmanagerPage", "0interfacePage", None], } try: from PyQt5 import QtWebKit # __IGNORE_WARNING__ self.configItems.update({ "helpAppearancePage": [self.tr("Appearance"), "preferences-styles.png", "HelpAppearancePage", "0helpPage", None], "helpFlashCookieManagerPage": [self.tr("Flash Cookie Manager"), "flashCookie16.png", "HelpFlashCookieManagerPage", "0helpPage", None], "helpVirusTotalPage": [self.tr("VirusTotal Interface"), "virustotal.png", "HelpVirusTotalPage", "0helpPage", None], "helpWebBrowserPage": [self.tr("eric6 Web Browser"), "ericWeb.png", "HelpWebBrowserPage", "0helpPage", None], }) except ImportError: pass self.configItems.update( e5App().getObject("PluginManager").getPluginConfigData()) elif displayMode == ConfigurationWidget.HelpBrowserMode: self.configItems = { # key : [display string, pixmap name, dialog module name or # page creation function, parent key, # reference to configuration page (must always be last)] # The dialog module must have the module function 'create' to # create the configuration page. This must have the method # 'save' to save the settings. "interfacePage": [self.tr("Interface"), "preferences-interface.png", "HelpInterfacePage", None, None], "networkPage": [self.tr("Network"), "preferences-network.png", "NetworkPage", None, None], "printerPage": [self.tr("Printer"), "preferences-printer.png", "PrinterPage", None, None], "securityPage": [self.tr("Security"), "preferences-security.png", "SecurityPage", None, None], "0helpPage": [self.tr("Help"), "preferences-help.png", None, None, None], "helpDocumentationPage": [self.tr("Help Documentation"), "preferences-helpdocumentation.png", "HelpDocumentationPage", "0helpPage", None], } try: from PyQt5 import QtWebKit # __IGNORE_WARNING__ self.configItems.update({ "helpAppearancePage": [self.tr("Appearance"), "preferences-styles.png", "HelpAppearancePage", "0helpPage", None], "helpFlashCookieManagerPage": [self.tr("Flash Cookie Manager"), "flashCookie16.png", "HelpFlashCookieManagerPage", "0helpPage", None], "helpVirusTotalPage": [self.tr("VirusTotal Interface"), "virustotal.png", "HelpVirusTotalPage", "0helpPage", None], "helpWebBrowserPage": [self.tr("eric6 Web Browser"), "ericWeb.png", "HelpWebBrowserPage", "0helpPage", None], }) except ImportError: pass elif displayMode == ConfigurationWidget.TrayStarterMode: self.configItems = { # key : [display string, pixmap name, dialog module name or # page creation function, parent key, # reference to configuration page (must always be last)] # The dialog module must have the module function 'create' to # create the configuration page. This must have the method # 'save' to save the settings. "trayStarterPage": [self.tr("Tray Starter"), "erict.png", "TrayStarterPage", None, None], } elif displayMode == ConfigurationWidget.HexEditorMode: self.configItems = { # key : [display string, pixmap name, dialog module name or # page creation function, parent key, # reference to configuration page (must always be last)] # The dialog module must have the module function 'create' to # create the configuration page. This must have the method # 'save' to save the settings. "hexEditorPage": [self.tr("Hex Editor"), "hexEditor.png", "HexEditorPage", None, None], } else: raise RuntimeError("Illegal mode value: {0}".format(displayMode)) # generate the list entries self.__expandedEntries = [] for key in sorted(self.configItems.keys()): pageData = self.configItems[key] if pageData[3]: if pageData[3] in self.itmDict: pitm = self.itmDict[pageData[3]] # get the parent item else: continue else: pitm = self.configList self.itmDict[key] = ConfigurationPageItem(pitm, pageData[0], key, pageData[1]) self.itmDict[key].setData(0, Qt.UserRole, key) if (not self.fromEric or displayMode != ConfigurationWidget.DefaultMode or key in expandedEntries): self.itmDict[key].setExpanded(True) self.configList.sortByColumn(0, Qt.AscendingOrder) # set the initial size of the splitter self.configSplitter.setSizes([200, 600]) self.configList.itemActivated.connect(self.__showConfigurationPage) self.configList.itemClicked.connect(self.__showConfigurationPage) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.rejected) if displayMode in [ConfigurationWidget.HelpBrowserMode, ConfigurationWidget.TrayStarterMode, ConfigurationWidget.HexEditorMode]: self.configListSearch.hide() if displayMode not in [ConfigurationWidget.TrayStarterMode, ConfigurationWidget.HexEditorMode]: self.__initLexers() def accept(self): """ Public slot to accept the buttonBox accept signal. """ if not isMacPlatform(): wdg = self.focusWidget() if wdg == self.configList: return self.accepted.emit() def __setupUi(self): """ Private method to perform the general setup of the configuration widget. """ self.setObjectName("ConfigurationDialog") self.resize(900, 650) self.verticalLayout_2 = QVBoxLayout(self) self.verticalLayout_2.setSpacing(6) self.verticalLayout_2.setContentsMargins(6, 6, 6, 6) self.verticalLayout_2.setObjectName("verticalLayout_2") self.configSplitter = QSplitter(self) self.configSplitter.setOrientation(Qt.Horizontal) self.configSplitter.setObjectName("configSplitter") self.configListWidget = QWidget(self.configSplitter) self.leftVBoxLayout = QVBoxLayout(self.configListWidget) self.leftVBoxLayout.setContentsMargins(0, 0, 0, 0) self.leftVBoxLayout.setSpacing(0) self.leftVBoxLayout.setObjectName("leftVBoxLayout") self.configListSearch = E5ClearableLineEdit( self, self.tr("Enter search text...")) self.configListSearch.setObjectName("configListSearch") self.leftVBoxLayout.addWidget(self.configListSearch) self.configList = QTreeWidget() self.configList.setObjectName("configList") self.leftVBoxLayout.addWidget(self.configList) self.configListSearch.textChanged.connect(self.__searchTextChanged) self.scrollArea = QScrollArea(self.configSplitter) self.scrollArea.setFrameShape(QFrame.NoFrame) self.scrollArea.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.scrollArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.scrollArea.setWidgetResizable(False) self.scrollArea.setObjectName("scrollArea") self.configStack = QStackedWidget() self.configStack.setFrameShape(QFrame.Box) self.configStack.setFrameShadow(QFrame.Sunken) self.configStack.setObjectName("configStack") self.scrollArea.setWidget(self.configStack) self.emptyPage = QWidget() self.emptyPage.setGeometry(QRect(0, 0, 372, 591)) self.emptyPage.setObjectName("emptyPage") self.vboxlayout = QVBoxLayout(self.emptyPage) self.vboxlayout.setSpacing(6) self.vboxlayout.setContentsMargins(6, 6, 6, 6) self.vboxlayout.setObjectName("vboxlayout") spacerItem = QSpacerItem( 20, 20, QSizePolicy.Minimum, QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem) self.emptyPagePixmap = QLabel(self.emptyPage) self.emptyPagePixmap.setAlignment(Qt.AlignCenter) self.emptyPagePixmap.setObjectName("emptyPagePixmap") self.emptyPagePixmap.setPixmap( QPixmap(os.path.join(getConfig('ericPixDir'), 'eric.png'))) self.vboxlayout.addWidget(self.emptyPagePixmap) self.textLabel1 = QLabel(self.emptyPage) self.textLabel1.setAlignment(Qt.AlignCenter) self.textLabel1.setObjectName("textLabel1") self.vboxlayout.addWidget(self.textLabel1) spacerItem1 = QSpacerItem( 20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.vboxlayout.addItem(spacerItem1) self.configStack.addWidget(self.emptyPage) self.verticalLayout_2.addWidget(self.configSplitter) self.buttonBox = QDialogButtonBox(self) self.buttonBox.setOrientation(Qt.Horizontal) self.buttonBox.setStandardButtons( QDialogButtonBox.Apply | QDialogButtonBox.Cancel | QDialogButtonBox.Ok | QDialogButtonBox.Reset) self.buttonBox.setObjectName("buttonBox") if not self.fromEric and \ self.displayMode == ConfigurationWidget.DefaultMode: self.buttonBox.button(QDialogButtonBox.Apply).hide() self.buttonBox.button(QDialogButtonBox.Apply).setEnabled(False) self.buttonBox.button(QDialogButtonBox.Reset).setEnabled(False) self.verticalLayout_2.addWidget(self.buttonBox) self.setWindowTitle(self.tr("Preferences")) self.configList.header().hide() self.configList.header().setSortIndicator(0, Qt.AscendingOrder) self.configList.setSortingEnabled(True) self.textLabel1.setText( self.tr("Please select an entry of the list \n" "to display the configuration page.")) QMetaObject.connectSlotsByName(self) self.setTabOrder(self.configList, self.configStack) self.configStack.setCurrentWidget(self.emptyPage) self.configList.setFocus() def __searchTextChanged(self, text): """ Private slot to handle a change of the search text. @param text text to search for (string) """ self.__searchChildItems(self.configList.invisibleRootItem(), text) def __searchChildItems(self, parent, text): """ Private method to enable child items based on a search string. @param parent reference to the parent item (QTreeWidgetItem) @param text text to search for (string) @return flag indicating an enabled child item (boolean) """ childEnabled = False text = text.lower() for index in range(parent.childCount()): itm = parent.child(index) if itm.childCount() > 0: enable = self.__searchChildItems(itm, text) or \ text == "" or text in itm.text(0).lower() else: enable = text == "" or text in itm.text(0).lower() if enable: childEnabled = True itm.setDisabled(not enable) return childEnabled def __initLexers(self): """ Private method to initialize the dictionary of preferences lexers. """ import QScintilla.Lexers from .PreferencesLexer import PreferencesLexer, \ PreferencesLexerLanguageError self.lexers = {} for language in QScintilla.Lexers.getSupportedLanguages(): if language not in self.lexers: try: self.lexers[language] = PreferencesLexer(language, self) except PreferencesLexerLanguageError: pass def __importConfigurationPage(self, name): """ Private method to import a configuration page module. @param name name of the configuration page module (string) @return reference to the configuration page module """ modName = "Preferences.ConfigurationPages.{0}".format(name) try: mod = __import__(modName) components = modName.split('.') for comp in components[1:]: mod = getattr(mod, comp) return mod except ImportError: E5MessageBox.critical( self, self.tr("Configuration Page Error"), self.tr("""<p>The configuration page <b>{0}</b>""" """ could not be loaded.</p>""").format(name)) return None def __showConfigurationPage(self, itm, column): """ Private slot to show a selected configuration page. @param itm reference to the selected item (QTreeWidgetItem) @param column column that was selected (integer) (ignored) """ pageName = itm.getPageName() self.showConfigurationPageByName(pageName, setCurrent=False) def __initPage(self, pageData): """ Private method to initialize a configuration page. @param pageData data structure for the page to initialize @return reference to the initialized page """ page = None if isinstance(pageData[2], types.FunctionType): page = pageData[2](self) else: mod = self.__importConfigurationPage(pageData[2]) if mod: page = mod.create(self) if page is not None: self.configStack.addWidget(page) pageData[-1] = page try: page.setMode(self.displayMode) except AttributeError: pass return page def showConfigurationPageByName(self, pageName, setCurrent=True): """ Public slot to show a named configuration page. @param pageName name of the configuration page to show (string) @param setCurrent flag indicating to set the current item (boolean) """ if pageName == "empty" or pageName not in self.configItems: page = self.emptyPage else: pageData = self.configItems[pageName] if pageData[-1] is None and pageData[2] is not None: # the page was not loaded yet, create it page = self.__initPage(pageData) else: page = pageData[-1] if page is None: page = self.emptyPage elif setCurrent: items = self.configList.findItems( pageData[0], Qt.MatchFixedString | Qt.MatchRecursive) for item in items: if item.data(0, Qt.UserRole) == pageName: self.configList.setCurrentItem(item) self.configStack.setCurrentWidget(page) ssize = self.scrollArea.size() if self.scrollArea.horizontalScrollBar(): ssize.setHeight( ssize.height() - self.scrollArea.horizontalScrollBar().height() - 2) if self.scrollArea.verticalScrollBar(): ssize.setWidth( ssize.width() - self.scrollArea.verticalScrollBar().width() - 2) psize = page.minimumSizeHint() self.configStack.resize(max(ssize.width(), psize.width()), max(ssize.height(), psize.height())) if page != self.emptyPage: page.polishPage() self.buttonBox.button(QDialogButtonBox.Apply).setEnabled(True) self.buttonBox.button(QDialogButtonBox.Reset).setEnabled(True) else: self.buttonBox.button(QDialogButtonBox.Apply).setEnabled(False) self.buttonBox.button(QDialogButtonBox.Reset).setEnabled(False) # reset scrollbars for sb in [self.scrollArea.horizontalScrollBar(), self.scrollArea.verticalScrollBar()]: if sb: sb.setValue(0) self.__currentConfigurationPageName = pageName def getConfigurationPageName(self): """ Public method to get the page name of the current page. @return page name of the current page (string) """ return self.__currentConfigurationPageName def calledFromEric(self): """ Public method to check, if invoked from within eric. @return flag indicating invocation from within eric (boolean) """ return self.fromEric def getPage(self, pageName): """ Public method to get a reference to the named page. @param pageName name of the configuration page (string) @return reference to the page or None, indicating page was not loaded yet """ return self.configItems[pageName][-1] def getLexers(self): """ Public method to get a reference to the lexers dictionary. @return reference to the lexers dictionary """ return self.lexers def setPreferences(self): """ Public method called to store the selected values into the preferences storage. """ for key, pageData in list(self.configItems.items()): if pageData[-1]: pageData[-1].save() # page was loaded (and possibly modified) QApplication.processEvents() # ensure HMI is responsive def on_buttonBox_clicked(self, button): """ Private slot called by a button of the button box clicked. @param button button that was clicked (QAbstractButton) """ if button == self.buttonBox.button(QDialogButtonBox.Apply): self.on_applyButton_clicked() elif button == self.buttonBox.button(QDialogButtonBox.Reset): self.on_resetButton_clicked() @pyqtSlot() def on_applyButton_clicked(self): """ Private slot called to apply the settings of the current page. """ if self.configStack.currentWidget() != self.emptyPage: page = self.configStack.currentWidget() savedState = page.saveState() page.save() self.preferencesChanged.emit() if savedState is not None: page.setState(savedState) page.polishPage() @pyqtSlot() def on_resetButton_clicked(self): """ Private slot called to reset the settings of the current page. """ if self.configStack.currentWidget() != self.emptyPage: currentPage = self.configStack.currentWidget() savedState = currentPage.saveState() pageName = self.configList.currentItem().getPageName() self.configStack.removeWidget(currentPage) if pageName == "editorHighlightingStylesPage": self.__initLexers() self.configItems[pageName][-1] = None self.showConfigurationPageByName(pageName) if savedState is not None: self.configStack.currentWidget().setState(savedState) def getExpandedEntries(self): """ Public method to get a list of expanded entries. @return list of expanded entries (list of string) """ return self.__expandedEntries @pyqtSlot(QTreeWidgetItem) def on_configList_itemCollapsed(self, item): """ Private slot handling a list entry being collapsed. @param item reference to the collapsed item (QTreeWidgetItem) """ pageName = item.data(0, Qt.UserRole) if pageName in self.__expandedEntries: self.__expandedEntries.remove(pageName) @pyqtSlot(QTreeWidgetItem) def on_configList_itemExpanded(self, item): """ Private slot handling a list entry being expanded. @param item reference to the expanded item (QTreeWidgetItem) """ pageName = item.data(0, Qt.UserRole) if pageName not in self.__expandedEntries: self.__expandedEntries.append(pageName)