def _build_ui(self): hbox = qtwidgets.QHBoxLayout() hbox.addWidget(qtwidgets.QLabel('Find package build:')) self._edit = qtwidgets.QLineEdit() self._edit.setFont(_MONO_FONT_BOLD) self._edit.setPlaceholderText('Globbing pattern') self._edit.setFixedWidth(300) self._edit.returnPressed.connect(self.accept) hbox.addWidget(self._edit) self.setLayout(hbox)
def _build_ui(self): hbox = qtwidgets.QHBoxLayout() pixmap = qtgui.QPixmap(_ICON_PATH).scaled( 128, 128, qtcore.Qt.IgnoreAspectRatio, qtcore.Qt.SmoothTransformation) lbl = qtwidgets.QLabel() lbl.setPixmap(pixmap) hbox.addWidget(lbl) self.setLayout(hbox) vbox = qtwidgets.QVBoxLayout() lbl = qtwidgets.QLabel('YO Buildroot!') font = lbl.font() font.setPointSize(14) font.setItalic(True) font.setBold(True) lbl.setFont(font) vbox.addWidget(lbl) lbl = qtwidgets.QLabel('v{}'.format(yobr.__version__)) lbl.setStyleSheet('color: rgba(0, 0, 0, .6); font-style: italic;') vbox.addWidget(lbl) vbox.addWidget(qtwidgets.QLabel()) lbl = qtwidgets.QLabel( '<b>Author</b>: <a href="https://eepp.ca/">Philippe Proulx</a>') vbox.addWidget(lbl) lbl = qtwidgets.QLabel( '<b>Icon</b>: <i>srip</i> from <a href="https://www.flaticon.com/">www.flaticon.com</a>' ) vbox.addWidget(lbl) lbl = qtwidgets.QLabel( '<b>Website</b>: <a href="https://github.com/eepp/yobr">github.com/eepp/yobr</a>' ) vbox.addWidget(lbl) vbox.addStretch() hbox.addSpacing(10) hbox.addLayout(vbox)
def _build_ui(self): # whole widget's tooltip: name and version (if any) tooltip = self._pkg_build.info.name if self._pkg_build.info.version is not None: tooltip += ' {}'.format(self._pkg_build.info.version) self.setToolTip(tooltip) # background label (no text; just for the colour); assigning # this as its parent makes the label float under the other # widgets managed by this widget's layout self._bg_lbl = qtwidgets.QLabel('', self) self._bg_lbl.setSizePolicy(qtwidgets.QSizePolicy.Fixed, qtwidgets.QSizePolicy.Fixed) # horizontal box for name label and progress bar hbox = qtwidgets.QHBoxLayout() hbox.setSpacing(0) hbox.setContentsMargins(0, 0, 0, 0) # left padding hbox.addSpacing(5) # name label self._name_lbl = qtwidgets.QLabel(self._pkg_build.info.name) self._name_lbl.setFont(_MONO_FONT_BOLD) hbox.addWidget(self._name_lbl) hbox.addStretch() # progress bar self._pbar = _MinimalistProgressBar() self._pbar.setFixedSize(24, 8) # `+ 1` because we count this package build as its own # dependency so that, when all a package build's dependencies # are built, its state's progress bar is not complete self._pbar.setRange(0, len(self._pkg_build.info.dependencies) + 1) self._pbar.setValue(0) self._pbar.setTextVisible(False) hbox.addWidget(self._pbar) # right padding hbox.addSpacing(5) # set horizontal box as this widget's layout self.setLayout(hbox) # horizontal size policy is to ignore so that this widget takes # as much horizontal space as possible self.setSizePolicy(qtwidgets.QSizePolicy.Ignored, qtwidgets.QSizePolicy.Fixed) self.setFixedHeight(24)
def _reset_pkg_build_states(self, vbox, name, pkg_infos): # get vertical box layout's current items items = [] for i in range(vbox.count()): items.append(vbox.itemAt(i)) # remove items for item in items: vbox.removeItem(item) # we own `item` now: delete it later if item.layout() is not None: item.layout().deleteLater() if item.widget() is not None: item.widget().deleteLater() if len(pkg_infos) == 0: # nothing to show return # title vbox.addSpacing(12) text = '{} ({}):'.format(name, len(pkg_infos)) vbox.addWidget(qtwidgets.QLabel(text)) # create one package build state for each dependency (sorted by # name) for pkg_info in sorted(list(pkg_infos), key=lambda pi: pi.name): pkg_build = self._pkg_build_monitor.pkg_builds[pkg_info.name] pkg_build_state = _PkgBuildState(pkg_build, self._pkg_build_monitor) pkg_build_state.clicked.connect(self._pkg_build_state_clicked) vbox.addWidget(pkg_build_state)
def add_label(stage): lbl = qtwidgets.QLabel() font = qtgui.QFont(_MONO_FONT_BOLD) font.setPointSize(16) lbl.setFont(font) _set_build_stage_label(lbl, stage, _BUILD_STAGE_COLORS_BG) vbox.addWidget(lbl)
def toggleLoadLast(self): if G.loadLast is True: G.loadLast = False self.actionLoad_last.setCheckable(False) else: G.loadLast = True self.actionLoad_last.setCheckable(True) 'log.txt'(PyQt5.flush())
def create_pbar(max, fmt): pbar = qtwidgets.QProgressBar() pbar.setRange(0, max) pbar.setFormat(fmt) pbar.setValue(0) pbar.setFixedHeight(16) pbar.setStyleSheet('font-size: 10px; font-weight: bold;') return pbar
def _build_ui(self): # set window's title from application name self.setWindowTitle(self._app.applicationName()) # set icon self._set_icon() # main layout is a vertical box main_layout = qtwidgets.QVBoxLayout() w = qtwidgets.QWidget() w.setLayout(main_layout) self.setCentralWidget(w) # build menu bar, progress (top), and package build state grid self._build_ui_menu_bar() self._build_ui_progress_bars() main_layout.addWidget(self._built_pbar) main_layout.addWidget(self._installed_pbar) self._build_ui_pkg_build_state_grid() # wrap the grid within a scroll area scroll_area = qtwidgets.QScrollArea() scroll_area.setWidgetResizable(True) scroll_area.setWidget(self._pkg_build_state_grid) scroll_area.setMinimumWidth(300) # center of the window is the grid on the left and, possibly, # the details on the right hbox = qtwidgets.QHBoxLayout() hbox.addWidget(scroll_area) # build the details pane and add to center horizontal box self._build_ui_details() hbox.addWidget(self._details_scroll_area) main_layout.addLayout(hbox) # build status bar self._build_ui_status_bar()
def create_base_form(stage_lbl_attr, version_lbl_attr, is_virtual_lbl_attr): form = qtwidgets.QFormLayout() form.setContentsMargins(0, 0, 0, 0) form.setVerticalSpacing(2) form.setHorizontalSpacing(16) lbl = create_mono_label(True) setattr(self, stage_lbl_attr, lbl) form.addRow('Build stage:', lbl) lbl = create_mono_label() setattr(self, version_lbl_attr, lbl) form.addRow('Version:', lbl) lbl = create_mono_label() setattr(self, is_virtual_lbl_attr, lbl) form.addRow('Virtual?', lbl) return form
def _build_ui(self): def add_label(stage): lbl = qtwidgets.QLabel() font = qtgui.QFont(_MONO_FONT_BOLD) font.setPointSize(16) lbl.setFont(font) _set_build_stage_label(lbl, stage, _BUILD_STAGE_COLORS_BG) vbox.addWidget(lbl) vbox = qtwidgets.QVBoxLayout() add_label(yobr.br.PkgBuildStage.UNKNOWN) add_label(yobr.br.PkgBuildStage.DOWNLOADED) add_label(yobr.br.PkgBuildStage.EXTRACTED) add_label(yobr.br.PkgBuildStage.PATCHED) add_label(yobr.br.PkgBuildStage.CONFIGURED) add_label(yobr.br.PkgBuildStage.BUILT) add_label(yobr.br.PkgBuildStage.INSTALLED) self.setLayout(vbox)
def _build_ui_details(self): def pkg_build_state_details_clicked(pkg_build_state): # change globally selected package build state self._pkg_build_state_grid.selected_pkg_build = pkg_build_state.pkg_build self._details = _PkgBuildStateDetails(self._pkg_build_monitor) self._details.pkg_build_state_clicked.connect( pkg_build_state_details_clicked) # wrap into a scroll area self._details_scroll_area = qtwidgets.QScrollArea() self._details_scroll_area.setWidgetResizable(True) self._details_scroll_area.setWidget(self._details) # no horizontal scrollbar: too ugly self._details_scroll_area.setHorizontalScrollBarPolicy( qtcore.Qt.ScrollBarAlwaysOff) # this seems to be enough self._details_scroll_area.setFixedWidth(300) # initially invisible self._details_scroll_area.setVisible(False)
def lcdBostonNeed(self): self.lcdBostonNeed = PyQt5.QtWidgets(self)
def btnStart(self): self.btnStart = PyQt5.QtWidgets(self)
def lcdtimer(self): self.lcdtimer = PyQt5.QtWidgets(self)
def lcdTotalCustomer(self): self.lcdTotalCustomer = PyQt5.QtWidgets(self)
def lcdCustomerOut(self): self.lcdCustomerOut = PyQt5.QtWidgets(self)
def _build_ui(self): def create_mono_label(is_bold=False): lbl = qtwidgets.QLabel() lbl.setFont(_MONO_FONT_BOLD if is_bold else _MONO_FONT) return lbl # main layout is a vertical box vbox = qtwidgets.QVBoxLayout() # package's name self._name_lbl = create_mono_label(True) font = self._name_lbl.font() font.setPointSize(12) self._name_lbl.setFont(font) vbox.addWidget(self._name_lbl) vbox.addSpacing(12) def create_base_form(stage_lbl_attr, version_lbl_attr, is_virtual_lbl_attr): form = qtwidgets.QFormLayout() form.setContentsMargins(0, 0, 0, 0) form.setVerticalSpacing(2) form.setHorizontalSpacing(16) lbl = create_mono_label(True) setattr(self, stage_lbl_attr, lbl) form.addRow('Build stage:', lbl) lbl = create_mono_label() setattr(self, version_lbl_attr, lbl) form.addRow('Version:', lbl) lbl = create_mono_label() setattr(self, is_virtual_lbl_attr, lbl) form.addRow('Virtual?', lbl) return form # textual information (target) form = create_base_form('_target_stage_lbl', '_target_version_lbl', '_target_virtual_lbl') self._install_target_lbl = create_mono_label() form.addRow('Install (target)?', self._install_target_lbl) self._install_staging_lbl = create_mono_label() form.addRow('Install (staging)?', self._install_staging_lbl) self._install_images_lbl = create_mono_label() form.addRow('Install (images)?', self._install_images_lbl) self._target_info = qtwidgets.QWidget() self._target_info.setLayout(form) vbox.addWidget(self._target_info) # textual information (host) form = create_base_form('_host_stage_lbl', '_host_version_lbl', '_host_virtual_lbl') self._host_info = qtwidgets.QWidget() self._host_info.setLayout(form) vbox.addWidget(self._host_info) # dependencies and dependants are within their own vertical box # (empty for the moment) self._dependencies_vbox = qtwidgets.QVBoxLayout() vbox.addLayout(self._dependencies_vbox) self._dependants_vbox = qtwidgets.QVBoxLayout() vbox.addLayout(self._dependants_vbox) vbox.addStretch() # set main vertical box as this widget's layout self.setLayout(vbox)
def _build_ui_menu_bar(self): def add_refresh_interval_action(name, interval): action = menu.addAction('Refresh every {}'.format(name)) action.setCheckable(True) refresh_interval_action_group.addAction(action) action.triggered.connect( functools.partial(self._emit_refresh_interval_changed, interval)) return action def show_legend_window(checked): dlg = _BuildStageLegendDialog(self) dlg.exec() def show_about_window(checked): dlg = _AboutDialog(self) dlg.exec() def find_package(checked): dlg = _FindPkgBuildDialog(self) if dlg.exec() != qtwidgets.QDialog.Accepted: return pattern = dlg.pattern.strip() self._logger.debug( 'Searching for package build `{}`.'.format(pattern)) for pkg_build in sorted( self._pkg_build_monitor.pkg_builds.values(), key=lambda pb: pb.info.name): if fnmatch.fnmatch(pkg_build.info.name, pattern): self._pkg_build_state_grid.selected_pkg_build = pkg_build break # file menu menu = self.menuBar().addMenu('&File') action = menu.addAction('&Quit') action.setShortcut(qtgui.QKeySequence.Quit) action.triggered.connect(self._app.quit) # state menu menu = self.menuBar().addMenu('&State') self._refresh_action = menu.addAction('&Refresh now') self._refresh_action.setShortcut(qtgui.QKeySequence.Refresh) menu.addSeparator() refresh_interval_action_group = qtwidgets.QActionGroup(self) refresh_interval_action_group.setExclusive(True) action = add_refresh_interval_action('500 ms', 500) action = add_refresh_interval_action('second', 1000) action = add_refresh_interval_action('two seconds', 2000) action.setChecked(True) # default action = add_refresh_interval_action('three seconds', 3000) action = add_refresh_interval_action('five seconds', 5000) action = add_refresh_interval_action('ten seconds', 10000) action = add_refresh_interval_action('30 seconds', 30000) action = add_refresh_interval_action('minute', 60000) # find menu menu = self.menuBar().addMenu('&Find') action = menu.addAction('Find &package build...') action.setShortcut(qtgui.QKeySequence.Find) action.triggered.connect(find_package) # help menu menu = self.menuBar().addMenu('&Help') action = menu.addAction('Build stage &legend...') action.triggered.connect(show_legend_window) menu.addSeparator() action = menu.addAction('&About yobr...') action.triggered.connect(show_about_window)
def _build_ui_status_bar(self): self._status_bar = qtwidgets.QStatusBar() self.setStatusBar(self._status_bar)
def main(): # refresh timer timeout def refresh_timer_timeout(): logger.info('Updating package build monitor.') pkg_build_monitor.update() try: # create application app = qtwidgets.QApplication(sys.argv) app.setApplicationName('YO Buildroot!') app.setApplicationVersion(yobr.__version__) # setup signals _setup_signals() # parse and validate command-line arguments args = _parse_args(app) _validate_args(args) # configure logging logging.basicConfig( level=args.log_level, style='{', format='{asctime} [{name}] {{{levelname}}}: {message}') logger = logging.getLogger('main') # query Buildroot for package information logger.info('Starting application (v{}).'.format(yobr.__version__)) logger.info('Getting package information from `{}`.'.format( args.br_root_dir)) pkg_builds = yobr.br.pkg_builds_from_make(args.br_root_dir, args.br_build_dir) pkg_build_monitor = _PkgBuildMonitor(pkg_builds) if len(pkg_build_monitor.pkg_builds) == 0: # weird raise RuntimeError('No packages found!') logger.info('Watching {} packages:'.format( len(pkg_build_monitor.pkg_builds))) for pkg_build in sorted(pkg_build_monitor.pkg_builds.values(), key=lambda pb: pb.build_dir): logger.info(' `{}` ({} dependencies)'.format( pkg_build.build_dir, len(pkg_build.info.dependencies))) # create window logger.info('Starting UI.') w = _YoBrWindow(app, pkg_build_monitor) # connect "Refresh now" action w.refresh_action.triggered.connect(refresh_timer_timeout) # create refresh timer: initial interval is 2 s timer = qtcore.QTimer(app) timer.setInterval(2000) timer.timeout.connect(refresh_timer_timeout) # connect interval change signal w.refresh_interval_changed.connect(timer.setInterval) # start timer timer.start() # initial update pkg_build_monitor.update() # show window w.show() # we're done sys.exit(app.exec_()) except Exception as exc: _perror(str(exc)) sys.exit(1)
def lcdRenewable(self): self.lcdRenewable = PyQt5.QtWidgets(self)
def create_mono_label(is_bold=False): lbl = qtwidgets.QLabel() lbl.setFont(_MONO_FONT_BOLD if is_bold else _MONO_FONT) return lbl
def lcdPercentGreen(self): self.lcdPercentGreen = PyQt5.QtWidgets(self)
import sys import PyQt5 as PyQt #from PyQt5.QtWidgets import QApplication, QDialog from designs.index import index app = PyQt.QApplication(sys.argv) window = PyQt.QDialog() ui = index() ui.setupUi(window) window.show() sys.exit(app.exec_())