def setup_buttons(self): # TODO how to fix this bug? # shortcut in plugin conflicts with shortcut in mainwindow # QAction::eventFilter: Ambiguous shortcut overload: Ctrl+O openfile_btn = create_toolbutton(self, icon=ima.icon('fileopen'), tip=_('Open file'), shortcut="Ctrl+O", triggered=self.open_file) savefile_btn = create_toolbutton(self, icon=ima.icon('filesave'), tip=_('Save to new file'), shortcut="Ctrl+S", triggered=self.save_file) runfile_btn = create_toolbutton(self, icon=ima.icon('run_file'), tip=_('Run code in file'), triggered=self.run_file) run_btn = create_toolbutton(self, icon=ima.icon('run'), tip=_('Run code in view'), shortcut="Ctrl+R", triggered=self.emit_script) help_btn = create_toolbutton_help(self, triggered=self.show_help) buttons = (openfile_btn, savefile_btn, runfile_btn, run_btn, help_btn) return buttons
def setup_buttons(self): clear_btn = create_toolbutton(self, icon=ima.icon('clear_text'), tip=_('Clear text'), shortcut="Ctrl+L", triggered=self.textBrowser.clear) dummy_btn = create_toolbutton(self, icon=ima.icon('fromcursor'), tip=_('Do nothing')) help_btn = create_toolbutton_help(self, triggered=self.show_help) return clear_btn, dummy_btn, help_btn
def create_browsefile(self, text, option, default=NoDefault, tip=None, filters=None): widget = self.create_lineedit(text, option, default, alignment=Qt.Horizontal) for edit in self.lineedits: if widget.isAncestorOf(edit): break msg = _('Invalid file path') self.validate_data[edit] = (osp.isfile, msg) browse_btn = QPushButton(ima.icon('FileIcon'), '', self) browse_btn.setToolTip(_("Select file")) browse_btn.clicked.connect(lambda: self.select_file(edit, filters)) layout = QHBoxLayout() layout.addWidget(widget) layout.addWidget(browse_btn) layout.setContentsMargins(0, 0, 0, 0) browsefile = QWidget(self) browsefile.lineedit = widget browsefile.setLayout(layout) return browsefile
def create_browsefile(self, text, default=None, tip=None, filters=None, new=False): """Create browse file widget. :param text: key :type text: str :param default: default value :type default: str :param tip: tool tip :type tip: str :param filters: filters by filename extension :type filters: str :param new: select existing or create new file. :type new: bool :return: QWidget """ widget = self.create_lineedit(text, default=default, tip=tip) edit = widget.edit browse_btn = QPushButton(ima.icon('FileIcon'), '', self) browse_btn.setToolTip(_("Select file")) browse_btn.clicked.connect( lambda: self.select_file(edit, filters, new)) layout = QHBoxLayout() layout.addWidget(widget) layout.addWidget(browse_btn) layout.setContentsMargins(0, 0, 0, 0) browsefile = QWidget(self) browsefile.lineedit = widget browsefile.setLayout(layout) return browsefile
def create_grabob(self, text, default=None, tip=None, geom=None): """Create grab object widget. :param text: key :type text: str :param default: default value :type default: str :param tip: tool tip :type tip: str :param geom: geometry of the object to grab :type geom: list :return: QWidget """ widget = self.create_lineedit(text, default=default, tip=tip) edit = widget.edit browse_btn = QPushButton(ima.icon('grab_object'), '', self) browse_btn.setToolTip(_("Grab object from tree")) browse_btn.clicked.connect(lambda: self.grab_object(edit, geom)) layout = QHBoxLayout() layout.addWidget(widget) layout.addWidget(browse_btn) layout.setContentsMargins(0, 0, 0, 0) grabob = QWidget(self) grabob.lineedit = widget grabob.setLayout(layout) return grabob
def __init__(self, parent=None, objname=None): QDialog.__init__(self, parent) # If used for data object in tree, the main is the tree widget. self.parent = parent self.objname = objname # Widgets self.pages_widget = QStackedWidget() self.contents_widget = QListWidget() self.button_reset = QPushButton(_('Reset to defaults')) bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Apply | QDialogButtonBox.Cancel) self.apply_btn = bbox.button(QDialogButtonBox.Apply) # Widgets setup # Destroying the C++ object right after closing the dialog box, # otherwise it may be garbage-collected in another QThread # (e.g. the editor's analysis thread in Ezcad), thus leading to # a segmentation fault on UNIX or an application crash on Windows self.setAttribute(Qt.WA_DeleteOnClose) if self.objname is None: self.setWindowTitle(_('Preferences')) else: self.setWindowTitle(_('Preferences of ') + self.objname) self.setWindowIcon(ima.icon('configure')) self.contents_widget.setMovement(QListView.Static) self.contents_widget.setSpacing(1) self.contents_widget.setCurrentRow(0) # Layout hsplitter = QSplitter() hsplitter.addWidget(self.contents_widget) hsplitter.addWidget(self.pages_widget) hsplitter.setSizes([150,500]) btnlayout = QHBoxLayout() btnlayout.addWidget(self.button_reset) btnlayout.addStretch(1) btnlayout.addWidget(bbox) vlayout = QVBoxLayout() vlayout.addWidget(hsplitter) vlayout.addLayout(btnlayout) self.setLayout(vlayout) # Signals and slots self.pages_widget.currentChanged.connect(self.current_page_changed) self.contents_widget.currentRowChanged.connect( self.pages_widget.setCurrentIndex) bbox.accepted.connect(self.accept) bbox.rejected.connect(self.reject) bbox.clicked.connect(self.button_clicked) # Ensures that the config is present on ezcad first run CONF.set('main', 'interface_language', load_lang_conf())
def __init__(self, parent, project): super(ProjectPreferences, self).__init__() self._main = parent self._project = project self._project_preferences = [WorkspaceConfigPage] self.setWindowTitle(_("Project preferences")) self.setWindowIcon(ima.icon('configure')) self.setup_dialog()
def setup_buttons(self): hide_all_btn = create_toolbutton(self, icon=ima.icon('hide_all'), tip=_('Hide all'), shortcut="Ctrl+L", triggered=self.base.hide_all) self.pick_btn = create_toolbutton(self, icon=ima.icon('pick_mode'), tip=_('Pick mode'), shortcut="P", toggled=self.base.toggle_pick_mode) color_btn = create_toolbutton(self, icon=ima.icon('bkgd_color'), tip=_('Background color'), triggered=self.base.set_background_color) export_btn = create_toolbutton(self, icon=ima.icon('photo'), tip=_('Export canvas to picture'), triggered=self.base.export_canvas) help_btn = create_toolbutton_help(self, triggered=self.show_help) return (hide_all_btn, self.pick_btn, color_btn, export_btn, help_btn)
class WorkspaceConfigPage(ProjectConfigPage): CONF_SECTION = "workspace" NAME = _("General") ICON = ima.icon('genprefs') def setup_page(self): # --- Interface general_group = QGroupBox(_("TODO")) # --- Status bar sbar_group = QGroupBox(_("TODO")) # --- Path self.set_workdir = self.create_browsedir("Project working directory", 'project_working_directory') path_group = QGroupBox(_("Path")) path_layout = QVBoxLayout() path_layout.addWidget(self.set_workdir) path_group.setLayout(path_layout) tabs = QTabWidget() tabs.addTab(self.create_tab(path_group), _("Basic")) tabs.addTab(self.create_tab(general_group, sbar_group), _("Advanced Settings")) vlayout = QVBoxLayout() vlayout.addWidget(tabs) self.setLayout(vlayout) def apply_settings(self, options): """ Click apply button in configDialog, calls configPage.apply_changes, which saves the changes and calls configPage.apply_settings. """ workdir = self.set_workdir.lineedit.textbox.text() if not osp.isdir(workdir): QMessageBox.critical( self, _('Error'), 'The project work directory does not exist. Please reset.') # TODO Even with this check, the non-existing dir still gets saved # into the config file, e.g. /home/joe/.config/ezcad-py3/ezcad.ini # Cannot move save_conf behind configPage.apply_settings, # because the latter calls main.apply_settings which read the saved # conf to take proper actions, so must save before apply... # fname = self.set_sgmtfn.lineedit.textbox.text() # if not osp.isfile(fname): # QMessageBox.critical(self, _('Error'), # 'The survey geometry file does not exist. Please reset.') self.main.apply_project_settings()
def create_browsedir(self, text, option, default=NoDefault, tip=None): widget = self.create_lineedit(text, option, default, alignment=Qt.Horizontal) for edit in self.lineedits: if widget.isAncestorOf(edit): break msg = _("Invalid directory path") self.validate_data[edit] = (osp.isdir, msg) browse_btn = QPushButton(ima.icon('DirOpenIcon'), '', self) browse_btn.setToolTip(_("Select directory")) browse_btn.clicked.connect(lambda: self.select_directory(edit)) layout = QHBoxLayout() layout.addWidget(widget) layout.addWidget(browse_btn) layout.setContentsMargins(0, 0, 0, 0) browsedir = QWidget(self) browsedir.lineedit = widget browsedir.setLayout(layout) return browsedir
def create_browsedir(self, text, default=None, tip=None): """Create browse directory widget. :param text: key :type text: str :param default: default value :type default: str :param tip: tool tip :type tip: str :return: QWidget """ widget = self.create_lineedit(text, default=default, tip=tip) edit = widget.edit browse_btn = QPushButton(ima.icon('DirOpenIcon'), '', self) browse_btn.setToolTip(_("Select directory")) browse_btn.clicked.connect(lambda: self.select_directory(edit)) layout = QHBoxLayout() layout.addWidget(widget) layout.addWidget(browse_btn) layout.setContentsMargins(0, 0, 0, 0) browsedir = QWidget(self) browsedir.lineedit = widget browsedir.setLayout(layout) return browsedir
def get_filetype_icon(fname): """Return file type icon""" ext = osp.splitext(fname)[1] if ext.startswith('.'): ext = ext[1:] return get_icon("%s.png" % ext, ima.icon('FileIcon'))
def create_toolbutton_help(parent, triggered=None): button = create_toolbutton(parent, icon=ima.icon('help'), tip=_('Info on how to use'), triggered=triggered) return button
def setup_page(self): self.ICON = ima.icon('genprefs') newcb = self.create_checkbox # --- Interface general_group = QGroupBox(_("General")) languages = LANGUAGE_CODES.items() language_choices = sorted([(val, key) for key, val in languages]) language_combo = self.create_combobox(_('Language'), language_choices, 'interface_language', restart=True) general_layout = QVBoxLayout() general_layout.addWidget(language_combo) general_group.setLayout(general_layout) # --- Status bar sbar_group = QGroupBox(_("Status bar")) show_status_bar = newcb(_("Show status bar"), 'show_status_bar') memory_box = newcb(_("Show memory usage every"), 'memory_usage/enable', tip=self.main.mem_status.toolTip()) memory_spin = self.create_spinbox("", _(" ms"), 'memory_usage/timeout', min_=100, max_=1000000, step=100) memory_box.toggled.connect(memory_spin.setEnabled) memory_spin.setEnabled(self.get_option('memory_usage/enable')) memory_box.setEnabled(self.main.mem_status.is_supported()) memory_spin.setEnabled(self.main.mem_status.is_supported()) cpu_box = newcb(_("Show CPU usage every"), 'cpu_usage/enable', tip=self.main.cpu_status.toolTip()) cpu_spin = self.create_spinbox("", _(" ms"), 'cpu_usage/timeout', min_=100, max_=1000000, step=100) cpu_box.toggled.connect(cpu_spin.setEnabled) cpu_spin.setEnabled(self.get_option('cpu_usage/enable')) cpu_box.setEnabled(self.main.cpu_status.is_supported()) cpu_spin.setEnabled(self.main.cpu_status.is_supported()) status_bar_o = self.get_option('show_status_bar') show_status_bar.toggled.connect(memory_box.setEnabled) show_status_bar.toggled.connect(memory_spin.setEnabled) show_status_bar.toggled.connect(cpu_box.setEnabled) show_status_bar.toggled.connect(cpu_spin.setEnabled) memory_box.setEnabled(status_bar_o) memory_spin.setEnabled(status_bar_o) cpu_box.setEnabled(status_bar_o) cpu_spin.setEnabled(status_bar_o) # Layout status bar cpu_memory_layout = QGridLayout() cpu_memory_layout.addWidget(memory_box, 0, 0) cpu_memory_layout.addWidget(memory_spin, 0, 1) cpu_memory_layout.addWidget(cpu_box, 1, 0) cpu_memory_layout.addWidget(cpu_spin, 1, 1) sbar_layout = QVBoxLayout() sbar_layout.addWidget(show_status_bar) sbar_layout.addLayout(cpu_memory_layout) sbar_group.setLayout(sbar_layout) # --- Path path_group = QGroupBox(_("TODO")) tabs = QTabWidget() tabs.addTab(self.create_tab(path_group), _("Basic")) tabs.addTab(self.create_tab(general_group, sbar_group), _("Advanced Settings")) vlayout = QVBoxLayout() vlayout.addWidget(tabs) self.setLayout(vlayout)