class Grep(Dialog): def __init__(self, parent=None): Dialog.__init__(self, parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowTitle(N_('Search')) if parent is not None: self.setWindowModality(Qt.WindowModal) self.input_label = QtGui.QLabel('git grep') self.input_label.setFont(diff_font()) self.input_txt = HintedLineEdit(N_('command-line arguments'), self) self.input_txt.enable_hint(True) self.regexp_combo = combo = QtGui.QComboBox() combo.setToolTip(N_('Choose the "git grep" regular expression mode')) items = [N_('Basic Regexp'), N_('Extended Regexp'), N_('Fixed String')] combo.addItems(items) combo.setCurrentIndex(0) combo.setEditable(False) combo.setItemData(0, N_('Search using a POSIX basic regular expression'), Qt.ToolTipRole) combo.setItemData(1, N_('Search using a POSIX extended regular expression'), Qt.ToolTipRole) combo.setItemData(2, N_('Search for a fixed string'), Qt.ToolTipRole) combo.setItemData(0, '--basic-regexp', Qt.UserRole) combo.setItemData(1, '--extended-regexp', Qt.UserRole) combo.setItemData(2, '--fixed-strings', Qt.UserRole) self.result_txt = GrepTextView(N_('grep result...'), self) self.result_txt.enable_hint(True) self.edit_button = QtGui.QPushButton(N_('Edit')) self.edit_button.setIcon(qtutils.open_file_icon()) self.edit_button.setEnabled(False) self.edit_button.setShortcut(cmds.Edit.SHORTCUT) self.refresh_button = QtGui.QPushButton(N_('Refresh')) self.refresh_button.setIcon(qtutils.reload_icon()) self.refresh_button.setShortcut(QtGui.QKeySequence.Refresh) self.shell_checkbox = QtGui.QCheckBox(N_('Shell arguments')) self.shell_checkbox.setToolTip( N_('Parse arguments using a shell.\n' 'Queries with spaces will require "double quotes".')) self.shell_checkbox.setChecked(False) self.close_button = QtGui.QPushButton(N_('Close')) self.input_layout = qtutils.hbox(defs.no_margin, defs.button_spacing, self.input_label, self.input_txt, self.regexp_combo) self.bottom_layout = qtutils.hbox(defs.no_margin, defs.button_spacing, self.edit_button, self.refresh_button, self.shell_checkbox, qtutils.STRETCH, self.close_button) self.mainlayout = qtutils.vbox(defs.margin, defs.no_spacing, self.input_layout, self.result_txt, self.bottom_layout) self.setLayout(self.mainlayout) self.worker_thread = GrepThread(self) self.connect(self.worker_thread, SIGNAL('result'), self.process_result) self.connect(self.input_txt, SIGNAL('textChanged(QString)'), lambda s: self.search()) self.connect(self.regexp_combo, SIGNAL('currentIndexChanged(int)'), lambda x: self.search()) self.connect(self.result_txt, SIGNAL('leave()'), lambda: self.input_txt.setFocus()) qtutils.add_action(self.input_txt, 'Focus Results', self.focus_results, Qt.Key_Down, Qt.Key_Enter, Qt.Key_Return) qtutils.add_action(self, 'Focus Input', self.focus_input, 'Ctrl+L') qtutils.connect_button(self.edit_button, self.edit) qtutils.connect_button(self.refresh_button, self.search) qtutils.connect_toggle(self.shell_checkbox, lambda x: self.search()) qtutils.connect_button(self.close_button, self.close) qtutils.add_close_action(self) if not self.restore_state(): width, height = qtutils.default_size(parent, 666, 420) self.resize(width, height) def focus_input(self): self.input_txt.setFocus() def focus_results(self): self.result_txt.setFocus() def done(self, exit_code): self.save_state() return Dialog.done(self, exit_code) def regexp_mode(self): idx = self.regexp_combo.currentIndex() data = self.regexp_combo.itemData(idx, Qt.UserRole).toPyObject() return ustr(data) def search(self): self.edit_button.setEnabled(False) self.refresh_button.setEnabled(False) query = self.input_txt.value() if len(query) < 2: self.result_txt.set_value('') return self.worker_thread.query = query self.worker_thread.shell = self.shell_checkbox.isChecked() self.worker_thread.regexp_mode = self.regexp_mode() self.worker_thread.start() def search_for(self, txt): self.input_txt.set_value(txt) def text_scroll(self): scrollbar = self.result_txt.verticalScrollBar() if scrollbar: return scrollbar.value() return None def set_text_scroll(self, scroll): scrollbar = self.result_txt.verticalScrollBar() if scrollbar and scroll is not None: scrollbar.setValue(scroll) def text_offset(self): return self.result_txt.textCursor().position() def set_text_offset(self, offset): cursor = self.result_txt.textCursor() cursor.setPosition(offset) self.result_txt.setTextCursor(cursor) def process_result(self, status, out, err): if status == 0: value = out + err elif out + err: value = 'git grep: ' + out + err else: value = '' # save scrollbar and text cursor scroll = self.text_scroll() offset = min(len(value), self.text_offset()) self.result_txt.set_value(value) # restore self.set_text_scroll(scroll) self.set_text_offset(offset) self.edit_button.setEnabled(status == 0) self.refresh_button.setEnabled(status == 0) def edit(self): goto_grep(self.result_txt.selected_line()),
class Grep(Dialog): def __init__(self, parent): Dialog.__init__(self, parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowModality(Qt.WindowModal) self.input_label = QtGui.QLabel('git grep') self.input_label.setFont(diff_font()) hint = N_('command-line arguments') self.input_txt = HintedLineEdit(hint, self) self.input_txt.enable_hint(True) hint = N_('grep result...') self.result_txt = GrepTextView(hint, self) self.result_txt.enable_hint(True) self.edit_button = QtGui.QPushButton(N_('Edit')) self.edit_button.setIcon(qtutils.open_file_icon()) self.edit_button.setEnabled(False) self.edit_button.setShortcut(cmds.Edit.SHORTCUT) self.refresh_button = QtGui.QPushButton(N_('Refresh')) self.refresh_button.setIcon(qtutils.reload_icon()) self.refresh_button.setShortcut(QtGui.QKeySequence.Refresh) self.shell_checkbox = QtGui.QCheckBox(N_('Shell arguments')) self.shell_checkbox.setToolTip( N_('Parse arguments using a shell.\n' 'Queries with spaces will require "double quotes".')) self.shell_checkbox.setChecked(False) self.close_button = QtGui.QPushButton(N_('Close')) self.input_layout = QtGui.QHBoxLayout() self.input_layout.setMargin(0) self.input_layout.setSpacing(defs.button_spacing) self.bottom_layout = QtGui.QHBoxLayout() self.bottom_layout.setMargin(0) self.bottom_layout.setSpacing(defs.button_spacing) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.input_layout.addWidget(self.input_label) self.input_layout.addWidget(self.input_txt) self.bottom_layout.addWidget(self.edit_button) self.bottom_layout.addWidget(self.refresh_button) self.bottom_layout.addWidget(self.shell_checkbox) self.bottom_layout.addStretch() self.bottom_layout.addWidget(self.close_button) self.mainlayout.addLayout(self.input_layout) self.mainlayout.addWidget(self.result_txt) self.mainlayout.addLayout(self.bottom_layout) self.setLayout(self.mainlayout) self.grep_thread = GrepThread(self) self.connect(self.grep_thread, SIGNAL('result'), self.process_result) self.connect(self.input_txt, SIGNAL('textChanged(QString)'), self.input_txt_changed) self.connect(self.result_txt, SIGNAL('leave()'), lambda: self.input_txt.setFocus()) qtutils.add_action(self.input_txt, 'FocusResults', lambda: self.result_txt.setFocus(), Qt.Key_Down, Qt.Key_Enter, Qt.Key_Return) qtutils.connect_button(self.edit_button, self.edit) qtutils.connect_button(self.refresh_button, self.search) qtutils.connect_button(self.close_button, self.close) qtutils.add_close_action(self) if not qtutils.apply_state(self): self.resize(666, 420) def done(self, exit_code): qtutils.save_state(self) return Dialog.done(self, exit_code) def input_txt_changed(self, txt): has_query = len(unicode(txt)) > 1 if has_query: self.search() def search(self): self.edit_button.setEnabled(False) self.refresh_button.setEnabled(False) self.grep_thread.txt = self.input_txt.as_unicode() self.grep_thread.shell = self.shell_checkbox.isChecked() self.grep_thread.start() def search_for(self, txt): self.input_txt.set_value(txt) self.search() def process_result(self, status, out): self.result_txt.set_value(out) self.edit_button.setEnabled(status == 0) self.refresh_button.setEnabled(status == 0) def edit(self): goto_grep(self.result_txt.selected_line()),
class Grep(Dialog): def __init__(self, parent=None): Dialog.__init__(self, parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowTitle(N_('Search')) if parent is not None: self.setWindowModality(Qt.WindowModal) self.input_label = QtGui.QLabel('git grep') self.input_label.setFont(diff_font()) self.input_txt = HintedLineEdit(N_('command-line arguments'), self) self.input_txt.enable_hint(True) self.regexp_combo = combo = QtGui.QComboBox() combo.setToolTip(N_('Choose the "git grep" regular expression mode')) items = [N_('Basic Regexp'), N_('Extended Regexp'), N_('Fixed String')] combo.addItems(items) combo.setCurrentIndex(0) combo.setEditable(False) combo.setItemData(0, N_('Search using a POSIX basic regular expression'), Qt.ToolTipRole) combo.setItemData(1, N_('Search using a POSIX extended regular expression'), Qt.ToolTipRole) combo.setItemData(2, N_('Search for a fixed string'), Qt.ToolTipRole) combo.setItemData(0, '--basic-regexp', Qt.UserRole) combo.setItemData(1, '--extended-regexp', Qt.UserRole) combo.setItemData(2, '--fixed-strings', Qt.UserRole) self.result_txt = GrepTextView(N_('grep result...'), self) self.result_txt.enable_hint(True) self.edit_button = QtGui.QPushButton(N_('Edit')) self.edit_button.setIcon(qtutils.open_file_icon()) self.edit_button.setEnabled(False) self.edit_button.setShortcut(cmds.Edit.SHORTCUT) self.refresh_button = QtGui.QPushButton(N_('Refresh')) self.refresh_button.setIcon(qtutils.reload_icon()) self.refresh_button.setShortcut(QtGui.QKeySequence.Refresh) self.shell_checkbox = QtGui.QCheckBox(N_('Shell arguments')) self.shell_checkbox.setToolTip( N_('Parse arguments using a shell.\n' 'Queries with spaces will require "double quotes".')) self.shell_checkbox.setChecked(False) self.close_button = QtGui.QPushButton(N_('Close')) self.input_layout = QtGui.QHBoxLayout() self.input_layout.setMargin(0) self.input_layout.setSpacing(defs.button_spacing) self.bottom_layout = QtGui.QHBoxLayout() self.bottom_layout.setMargin(0) self.bottom_layout.setSpacing(defs.button_spacing) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.input_layout.addWidget(self.input_label) self.input_layout.addWidget(self.input_txt) self.input_layout.addWidget(self.regexp_combo) self.bottom_layout.addWidget(self.edit_button) self.bottom_layout.addWidget(self.refresh_button) self.bottom_layout.addWidget(self.shell_checkbox) self.bottom_layout.addStretch() self.bottom_layout.addWidget(self.close_button) self.mainlayout.addLayout(self.input_layout) self.mainlayout.addWidget(self.result_txt) self.mainlayout.addLayout(self.bottom_layout) self.setLayout(self.mainlayout) self.grep_thread = GrepThread(self) self.connect(self.grep_thread, SIGNAL('result'), self.process_result) self.connect(self.input_txt, SIGNAL('textChanged(QString)'), lambda s: self.search()) self.connect(self.regexp_combo, SIGNAL('currentIndexChanged(int)'), lambda x: self.search()) self.connect(self.result_txt, SIGNAL('leave()'), lambda: self.input_txt.setFocus()) qtutils.add_action(self.input_txt, 'FocusResults', lambda: self.result_txt.setFocus(), Qt.Key_Down, Qt.Key_Enter, Qt.Key_Return) qtutils.add_action(self, 'FocusSearch', lambda: self.input_txt.setFocus(), 'Ctrl+l') qtutils.connect_button(self.edit_button, self.edit) qtutils.connect_button(self.refresh_button, self.search) qtutils.connect_toggle(self.shell_checkbox, lambda x: self.search()) qtutils.connect_button(self.close_button, self.close) qtutils.add_close_action(self) if not self.restore_state(): self.resize(666, 420) def done(self, exit_code): self.save_state() return Dialog.done(self, exit_code) def regexp_mode(self): idx = self.regexp_combo.currentIndex() data = self.regexp_combo.itemData(idx, Qt.UserRole).toPyObject() return unicode(data) def search(self): self.edit_button.setEnabled(False) self.refresh_button.setEnabled(False) query = self.input_txt.value() if len(query) < 2: self.result_txt.set_value('') return self.grep_thread.query = query self.grep_thread.shell = self.shell_checkbox.isChecked() self.grep_thread.regexp_mode = self.regexp_mode() self.grep_thread.start() def search_for(self, txt): self.input_txt.set_value(txt) self.search() def text_scroll(self): scrollbar = self.result_txt.verticalScrollBar() if scrollbar: return scrollbar.value() return None def set_text_scroll(self, scroll): scrollbar = self.result_txt.verticalScrollBar() if scrollbar and scroll is not None: scrollbar.setValue(scroll) def text_offset(self): return self.result_txt.textCursor().position() def set_text_offset(self, offset): cursor = self.result_txt.textCursor() cursor.setPosition(offset) self.result_txt.setTextCursor(cursor) def process_result(self, status, out, err): if status == 0: value = out + err elif out + err: value = 'git grep: ' + out + err else: value = '' # save scrollbar and text cursor scroll = self.text_scroll() offset = min(len(value), self.text_offset()) self.result_txt.set_value(value) # restore self.set_text_scroll(scroll) self.set_text_offset(offset) self.edit_button.setEnabled(status == 0) self.refresh_button.setEnabled(status == 0) def edit(self): goto_grep(self.result_txt.selected_line()),
class Grep(Dialog): def __init__(self, parent=None): Dialog.__init__(self, parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowTitle(N_('Search')) if parent is not None: self.setWindowModality(Qt.WindowModal) self.edit_action = qtutils.add_action( self, N_('Edit'), self.edit, hotkeys.EDIT) self.refresh_action = qtutils.add_action( self, N_('Refresh'), self.search, *hotkeys.REFRESH_HOTKEYS) self.input_label = QtGui.QLabel('git grep') self.input_label.setFont(diff_font()) self.input_txt = HintedLineEdit(N_('command-line arguments'), self) self.input_txt.hint.enable(True) self.regexp_combo = combo = QtGui.QComboBox() combo.setToolTip(N_('Choose the "git grep" regular expression mode')) items = [N_('Basic Regexp'), N_('Extended Regexp'), N_('Fixed String')] combo.addItems(items) combo.setCurrentIndex(0) combo.setEditable(False) combo.setItemData(0, N_('Search using a POSIX basic regular expression'), Qt.ToolTipRole) combo.setItemData(1, N_('Search using a POSIX extended regular expression'), Qt.ToolTipRole) combo.setItemData(2, N_('Search for a fixed string'), Qt.ToolTipRole) combo.setItemData(0, '--basic-regexp', Qt.UserRole) combo.setItemData(1, '--extended-regexp', Qt.UserRole) combo.setItemData(2, '--fixed-strings', Qt.UserRole) self.result_txt = GrepTextView(N_('grep result...'), self) self.result_txt.hint.enable(True) self.edit_button = qtutils.edit_button() qtutils.button_action(self.edit_button, self.edit_action) self.refresh_button = qtutils.refresh_button() qtutils.button_action(self.refresh_button, self.refresh_action) text = N_('Shell arguments') tooltip = N_('Parse arguments using a shell.\n' 'Queries with spaces will require "double quotes".') self.shell_checkbox = qtutils.checkbox(text=text, tooltip=tooltip, checked=False) self.close_button = qtutils.close_button() self.refresh_group = Group(self.refresh_action, self.refresh_button) self.refresh_group.setEnabled(False) self.edit_group = Group(self.edit_action, self.edit_button) self.edit_group.setEnabled(False) self.input_layout = qtutils.hbox(defs.no_margin, defs.button_spacing, self.input_label, self.input_txt, self.regexp_combo) self.bottom_layout = qtutils.hbox(defs.no_margin, defs.button_spacing, self.edit_button, self.refresh_button, self.shell_checkbox, qtutils.STRETCH, self.close_button) self.mainlayout = qtutils.vbox(defs.margin, defs.no_spacing, self.input_layout, self.result_txt, self.bottom_layout) self.setLayout(self.mainlayout) self.worker_thread = GrepThread(self) self.connect(self.worker_thread, SIGNAL('result(PyQt_PyObject,PyQt_PyObject,PyQt_PyObject)'), self.process_result, Qt.QueuedConnection) self.connect(self.input_txt, SIGNAL('textChanged(QString)'), lambda s: self.search()) self.connect(self.regexp_combo, SIGNAL('currentIndexChanged(int)'), lambda x: self.search()) self.connect(self.result_txt, SIGNAL('leave()'), lambda: self.input_txt.setFocus()) qtutils.add_action(self.input_txt, 'Focus Results', self.focus_results, hotkeys.DOWN, *hotkeys.ACCEPT) qtutils.add_action(self, 'Focus Input', self.focus_input, hotkeys.FOCUS) qtutils.connect_toggle(self.shell_checkbox, lambda x: self.search()) qtutils.connect_button(self.close_button, self.close) qtutils.add_close_action(self) if not self.restore_state(): width, height = qtutils.default_size(parent, 666, 420) self.resize(width, height) def focus_input(self): self.input_txt.setFocus() self.input_txt.selectAll() def focus_results(self): self.result_txt.setFocus() def done(self, exit_code): self.save_state() return Dialog.done(self, exit_code) def regexp_mode(self): idx = self.regexp_combo.currentIndex() data = self.regexp_combo.itemData(idx, Qt.UserRole).toPyObject() return ustr(data) def search(self): self.edit_group.setEnabled(False) self.refresh_group.setEnabled(False) query = self.input_txt.value() if len(query) < 2: self.result_txt.set_value('') return self.worker_thread.query = query self.worker_thread.shell = self.shell_checkbox.isChecked() self.worker_thread.regexp_mode = self.regexp_mode() self.worker_thread.start() def search_for(self, txt): self.input_txt.set_value(txt) def text_scroll(self): scrollbar = self.result_txt.verticalScrollBar() if scrollbar: return scrollbar.value() return None def set_text_scroll(self, scroll): scrollbar = self.result_txt.verticalScrollBar() if scrollbar and scroll is not None: scrollbar.setValue(scroll) def text_offset(self): return self.result_txt.textCursor().position() def set_text_offset(self, offset): cursor = self.result_txt.textCursor() cursor.setPosition(offset) self.result_txt.setTextCursor(cursor) def process_result(self, status, out, err): if status == 0: value = out + err elif out + err: value = 'git grep: ' + out + err else: value = '' # save scrollbar and text cursor scroll = self.text_scroll() offset = min(len(value), self.text_offset()) self.result_txt.set_value(value) # restore self.set_text_scroll(scroll) self.set_text_offset(offset) enabled = status == 0 self.edit_group.setEnabled(enabled) self.refresh_group.setEnabled(True) def edit(self): goto_grep(self.result_txt.selected_line()),
class Grep(Dialog): def __init__(self, parent): Dialog.__init__(self, parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setWindowModality(Qt.WindowModal) self.input_label = QtGui.QLabel("git grep") self.input_label.setFont(diff_font()) hint = N_("command-line arguments") self.input_txt = HintedLineEdit(hint, self) self.input_txt.enable_hint(True) hint = N_("grep result...") self.result_txt = GrepTextView(hint, self) self.result_txt.enable_hint(True) self.edit_button = QtGui.QPushButton(N_("Edit")) self.edit_button.setIcon(qtutils.open_file_icon()) self.edit_button.setEnabled(False) self.edit_button.setShortcut(cmds.Edit.SHORTCUT) self.refresh_button = QtGui.QPushButton(N_("Refresh")) self.refresh_button.setIcon(qtutils.reload_icon()) self.refresh_button.setShortcut(QtGui.QKeySequence.Refresh) self.shell_checkbox = QtGui.QCheckBox(N_("Shell arguments")) self.shell_checkbox.setToolTip( N_("Parse arguments using a shell.\n" 'Queries with spaces will require "double quotes".') ) self.shell_checkbox.setChecked(False) self.close_button = QtGui.QPushButton(N_("Close")) self.input_layout = QtGui.QHBoxLayout() self.input_layout.setMargin(0) self.input_layout.setSpacing(defs.button_spacing) self.bottom_layout = QtGui.QHBoxLayout() self.bottom_layout.setMargin(0) self.bottom_layout.setSpacing(defs.button_spacing) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.input_layout.addWidget(self.input_label) self.input_layout.addWidget(self.input_txt) self.bottom_layout.addWidget(self.edit_button) self.bottom_layout.addWidget(self.refresh_button) self.bottom_layout.addWidget(self.shell_checkbox) self.bottom_layout.addStretch() self.bottom_layout.addWidget(self.close_button) self.mainlayout.addLayout(self.input_layout) self.mainlayout.addWidget(self.result_txt) self.mainlayout.addLayout(self.bottom_layout) self.setLayout(self.mainlayout) self.grep_thread = GrepThread(self) self.connect(self.grep_thread, SIGNAL("result"), self.process_result) self.connect(self.input_txt, SIGNAL("textChanged(QString)"), self.input_txt_changed) self.connect(self.result_txt, SIGNAL("leave()"), lambda: self.input_txt.setFocus()) qtutils.add_action( self.input_txt, "FocusResults", lambda: self.result_txt.setFocus(), Qt.Key_Down, Qt.Key_Enter, Qt.Key_Return ) qtutils.connect_button(self.edit_button, self.edit) qtutils.connect_button(self.refresh_button, self.search) qtutils.connect_button(self.close_button, self.close) qtutils.add_close_action(self) if not qtutils.apply_state(self): self.resize(666, 420) def done(self, exit_code): qtutils.save_state(self) return Dialog.done(self, exit_code) def input_txt_changed(self, txt): has_query = len(unicode(txt)) > 1 if has_query: self.search() def search(self): self.edit_button.setEnabled(False) self.refresh_button.setEnabled(False) self.grep_thread.txt = self.input_txt.as_unicode() self.grep_thread.shell = self.shell_checkbox.isChecked() self.grep_thread.start() def search_for(self, txt): self.input_txt.set_value(txt) self.search() def process_result(self, status, out): self.result_txt.set_value(out) self.edit_button.setEnabled(status == 0) self.refresh_button.setEnabled(status == 0) def edit(self): goto_grep(self.result_txt.selected_line()),