def __init__(self, model, parent=None): standard.Dialog.__init__(self, parent=parent) self.setWindowTitle(self.tr('Preferences')) self.resize(600, 360) self._tabbar = QtGui.QTabBar() self._tabbar.setDrawBase(False) self._tabbar.addTab('All Repositories') self._tabbar.addTab('Current Repository') self._tabbar.addTab('Settings') self._user_form = RepoFormWidget(model, self, source='user') self._repo_form = RepoFormWidget(model, self, source='all') self._options_form = SettingsFormWidget(model, self) relay_signal(self, self._user_form, SIGNAL(model.message_set_config)) relay_signal(self, self._repo_form, SIGNAL(model.message_set_config)) relay_signal(self, self._options_form, SIGNAL(model.message_set_config)) self._stackedwidget = QtGui.QStackedWidget() self._stackedwidget.addWidget(self._user_form) self._stackedwidget.addWidget(self._repo_form) self._stackedwidget.addWidget(self._options_form) self.close_button = QtGui.QPushButton(self) self.close_button.setText(qtutils.tr('Close')) self.close_button.setIcon(qtutils.close_icon()) self._button_layt = QtGui.QHBoxLayout() self._button_layt.setMargin(0) self._button_layt.setSpacing(defs.spacing) self._button_layt.addStretch() self._button_layt.addWidget(self.close_button) self._layt = QtGui.QVBoxLayout() self._layt.setMargin(defs.margin) self._layt.setSpacing(defs.spacing) self._layt.addWidget(self._tabbar) self._layt.addWidget(self._stackedwidget) self._layt.addLayout(self._button_layt) self.setLayout(self._layt) self.connect(self._tabbar, SIGNAL('currentChanged(int)'), self._stackedwidget.setCurrentIndex) self.connect(self._stackedwidget, SIGNAL('currentChanged(int)'), self.update_widget) qtutils.connect_button(self.close_button, self.accept) qtutils.add_close_action(self) self.update_widget(0)
def __init__(self, model, parent=None): standard.Dialog.__init__(self, parent=parent) self.setWindowTitle(self.tr('Preferences')) self.resize(600, 360) self._tabbar = QtGui.QTabBar() self._tabbar.setDrawBase(False) self._tabbar.addTab('All Repositories') self._tabbar.addTab('Current Repository') self._tabbar.addTab('Settings') self._user_form = RepoFormWidget(model, self, source='user') self._repo_form = RepoFormWidget(model, self, source='all') self._options_form = SettingsFormWidget(model, self) relay_signal(self, self._user_form, SIGNAL(model.message_set_config)) relay_signal(self, self._repo_form, SIGNAL(model.message_set_config)) relay_signal(self, self._options_form, SIGNAL(model.message_set_config)) self._stackedwidget = QtGui.QStackedWidget() self._stackedwidget.addWidget(self._user_form) self._stackedwidget.addWidget(self._repo_form) self._stackedwidget.addWidget(self._options_form) self.close_button = QtGui.QPushButton(self) self.close_button.setText(qtutils.tr('Close')) self.close_button.setIcon(qtutils.close_icon()) self._button_layt = QtGui.QHBoxLayout() self._button_layt.setMargin(0) self._button_layt.setSpacing(defs.spacing) self._button_layt.addStretch() self._button_layt.addWidget(self.close_button) self._layt = QtGui.QVBoxLayout() self._layt.setMargin(defs.margin) self._layt.setSpacing(defs.spacing) self._layt.addWidget(self._tabbar) self._layt.addWidget(self._stackedwidget) self._layt.addLayout(self._button_layt) self.setLayout(self._layt) self.connect(self._tabbar, SIGNAL('currentChanged(int)'), self._stackedwidget.setCurrentIndex) self.connect(self._stackedwidget, SIGNAL('currentChanged(int)'), self.update_widget) self.connect(self.close_button, SIGNAL('clicked()'), self.accept) qtutils.add_close_action(self) self.update_widget(0)
def __init__(self, model, parent): MainWindow.__init__(self, parent) # Default size; this is thrown out when save/restore is used self.resize(987, 610) self.model = model self.prefs_model = prefs_model = PreferencesModel() # Internal field used by import/export_state(). # Change this whenever dockwidgets are removed. self.widget_version = 1 # Keeps track of merge messages we've seen self.merge_message_hash = '' self.setAcceptDrops(True) self.setAttribute(Qt.WA_MacMetalStyle) # Dockwidget options qtcompat.set_common_dock_options(self) cfg = gitcfg.instance() self.classic_dockable = (cfg.get('cola.browserdockable') or cfg.get('cola.classicdockable')) if self.classic_dockable: self.classicdockwidget = create_dock('Browser', self) self.classicwidget = classic_widget(self) self.classicdockwidget.setWidget(self.classicwidget) # "Actions" widget self.actionsdockwidget = create_dock('Action', self) self.actionsdockwidgetcontents = qt.QFlowLayoutWidget(self) layout = self.actionsdockwidgetcontents.layout() self.stage_button = create_button(text='Stage', layout=layout) self.unstage_button = create_button(text='Unstage', layout=layout) self.rescan_button = create_button(text='Rescan', layout=layout) self.fetch_button = create_button(text='Fetch...', layout=layout) self.push_button = create_button(text='Push...', layout=layout) self.pull_button = create_button(text='Pull...', layout=layout) self.stash_button = create_button(text='Stash...', layout=layout) layout.addStretch() self.actionsdockwidget.setWidget(self.actionsdockwidgetcontents) # "Repository Status" widget self.statusdockwidget = create_dock('Status', self) self.statusdockwidget.setWidget(StatusWidget(self)) # "Commit Message Editor" widget self.position_label = QtGui.QLabel() font = qtutils.default_monospace_font() font.setPointSize(int(font.pointSize() * 0.8)) self.position_label.setFont(font) self.commitdockwidget = create_dock('Commit', self) titlebar = self.commitdockwidget.titleBarWidget() titlebar.add_corner_widget(self.position_label) self.commitmsgeditor = CommitMessageEditor(model, self) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.amend_mode)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.signoff)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.load_previous_message)) self.commitdockwidget.setWidget(self.commitmsgeditor) # "Console" widget self.logwidget = LogWidget() self.logdockwidget = create_dock('Console', self) self.logdockwidget.setWidget(self.logwidget) cola.notifier().connect(signals.log_cmd, self.logwidget.log) # "Diff Viewer" widget self.diffdockwidget = create_dock('Diff', self) self.diffeditor = DiffEditor(self.diffdockwidget) self.diffdockwidget.setWidget(self.diffeditor) # All Actions self.menu_unstage_all = add_action(self, 'Unstage All', emit(self, signals.unstage_all)) self.menu_unstage_all.setIcon(qtutils.icon('remove.svg')) self.menu_unstage_selected = add_action(self, 'Unstage From Commit', emit(self, signals.unstage_selected)) self.menu_unstage_selected.setIcon(qtutils.icon('remove.svg')) self.menu_show_diffstat = add_action(self, 'Diffstat', emit(self, signals.diffstat), 'Alt+D') self.menu_stage_modified = add_action(self, 'Stage Changed Files To Commit', emit(self, signals.stage_modified), 'Alt+A') self.menu_stage_modified.setIcon(qtutils.icon('add.svg')) self.menu_stage_untracked = add_action(self, 'Stage All Untracked', emit(self, signals.stage_untracked), 'Alt+U') self.menu_stage_untracked.setIcon(qtutils.icon('add.svg')) self.menu_export_patches = add_action(self, 'Export Patches...', guicmds.export_patches, 'Alt+E') self.menu_preferences = add_action(self, 'Preferences', lambda: preferences(model=prefs_model), QtGui.QKeySequence.Preferences, 'Ctrl+O') self.menu_edit_remotes = add_action(self, 'Edit Remotes...', lambda: editremotes.edit().exec_()) self.menu_rescan = add_action(self, 'Rescan', emit(self, signals.rescan_and_refresh), 'Ctrl+R') self.menu_rescan.setIcon(qtutils.reload_icon()) self.menu_browse_recent = add_action(self, 'Recently Modified Files...', browse_recent, 'Shift+Ctrl+E') self.menu_cherry_pick = add_action(self, 'Cherry-Pick...', guicmds.cherry_pick, 'Ctrl+P') self.menu_load_commitmsg = add_action(self, 'Load Commit Message...', guicmds.load_commitmsg) self.menu_save_tarball = add_action(self, 'Save As Tarball/Zip...', self.save_archive) self.menu_quit = add_action(self, 'Quit', self.close, 'Ctrl+Q') self.menu_manage_bookmarks = add_action(self, 'Bookmarks...', manage_bookmarks) self.menu_grep = add_action(self, 'Grep', guicmds.grep) self.menu_merge_local = add_action(self, 'Merge...', merge.local_merge) self.menu_merge_abort = add_action(self, 'Abort Merge...', merge.abort_merge) self.menu_fetch = add_action(self, 'Fetch...', remote.fetch) self.menu_push = add_action(self, 'Push...', remote.push) self.menu_pull = add_action(self, 'Pull...', remote.pull) self.menu_open_repo = add_action(self, 'Open...', guicmds.open_repo) self.menu_open_repo.setIcon(qtutils.open_icon()) self.menu_stash = add_action(self, 'Stash...', stash.stash, 'Alt+Shift+S') self.menu_clone_repo = add_action(self, 'Clone...', guicmds.clone_repo) self.menu_clone_repo.setIcon(qtutils.git_icon()) self.menu_help_docs = add_action(self, 'Documentation', resources.show_html_docs, QtGui.QKeySequence.HelpContents) self.menu_help_shortcuts = add_action(self, 'Keyboard Shortcuts', show_shortcuts, QtCore.Qt.Key_Question) self.menu_visualize_current = add_action(self, 'Visualize Current Branch...', emit(self, signals.visualize_current)) self.menu_visualize_all = add_action(self, 'Visualize All Branches...', emit(self, signals.visualize_all)) self.menu_search_commits = add_action(self, 'Search...', search) self.menu_browse_branch = add_action(self, 'Browse Current Branch...', guicmds.browse_current) self.menu_browse_other_branch = add_action(self, 'Browse Other Branch...', guicmds.browse_other) self.menu_load_commitmsg_template = add_action(self, 'Get Commit Message Template', emit(self, signals.load_commit_template)) self.menu_help_about = add_action(self, 'About', launch_about_dialog) self.menu_branch_diff = add_action(self, 'SHA-1...', guicmds.diff_revision) self.menu_diff_expression = add_action(self, 'Expression...', guicmds.diff_expression) self.menu_branch_compare = add_action(self, 'Branches...', compare_branches) self.menu_create_tag = add_action(self, 'Create Tag...', create_tag) self.menu_create_branch = add_action(self, 'Create...', create_new_branch, 'Ctrl+B') self.menu_delete_branch = add_action(self, 'Delete...', guicmds.branch_delete) self.menu_checkout_branch = add_action(self, 'Checkout...', guicmds.checkout_branch, 'Alt+B') self.menu_rebase_branch = add_action(self, 'Rebase...', guicmds.rebase) self.menu_branch_review = add_action(self, 'Review...', guicmds.review_branch) self.menu_classic = add_action(self, 'Browser...', cola_classic) self.menu_classic.setIcon(qtutils.git_icon()) self.menu_dag = add_action(self, 'DAG...', lambda: git_dag(self.model)) self.menu_dag.setIcon(qtutils.git_icon()) # Relayed actions if not self.classic_dockable: # These shortcuts conflict with those from the # 'Browser' widget so don't register them when # the browser is a dockable tool. status_tree = self.statusdockwidget.widget().tree self.addAction(status_tree.up) self.addAction(status_tree.down) self.addAction(status_tree.process_selection) self.addAction(status_tree.launch_difftool) # Create the application menu self.menubar = QtGui.QMenuBar(self) # File Menu self.file_menu = create_menu('&File', self.menubar) self.file_menu.addAction(self.menu_preferences) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_open_repo) self.menu_open_recent = self.file_menu.addMenu(tr('Open Recent')) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_clone_repo) self.file_menu.addAction(self.menu_manage_bookmarks) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_edit_remotes) self.file_menu.addAction(self.menu_rescan) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_browse_recent) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_load_commitmsg) self.file_menu.addAction(self.menu_load_commitmsg_template) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_save_tarball) self.file_menu.addAction(self.menu_quit) # Add to menubar self.menubar.addAction(self.file_menu.menuAction()) # Commit Menu self.commit_menu = create_menu('Co&mmit', self.menubar) self.commit_menu.setTitle(tr('Commit@@verb')) self.commit_menu.addAction(self.menu_stage_modified) self.commit_menu.addAction(self.menu_stage_untracked) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_unstage_all) self.commit_menu.addAction(self.menu_unstage_selected) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_search_commits) # Add to menubar self.menubar.addAction(self.commit_menu.menuAction()) # Branch Menu self.branch_menu = create_menu('B&ranch', self.menubar) self.branch_menu.addAction(self.menu_branch_review) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_create_branch) self.branch_menu.addAction(self.menu_checkout_branch) self.branch_menu.addAction(self.menu_rebase_branch) self.branch_menu.addAction(self.menu_delete_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_browse_branch) self.branch_menu.addAction(self.menu_browse_other_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_visualize_current) self.branch_menu.addAction(self.menu_visualize_all) # Add to menubar self.menubar.addAction(self.branch_menu.menuAction()) # Actions menu self.actions_menu = create_menu('Act&ions', self.menubar) self.actions_menu.addAction(self.menu_merge_local) self.actions_menu.addAction(self.menu_stash) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_fetch) self.actions_menu.addAction(self.menu_push) self.actions_menu.addAction(self.menu_pull) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_create_tag) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_export_patches) self.actions_menu.addAction(self.menu_cherry_pick) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_merge_abort) self.actions_menu.addAction(self.menu_grep) # Add to menubar self.menubar.addAction(self.actions_menu.menuAction()) # Diff Menu self.diff_menu = create_menu('&Diff', self.menubar) self.diff_menu.addAction(self.menu_branch_diff) self.diff_menu.addAction(self.menu_diff_expression) self.diff_menu.addAction(self.menu_branch_compare) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_show_diffstat) # Add to menubar self.menubar.addAction(self.diff_menu.menuAction()) # Tools Menu self.tools_menu = create_menu('&Tools', self.menubar) self.tools_menu.addAction(self.menu_classic) self.tools_menu.addAction(self.menu_dag) self.tools_menu.addSeparator() if self.classic_dockable: self.tools_menu.addAction(self.classicdockwidget.toggleViewAction()) self.setup_dockwidget_tools_menu() self.menubar.addAction(self.tools_menu.menuAction()) # Help Menu self.help_menu = create_menu('&Help', self.menubar) self.help_menu.addAction(self.menu_help_docs) self.help_menu.addAction(self.menu_help_shortcuts) self.help_menu.addAction(self.menu_help_about) # Add to menubar self.menubar.addAction(self.help_menu.menuAction()) # Set main menu self.setMenuBar(self.menubar) # Arrange dock widgets top = Qt.TopDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(top, self.commitdockwidget) if self.classic_dockable: self.addDockWidget(top, self.classicdockwidget) self.addDockWidget(top, self.statusdockwidget) self.addDockWidget(top, self.actionsdockwidget) self.addDockWidget(bottom, self.logdockwidget) if self.classic_dockable: self.tabifyDockWidget(self.classicdockwidget, self.commitdockwidget) self.tabifyDockWidget(self.logdockwidget, self.diffdockwidget) # Listen for model notifications model.add_observer(model.message_updated, self._update_view) prefs_model.add_observer(prefs_model.message_config_updated, self._config_updated) # Set a default value self.show_cursor_position(1, 0) # Add button callbacks connect_button(self.rescan_button, emit(self, signals.rescan_and_refresh)) connect_button(self.fetch_button, remote.fetch) connect_button(self.push_button, remote.push) connect_button(self.pull_button, remote.pull) connect_button(self.stash_button, stash.stash) connect_button(self.stage_button, self.stage) connect_button(self.unstage_button, self.unstage) self.connect(self.menu_open_recent, SIGNAL('aboutToShow()'), self.build_recent_menu) self.connect(self.commitmsgeditor, SIGNAL('cursorPosition(int,int)'), self.show_cursor_position) self.connect(self, SIGNAL('update'), self._update_callback) self.connect(self, SIGNAL('install_config_actions'), self._install_config_actions) # Install .git-config-defined actions self._config_task = None self.install_config_actions() # Restore saved settings qtutils.apply_state(self) self.statusdockwidget.widget().setFocus() log(0, version.git_version_str() + '\ncola version ' + version.version())
def __init__(self, model, dag, parent=None, args=None): standard.Dialog.__init__(self, parent=parent) if utils.is_darwin(): self.setAttribute(QtCore.Qt.WA_MacMetalStyle) # change when widgets are added/removed self.widget_version = 1 self.model = model self.dag = dag self.setObjectName('dag') self.setMinimumSize(1, 1) self.revlabel = QtGui.QLabel() self.revlabel.setText('git log -') self.revtext = GitLogLineEdit(parent=self) self.maxresults = QtGui.QSpinBox() self.maxresults.setMinimum(-1) self.maxresults.setMaximum(2**31 - 1) self.displaybutton = QtGui.QPushButton() self.displaybutton.setText('Display') self.zoom_in = QtGui.QPushButton() self.zoom_in.setIcon(qtutils.theme_icon('zoom-in.png')) self.zoom_in.setFlat(True) self.zoom_out = QtGui.QPushButton() self.zoom_out.setIcon(qtutils.theme_icon('zoom-out.png')) self.zoom_out.setFlat(True) self._buttons_layt = QtGui.QHBoxLayout() self._buttons_layt.setMargin(2) self._buttons_layt.setSpacing(4) self._buttons_layt.addWidget(self.revlabel) self._buttons_layt.addWidget(self.maxresults) self._buttons_layt.addWidget(self.revtext) self._buttons_layt.addWidget(self.displaybutton) self._buttons_layt.addStretch() self._buttons_layt.addWidget(self.zoom_out) self._buttons_layt.addWidget(self.zoom_in) self._commits = {} self._notifier = notifier = observable.Observable() self._notifier.refs_updated = refs_updated = 'refs_updated' self._notifier.add_message_observer(refs_updated, self._display) self._graphview = GraphView(notifier) self._treewidget = CommitTreeWidget(notifier) self._diffwidget = DiffWidget(notifier) for signal in (archive,): qtutils.relay_signal(self, self._graphview, SIGNAL(signal)) qtutils.relay_signal(self, self._treewidget, SIGNAL(signal)) self._mainsplitter = QtGui.QSplitter() self._mainsplitter.setOrientation(QtCore.Qt.Horizontal) self._mainsplitter.setChildrenCollapsible(True) self._leftsplitter = QtGui.QSplitter() self._leftsplitter.setOrientation(QtCore.Qt.Vertical) self._leftsplitter.setChildrenCollapsible(True) self._leftsplitter.setStretchFactor(0, 1) self._leftsplitter.setStretchFactor(1, 1) self._leftsplitter.insertWidget(0, self._treewidget) self._leftsplitter.insertWidget(1, self._diffwidget) self._mainsplitter.insertWidget(0, self._leftsplitter) self._mainsplitter.insertWidget(1, self._graphview) self._mainsplitter.setStretchFactor(0, 1) self._mainsplitter.setStretchFactor(1, 1) self._layt = layt = QtGui.QVBoxLayout() layt.setMargin(0) layt.setSpacing(0) layt.addLayout(self._buttons_layt) layt.addWidget(self._mainsplitter) self.setLayout(layt) # Also re-loads dag.* from the saved state if not qtutils.apply_state(self): self.resize_to_desktop() # Update fields affected by model self.revtext.setText(dag.ref) self.maxresults.setValue(dag.count) self.update_window_title() self.thread = ReaderThread(self, dag) self.thread.connect(self.thread, self.thread.commits_ready, self.add_commits) self.thread.connect(self.thread, self.thread.done, self.thread_done) self.connect(self._mainsplitter, SIGNAL('splitterMoved(int,int)'), self._splitter_moved) self.connect(self.zoom_in, SIGNAL('pressed()'), self._graphview.zoom_in) self.connect(self.zoom_out, SIGNAL('pressed()'), self._graphview.zoom_out) self.connect(self.maxresults, SIGNAL('valueChanged(int)'), lambda(x): self.dag.set_count(x)) self.connect(self.displaybutton, SIGNAL('pressed()'), self._display) self.connect(self.revtext, SIGNAL('ref_changed'), self._display) self.connect(self.revtext, SIGNAL('textChanged(QString)'), self._text_changed) # The model is updated in another thread so use # signals/slots to bring control back to the main GUI thread self.model.add_message_observer(self.model.message_updated, self._model_updated) self.connect(self, SIGNAL('model_updated'), self.model_updated) qtutils.add_close_action(self)
def __init__(self, model, dag, parent=None, args=None): super(DAGView, self).__init__(parent) self.setAttribute(Qt.WA_MacMetalStyle) self.setMinimumSize(1, 1) # change when widgets are added/removed self.widget_version = 1 self.model = model self.dag = dag self.commits = {} self.commit_list = [] self.old_count = None self.old_ref = None self.revtext = completion.GitLogLineEdit(parent=self) self.maxresults = QtGui.QSpinBox() self.maxresults.setMinimum(1) self.maxresults.setMaximum(99999) self.maxresults.setPrefix("git log -") self.maxresults.setSuffix("") self.displaybutton = QtGui.QPushButton() self.displaybutton.setText("Display") self.zoom_in = QtGui.QPushButton() self.zoom_in.setIcon(qtutils.theme_icon("zoom-in.png")) self.zoom_in.setFlat(True) self.zoom_out = QtGui.QPushButton() self.zoom_out.setIcon(qtutils.theme_icon("zoom-out.png")) self.zoom_out.setFlat(True) self.top_layout = QtGui.QHBoxLayout() self.top_layout.setMargin(defs.margin) self.top_layout.setSpacing(defs.button_spacing) self.top_layout.addWidget(self.maxresults) self.top_layout.addWidget(self.revtext) self.top_layout.addWidget(self.displaybutton) self.top_layout.addStretch() self.top_layout.addWidget(self.zoom_out) self.top_layout.addWidget(self.zoom_in) self.notifier = notifier = observable.Observable() self.notifier.refs_updated = refs_updated = "refs_updated" self.notifier.add_observer(refs_updated, self.display) self.graphview = GraphView(notifier, self) self.treewidget = CommitTreeWidget(notifier, self) self.diffwidget = DiffWidget(notifier, self) for signal in (archive,): qtutils.relay_signal(self, self.graphview, SIGNAL(signal)) qtutils.relay_signal(self, self.treewidget, SIGNAL(signal)) self.splitter = QtGui.QSplitter() self.splitter.setOrientation(Qt.Horizontal) self.splitter.setChildrenCollapsible(True) self.splitter.setHandleWidth(defs.handle_width) self.left_splitter = QtGui.QSplitter() self.left_splitter.setOrientation(Qt.Vertical) self.left_splitter.setChildrenCollapsible(True) self.left_splitter.setHandleWidth(defs.handle_width) self.left_splitter.setStretchFactor(0, 1) self.left_splitter.setStretchFactor(1, 1) self.left_splitter.insertWidget(0, self.treewidget) self.left_splitter.insertWidget(1, self.diffwidget) self.splitter.insertWidget(0, self.left_splitter) self.splitter.insertWidget(1, self.graphview) self.splitter.setStretchFactor(0, 1) self.splitter.setStretchFactor(1, 1) self.main_layout = QtGui.QVBoxLayout() self.main_layout.setMargin(0) self.main_layout.setSpacing(0) self.main_layout.addLayout(self.top_layout) self.main_layout.addWidget(self.splitter) self.setLayout(self.main_layout) # Also re-loads dag.* from the saved state if not qtutils.apply_state(self): self.resize_to_desktop() # Update fields affected by model self.revtext.setText(dag.ref) self.maxresults.setValue(dag.count) self.update_window_title() self.thread = ReaderThread(dag, self) self.thread.connect(self.thread, self.thread.commits_ready, self.add_commits) self.thread.connect(self.thread, self.thread.done, self.thread_done) self.connect(self.splitter, SIGNAL("splitterMoved(int,int)"), self.splitter_moved) self.connect(self.zoom_in, SIGNAL("pressed()"), self.graphview.zoom_in) self.connect(self.zoom_out, SIGNAL("pressed()"), self.graphview.zoom_out) self.connect(self.treewidget, SIGNAL("diff_commits"), self.diff_commits) self.connect(self.graphview, SIGNAL("diff_commits"), self.diff_commits) self.connect(self.maxresults, SIGNAL("editingFinished()"), self.display) self.connect(self.displaybutton, SIGNAL("pressed()"), self.display) self.connect(self.revtext, SIGNAL("ref_changed"), self.display) self.connect(self.revtext, SIGNAL("textChanged(QString)"), self.text_changed) # The model is updated in another thread so use # signals/slots to bring control back to the main GUI thread self.model.add_observer(self.model.message_updated, self.emit_model_updated) self.connect(self, SIGNAL("model_updated"), self.model_updated) qtutils.add_close_action(self)
def __init__(self, model, parent): standard.MainWindow.__init__(self, parent) # Default size; this is thrown out when save/restore is used self.resize(987, 610) self.model = model self.prefs_model = prefs_model = PreferencesModel() # Internal field used by import/export_state(). # Change this whenever dockwidgets are removed. self.widget_version = 1 # Keeps track of merge messages we've seen self.merge_message_hash = '' self.setAcceptDrops(True) # Dockwidget options qtcompat.set_common_dock_options(self) self.classic_dockable = gitcfg.instance().get('cola.classicdockable') if self.classic_dockable: self.classicdockwidget = create_dock('Cola Classic', self) self.classicwidget = classic_widget(self) self.classicdockwidget.setWidget(self.classicwidget) # "Actions" widget self.actiondockwidget = create_dock('Actions', self) self.actiondockwidgetcontents = qt.QFlowLayoutWidget(self) layout = self.actiondockwidgetcontents.layout() self.stage_button = create_button('Stage', layout) self.unstage_button = create_button('Unstage', layout) self.rescan_button = create_button('Rescan', layout) self.fetch_button = create_button('Fetch...', layout) self.push_button = create_button('Push...', layout) self.pull_button = create_button('Pull...', layout) self.stash_button = create_button('Stash...', layout) self.alt_button = create_button('Exit Diff Mode', layout) self.alt_button.hide() layout.addStretch() self.actiondockwidget.setWidget(self.actiondockwidgetcontents) # "Repository Status" widget self.statusdockwidget = create_dock('Repository Status', self) self.statusdockwidget.setWidget(StatusWidget(self)) # "Commit Message Editor" widget self.commitdockwidget = create_dock('Commit Message Editor', self) self.commitmsgeditor = CommitMessageEditor(model, self) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.amend_mode)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.signoff)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.load_previous_message)) self.commitdockwidget.setWidget(self.commitmsgeditor) # "Command Output" widget logwidget = qtutils.logger() logwidget.setFont(diff_font()) self.logdockwidget = create_dock('Command Output', self) self.logdockwidget.setWidget(logwidget) # "Diff Viewer" widget self.diffdockwidget = create_dock('Diff Viewer', self) self.diff_viewer = DiffTextEdit(self.diffdockwidget) self.diffdockwidget.setWidget(self.diff_viewer) # All Actions self.menu_unstage_all = add_action(self, 'Unstage All', emit(self, signals.unstage_all)) self.menu_unstage_all.setIcon(qtutils.icon('remove.svg')) self.menu_unstage_selected = add_action(self, 'Unstage From Commit', emit(self, signals.unstage_selected)) self.menu_unstage_selected.setIcon(qtutils.icon('remove.svg')) self.menu_show_diffstat = add_action(self, 'Diffstat', emit(self, signals.diffstat), 'Ctrl+D') self.menu_stage_modified = add_action(self, 'Stage Changed Files To Commit', emit(self, signals.stage_modified), 'Alt+A') self.menu_stage_modified.setIcon(qtutils.icon('add.svg')) self.menu_stage_untracked = add_action(self, 'Stage All Untracked', emit(self, signals.stage_untracked), 'Alt+U') self.menu_stage_untracked.setIcon(qtutils.icon('add.svg')) self.menu_export_patches = add_action(self, 'Export Patches...', guicmds.export_patches, 'Ctrl+E') self.menu_preferences = add_action(self, 'Preferences', lambda: preferences(model=prefs_model), QtGui.QKeySequence.Preferences, 'Ctrl+O') self.menu_rescan = add_action(self, 'Rescan', emit(self, signals.rescan), 'Ctrl+R') self.menu_rescan.setIcon(qtutils.reload_icon()) self.menu_cherry_pick = add_action(self, 'Cherry-Pick...', guicmds.cherry_pick, 'Ctrl+P') self.menu_load_commitmsg = add_action(self, 'Load Commit Message...', guicmds.load_commitmsg) self.menu_quit = add_action(self, 'Quit', self.close, 'Ctrl+Q') self.menu_manage_bookmarks = add_action(self, 'Bookmarks...', manage_bookmarks) self.menu_grep = add_action(self, 'Grep', guicmds.grep) self.menu_merge_local = add_action(self, 'Merge...', merge.local_merge) self.menu_merge_abort = add_action(self, 'Abort Merge...', merge.abort_merge) self.menu_fetch = add_action(self, 'Fetch...', guicmds.fetch) self.menu_push = add_action(self, 'Push...', guicmds.push) self.menu_pull = add_action(self, 'Pull...', guicmds.pull) self.menu_open_repo = add_action(self, 'Open...', guicmds.open_repo) self.menu_open_repo.setIcon(qtutils.open_icon()) self.menu_stash = add_action(self, 'Stash...', stash.stash, 'Alt+Shift+S') self.menu_diff_branch = add_action(self, 'Apply Changes From Branch...', guicmds.diff_branch) self.menu_branch_compare = add_action(self, 'Branches...', compare.branch_compare) self.menu_clone_repo = add_action(self, 'Clone...', guicmds.clone_repo) self.menu_clone_repo.setIcon(qtutils.git_icon()) self.menu_help_docs = add_action(self, 'Documentation', lambda: self.model.git.web__browse(resources.html_docs()), QtGui.QKeySequence.HelpContents) self.menu_commit_compare = add_action(self, 'Commits...', compare.compare) self.menu_commit_compare_file = add_action(self, 'Commits Touching File...', compare.compare_file) self.menu_visualize_current = add_action(self, 'Visualize Current Branch...', emit(self, signals.visualize_current)) self.menu_visualize_all = add_action(self, 'Visualize All Branches...', emit(self, signals.visualize_all)) self.menu_search_commits = add_action(self, 'Search...', search.search) self.menu_browse_branch = add_action(self, 'Browse Current Branch...', guicmds.browse_current) self.menu_browse_other_branch = add_action(self, 'Browse Other Branch...', guicmds.browse_other) self.menu_load_commitmsg_template = add_action(self, 'Get Commit Message Template', emit(self, signals.load_commit_template)) self.menu_help_about = add_action(self, 'About', launch_about_dialog) self.menu_branch_diff = add_action(self, 'SHA-1...', guicmds.branch_diff) self.menu_diff_expression = add_action(self, 'Expression...', guicmds.diff_expression) self.menu_create_tag = add_action(self, 'Create Tag...', createtag.create_tag) self.menu_create_branch = add_action(self, 'Create...', create_new_branch, 'Ctrl+B') self.menu_delete_branch = add_action(self, 'Delete...', guicmds.branch_delete) self.menu_checkout_branch = add_action(self, 'Checkout...', guicmds.checkout_branch, 'Alt+B') self.menu_rebase_branch = add_action(self, 'Rebase...', guicmds.rebase) self.menu_branch_review = add_action(self, 'Review...', guicmds.review_branch) self.menu_classic = add_action(self, 'Cola Classic...', cola_classic) self.menu_classic.setIcon(qtutils.git_icon()) self.menu_dag = add_action(self, 'DAG...', lambda: git_dag(self.model)) self.menu_dag.setIcon(qtutils.git_icon()) # Create the application menu self.menubar = QtGui.QMenuBar(self) # File Menu self.file_menu = create_menu('&File', self.menubar) self.file_menu.addAction(self.menu_preferences) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_open_repo) self.file_menu.addAction(self.menu_clone_repo) self.file_menu.addAction(self.menu_manage_bookmarks) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_rescan) self.file_menu.addSeparator() self.file_menu.addSeparator() self.file_menu.addAction(self.menu_load_commitmsg) self.file_menu.addAction(self.menu_load_commitmsg_template) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_quit) # Add to menubar self.menubar.addAction(self.file_menu.menuAction()) # Commit Menu self.commit_menu = create_menu('Co&mmit', self.menubar) self.commit_menu.setTitle(tr('Commit@@verb')) self.commit_menu.addAction(self.menu_stage_modified) self.commit_menu.addAction(self.menu_stage_untracked) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_unstage_all) self.commit_menu.addAction(self.menu_unstage_selected) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_search_commits) # Add to menubar self.menubar.addAction(self.commit_menu.menuAction()) # Branch Menu self.branch_menu = create_menu('B&ranch', self.menubar) self.branch_menu.addAction(self.menu_branch_review) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_create_branch) self.branch_menu.addAction(self.menu_checkout_branch) self.branch_menu.addAction(self.menu_rebase_branch) self.branch_menu.addAction(self.menu_delete_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_browse_branch) self.branch_menu.addAction(self.menu_browse_other_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_visualize_current) self.branch_menu.addAction(self.menu_visualize_all) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_diff_branch) # Add to menubar self.menubar.addAction(self.branch_menu.menuAction()) # Actions menu self.actions_menu = create_menu('Act&ions', self.menubar) self.actions_menu.addAction(self.menu_merge_local) self.actions_menu.addAction(self.menu_stash) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_fetch) self.actions_menu.addAction(self.menu_push) self.actions_menu.addAction(self.menu_pull) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_create_tag) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_export_patches) self.actions_menu.addAction(self.menu_cherry_pick) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_merge_abort) self.actions_menu.addAction(self.menu_grep) # Add to menubar self.menubar.addAction(self.actions_menu.menuAction()) # Diff Menu self.diff_menu = create_menu('&Diff', self.menubar) self.diff_menu.addAction(self.menu_branch_diff) self.diff_menu.addAction(self.menu_diff_expression) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_branch_compare) self.diff_menu.addAction(self.menu_commit_compare) self.diff_menu.addAction(self.menu_commit_compare_file) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_show_diffstat) # Add to menubar self.menubar.addAction(self.diff_menu.menuAction()) # Tools Menu self.tools_menu = create_menu('&Tools', self.menubar) self.tools_menu.addAction(self.menu_classic) self.tools_menu.addAction(self.menu_dag) self.tools_menu.addSeparator() if self.classic_dockable: self.tools_menu.addAction(self.classicdockwidget.toggleViewAction()) self.tools_menu.addAction(self.diffdockwidget.toggleViewAction()) self.tools_menu.addAction(self.actiondockwidget.toggleViewAction()) self.tools_menu.addAction(self.commitdockwidget.toggleViewAction()) self.tools_menu.addAction(self.statusdockwidget.toggleViewAction()) self.tools_menu.addAction(self.logdockwidget.toggleViewAction()) self.menubar.addAction(self.tools_menu.menuAction()) # Help Menu self.help_menu = create_menu('&Help', self.menubar) self.help_menu.addAction(self.menu_help_docs) self.help_menu.addAction(self.menu_help_about) # Add to menubar self.menubar.addAction(self.help_menu.menuAction()) # Set main menu self.setMenuBar(self.menubar) # Arrange dock widgets top = Qt.TopDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(top, self.commitdockwidget) if self.classic_dockable: self.addDockWidget(top, self.classicdockwidget) self.addDockWidget(top, self.statusdockwidget) self.addDockWidget(top, self.actiondockwidget) self.addDockWidget(bottom, self.logdockwidget) if self.classic_dockable: self.tabifyDockWidget(self.classicdockwidget, self.commitdockwidget) self.tabifyDockWidget(self.logdockwidget, self.diffdockwidget) # Listen for model notifications model.add_message_observer(model.message_mode_changed, self._mode_changed) model.add_message_observer(model.message_updated, self._update_view) prefs_model.add_message_observer(prefs_model.message_config_updated, self._config_updated) # Add button callbacks connect_button(self.rescan_button, emit(self, signals.rescan)) connect_button(self.alt_button, emit(self, signals.reset_mode)) connect_button(self.fetch_button, guicmds.fetch) connect_button(self.push_button, guicmds.push) connect_button(self.pull_button, guicmds.pull) connect_button(self.stash_button, stash.stash) connect_button(self.stage_button, self.stage) connect_button(self.unstage_button, self.unstage) self.connect(self, SIGNAL('update'), self._update_callback) self.connect(self, SIGNAL('apply_state'), self.apply_state) self.connect(self, SIGNAL('install_config_actions'), self._install_config_actions) # Install .git-config-defined actions self._config_task = None self.install_config_actions() # Restore saved settings self._gui_state_task = None self._load_gui_state() log(0, self.model.git_version + '\ncola version ' + version.version())
def __init__(self, model, parent): standard.MainWindow.__init__(self, parent) # Default size; this is thrown out when save/restore is used self.resize(987, 610) self.model = model self.prefs_model = prefs_model = PreferencesModel() # Internal field used by import/export_state(). # Change this whenever dockwidgets are removed. self.widget_version = 1 # Keeps track of merge messages we've seen self.merge_message_hash = "" self.setAcceptDrops(True) # Dockwidget options qtcompat.set_common_dock_options(self) self.classic_dockable = gitcfg.instance().get("cola.classicdockable") if self.classic_dockable: self.classicdockwidget = create_dock("Cola Classic", self) self.classicwidget = classic_widget(self) self.classicdockwidget.setWidget(self.classicwidget) # "Actions" widget self.actionsdockwidget = create_dock("Actions", self) self.actionsdockwidgetcontents = qt.QFlowLayoutWidget(self) layout = self.actionsdockwidgetcontents.layout() self.stage_button = create_button(text="Stage", layout=layout) self.unstage_button = create_button(text="Unstage", layout=layout) self.rescan_button = create_button(text="Rescan", layout=layout) self.fetch_button = create_button(text="Fetch...", layout=layout) self.push_button = create_button(text="Push...", layout=layout) self.pull_button = create_button(text="Pull...", layout=layout) self.stash_button = create_button(text="Stash...", layout=layout) self.alt_button = create_button(text="Exit Diff Mode", layout=layout) self.alt_button.hide() layout.addStretch() self.actionsdockwidget.setWidget(self.actionsdockwidgetcontents) # "Repository Status" widget self.statusdockwidget = create_dock("Repository Status", self) self.statusdockwidget.setWidget(StatusWidget(self)) # "Commit Message Editor" widget self.commitdockwidget = create_dock("Commit Message Editor", self) self.commitmsgeditor = CommitMessageEditor(model, self) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.amend_mode)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.signoff)) relay_signal(self, self.commitmsgeditor, SIGNAL(signals.load_previous_message)) self.commitdockwidget.setWidget(self.commitmsgeditor) # "Command Output" widget logwidget = qtutils.logger() logwidget.setFont(diff_font()) self.logdockwidget = create_dock("Command Output", self) self.logdockwidget.setWidget(logwidget) # "Diff Viewer" widget self.diffdockwidget = create_dock("Diff Viewer", self) self.diff_viewer = DiffTextEdit(self.diffdockwidget) self.diffdockwidget.setWidget(self.diff_viewer) # All Actions self.menu_unstage_all = add_action(self, "Unstage All", emit(self, signals.unstage_all)) self.menu_unstage_all.setIcon(qtutils.icon("remove.svg")) self.menu_unstage_selected = add_action(self, "Unstage From Commit", emit(self, signals.unstage_selected)) self.menu_unstage_selected.setIcon(qtutils.icon("remove.svg")) self.menu_show_diffstat = add_action(self, "Diffstat", emit(self, signals.diffstat), "Alt+D") self.menu_stage_modified = add_action( self, "Stage Changed Files To Commit", emit(self, signals.stage_modified), "Alt+A" ) self.menu_stage_modified.setIcon(qtutils.icon("add.svg")) self.menu_stage_untracked = add_action( self, "Stage All Untracked", emit(self, signals.stage_untracked), "Alt+U" ) self.menu_stage_untracked.setIcon(qtutils.icon("add.svg")) self.menu_export_patches = add_action(self, "Export Patches...", guicmds.export_patches, "Alt+E") self.menu_preferences = add_action( self, "Preferences", lambda: preferences(model=prefs_model), QtGui.QKeySequence.Preferences, "Ctrl+O" ) self.menu_rescan = add_action(self, "Rescan", emit(self, signals.rescan_and_refresh), "Ctrl+R") self.menu_rescan.setIcon(qtutils.reload_icon()) self.menu_browse_recent = add_action(self, "Recently Modified Files...", browse_recent, "Shift+Ctrl+E") self.menu_cherry_pick = add_action(self, "Cherry-Pick...", guicmds.cherry_pick, "Ctrl+P") self.menu_load_commitmsg = add_action(self, "Load Commit Message...", guicmds.load_commitmsg) self.menu_quit = add_action(self, "Quit", self.close, "Ctrl+Q") self.menu_manage_bookmarks = add_action(self, "Bookmarks...", manage_bookmarks) self.menu_grep = add_action(self, "Grep", guicmds.grep) self.menu_merge_local = add_action(self, "Merge...", merge.local_merge) self.menu_merge_abort = add_action(self, "Abort Merge...", merge.abort_merge) self.menu_fetch = add_action(self, "Fetch...", guicmds.fetch) self.menu_push = add_action(self, "Push...", guicmds.push) self.menu_pull = add_action(self, "Pull...", guicmds.pull) self.menu_open_repo = add_action(self, "Open...", guicmds.open_repo) self.menu_open_repo.setIcon(qtutils.open_icon()) self.menu_stash = add_action(self, "Stash...", stash.stash, "Alt+Shift+S") self.menu_diff_branch = add_action(self, "Apply Changes From Branch...", guicmds.diff_branch) self.menu_branch_compare = add_action(self, "Branches...", compare.branch_compare) self.menu_clone_repo = add_action(self, "Clone...", guicmds.clone_repo) self.menu_clone_repo.setIcon(qtutils.git_icon()) self.menu_help_docs = add_action( self, "Documentation", resources.show_html_docs, QtGui.QKeySequence.HelpContents ) self.menu_help_shortcuts = add_action(self, "Keyboard Shortcuts", show_shortcuts, QtCore.Qt.Key_Question) self.menu_commit_compare = add_action(self, "Commits...", compare.compare) self.menu_commit_compare_file = add_action(self, "Commits Touching File...", compare.compare_file) self.menu_visualize_current = add_action( self, "Visualize Current Branch...", emit(self, signals.visualize_current) ) self.menu_visualize_all = add_action(self, "Visualize All Branches...", emit(self, signals.visualize_all)) self.menu_search_commits = add_action(self, "Search...", search.search) self.menu_browse_branch = add_action(self, "Browse Current Branch...", guicmds.browse_current) self.menu_browse_other_branch = add_action(self, "Browse Other Branch...", guicmds.browse_other) self.menu_load_commitmsg_template = add_action( self, "Get Commit Message Template", emit(self, signals.load_commit_template) ) self.menu_help_about = add_action(self, "About", launch_about_dialog) self.menu_branch_diff = add_action(self, "SHA-1...", guicmds.branch_diff) self.menu_diff_expression = add_action(self, "Expression...", guicmds.diff_expression) self.menu_create_tag = add_action(self, "Create Tag...", createtag.create_tag) self.menu_create_branch = add_action(self, "Create...", create_new_branch, "Ctrl+B") self.menu_delete_branch = add_action(self, "Delete...", guicmds.branch_delete) self.menu_checkout_branch = add_action(self, "Checkout...", guicmds.checkout_branch, "Alt+B") self.menu_rebase_branch = add_action(self, "Rebase...", guicmds.rebase) self.menu_branch_review = add_action(self, "Review...", guicmds.review_branch) self.menu_classic = add_action(self, "Cola Classic...", cola_classic) self.menu_classic.setIcon(qtutils.git_icon()) self.menu_dag = add_action(self, "DAG...", lambda: git_dag(self.model)) self.menu_dag.setIcon(qtutils.git_icon()) # Relayed actions status_tree = self.statusdockwidget.widget().tree self.addAction(status_tree.up) self.addAction(status_tree.down) self.addAction(status_tree.process_selection) self.addAction(status_tree.launch_difftool) # Create the application menu self.menubar = QtGui.QMenuBar(self) # File Menu self.file_menu = create_menu("&File", self.menubar) self.file_menu.addAction(self.menu_preferences) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_open_repo) self.file_menu.addAction(self.menu_clone_repo) self.file_menu.addAction(self.menu_manage_bookmarks) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_rescan) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_browse_recent) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_load_commitmsg) self.file_menu.addAction(self.menu_load_commitmsg_template) self.file_menu.addSeparator() self.file_menu.addAction(self.menu_quit) # Add to menubar self.menubar.addAction(self.file_menu.menuAction()) # Commit Menu self.commit_menu = create_menu("Co&mmit", self.menubar) self.commit_menu.setTitle(tr("Commit@@verb")) self.commit_menu.addAction(self.menu_stage_modified) self.commit_menu.addAction(self.menu_stage_untracked) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_unstage_all) self.commit_menu.addAction(self.menu_unstage_selected) self.commit_menu.addSeparator() self.commit_menu.addAction(self.menu_search_commits) # Add to menubar self.menubar.addAction(self.commit_menu.menuAction()) # Branch Menu self.branch_menu = create_menu("B&ranch", self.menubar) self.branch_menu.addAction(self.menu_branch_review) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_create_branch) self.branch_menu.addAction(self.menu_checkout_branch) self.branch_menu.addAction(self.menu_rebase_branch) self.branch_menu.addAction(self.menu_delete_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_browse_branch) self.branch_menu.addAction(self.menu_browse_other_branch) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_visualize_current) self.branch_menu.addAction(self.menu_visualize_all) self.branch_menu.addSeparator() self.branch_menu.addAction(self.menu_diff_branch) # Add to menubar self.menubar.addAction(self.branch_menu.menuAction()) # Actions menu self.actions_menu = create_menu("Act&ions", self.menubar) self.actions_menu.addAction(self.menu_merge_local) self.actions_menu.addAction(self.menu_stash) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_fetch) self.actions_menu.addAction(self.menu_push) self.actions_menu.addAction(self.menu_pull) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_create_tag) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_export_patches) self.actions_menu.addAction(self.menu_cherry_pick) self.actions_menu.addSeparator() self.actions_menu.addAction(self.menu_merge_abort) self.actions_menu.addAction(self.menu_grep) # Add to menubar self.menubar.addAction(self.actions_menu.menuAction()) # Diff Menu self.diff_menu = create_menu("&Diff", self.menubar) self.diff_menu.addAction(self.menu_branch_diff) self.diff_menu.addAction(self.menu_diff_expression) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_branch_compare) self.diff_menu.addAction(self.menu_commit_compare) self.diff_menu.addAction(self.menu_commit_compare_file) self.diff_menu.addSeparator() self.diff_menu.addAction(self.menu_show_diffstat) # Add to menubar self.menubar.addAction(self.diff_menu.menuAction()) # Tools Menu self.tools_menu = create_menu("&Tools", self.menubar) self.tools_menu.addAction(self.menu_classic) self.tools_menu.addAction(self.menu_dag) self.tools_menu.addSeparator() if self.classic_dockable: self.tools_menu.addAction(self.classicdockwidget.toggleViewAction()) self.setup_dockwidget_tools_menu() self.menubar.addAction(self.tools_menu.menuAction()) # Help Menu self.help_menu = create_menu("&Help", self.menubar) self.help_menu.addAction(self.menu_help_docs) self.help_menu.addAction(self.menu_help_shortcuts) self.help_menu.addAction(self.menu_help_about) # Add to menubar self.menubar.addAction(self.help_menu.menuAction()) # Set main menu self.setMenuBar(self.menubar) # Arrange dock widgets top = Qt.TopDockWidgetArea bottom = Qt.BottomDockWidgetArea self.addDockWidget(top, self.commitdockwidget) if self.classic_dockable: self.addDockWidget(top, self.classicdockwidget) self.addDockWidget(top, self.statusdockwidget) self.addDockWidget(top, self.actionsdockwidget) self.addDockWidget(bottom, self.logdockwidget) if self.classic_dockable: self.tabifyDockWidget(self.classicdockwidget, self.commitdockwidget) self.tabifyDockWidget(self.logdockwidget, self.diffdockwidget) # Listen for model notifications model.add_message_observer(model.message_mode_changed, self._mode_changed) model.add_message_observer(model.message_updated, self._update_view) prefs_model.add_message_observer(prefs_model.message_config_updated, self._config_updated) # Add button callbacks connect_button(self.rescan_button, emit(self, signals.rescan_and_refresh)) connect_button(self.alt_button, emit(self, signals.reset_mode)) connect_button(self.fetch_button, guicmds.fetch) connect_button(self.push_button, guicmds.push) connect_button(self.pull_button, guicmds.pull) connect_button(self.stash_button, stash.stash) connect_button(self.stage_button, self.stage) connect_button(self.unstage_button, self.unstage) self.connect(self, SIGNAL("update"), self._update_callback) self.connect(self, SIGNAL("apply_state"), self.apply_state) self.connect(self, SIGNAL("install_config_actions"), self._install_config_actions) # Install .git-config-defined actions self._config_task = None self.install_config_actions() # Restore saved settings self._gui_state_task = None self._load_gui_state() log(0, self.model.git_version + "\ncola version " + version.version())
def __init__(self, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self._layt = QtGui.QVBoxLayout() self._layt.setMargin(0) self._layt.setSpacing(0) self.commitmsg = CommitMessageTextEdit(model, self) self.commitmsg.setFont(diff_font()) self._ctrls_layt = QtGui.QHBoxLayout() self._ctrls_layt.setSpacing(4) self._ctrls_layt.setMargin(4) # Sign off and commit buttons self.signoff_button = create_toolbutton(self, text='Sign Off', tooltip='Sign off on this commit', icon=apply_icon()) self.commit_button = create_toolbutton(self, text='Commit@@verb', tooltip='Commit staged changes', icon=save_icon()) # Position display self.position_label = QtGui.QLabel() self.position_label.setAlignment(Qt.AlignCenter | Qt.AlignVCenter) # Amend checkbox self.amend_checkbox = QtGui.QCheckBox() self.amend_checkbox.setText(tr('Amend Last Commit')) self._ctrls_layt.addWidget(self.signoff_button) self._ctrls_layt.addWidget(self.commit_button) self._ctrls_layt.addWidget(self.position_label) self._ctrls_layt.addStretch() self._ctrls_layt.addWidget(self.amend_checkbox) self._layt.addWidget(self.commitmsg) self._layt.addLayout(self._ctrls_layt) self.setLayout(self._layt) relay_signal(self, self.commitmsg, SIGNAL(signals.load_previous_message)) connect_button(self.commit_button, self.commit) cola.notifier().connect(signals.amend, self.amend_checkbox.setChecked) # Broadcast the amend mode self.connect(self.amend_checkbox, SIGNAL('toggled(bool)'), emit(self, signals.amend_mode)) self.connect(self.signoff_button, SIGNAL('clicked()'), emit(self, signals.signoff)) # Display the current column self.connect(self.commitmsg, SIGNAL('cursorPositionChanged()'), self.show_cursor_position) # Initialize the GUI to show 'Column: 00' self.show_cursor_position()
def __init__(self, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self.notifying = False self.summary = CommitSummaryLineEdit() self.description = CommitMessageTextEdit() self.commit_button = create_toolbutton(text='Commit@@verb', tooltip='Commit staged changes', icon=save_icon()) self.actions_menu = QtGui.QMenu() self.actions_button = create_toolbutton(icon=options_icon(), tooltip='Actions...') self.actions_button.setMenu(self.actions_menu) self.actions_button.setPopupMode(QtGui.QToolButton.InstantPopup) # Amend checkbox self.signoff_action = self.actions_menu.addAction(tr('Sign Off')) self.signoff_action.setToolTip('Sign off on this commit') self.signoff_action.setShortcut('Ctrl+i') self.commit_action = self.actions_menu.addAction(tr('Commit@@verb')) self.commit_action.setToolTip(tr('Commit staged changes')) self.commit_action.setShortcut('Ctrl+Return') self.actions_menu.addSeparator() self.amend_action = self.actions_menu.addAction(tr('Amend Last Commit')) self.amend_action.setCheckable(True) self.prev_commits_menu = self.actions_menu.addMenu( 'Load Previous Commit Message') self.connect(self.prev_commits_menu, SIGNAL('aboutToShow()'), self.build_prev_commits_menu) self.toplayout = QtGui.QHBoxLayout() self.toplayout.setMargin(0) self.toplayout.setSpacing(defs.spacing) self.toplayout.addWidget(self.actions_button) self.toplayout.addWidget(self.summary) self.toplayout.addWidget(self.commit_button) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.mainlayout.addLayout(self.toplayout) self.mainlayout.addWidget(self.description) self.setLayout(self.mainlayout) relay_signal(self, self.description, SIGNAL(signals.load_previous_message)) connect_button(self.commit_button, self.commit) connect_action(self.commit_action, self.commit) connect_action(self.signoff_action, emit(self, signals.signoff)) cola.notifier().connect(signals.amend, self.amend_action.setChecked) # Broadcast the amend mode connect_action_bool(self.amend_action, emit(self, signals.amend_mode)) self.model.add_observer(self.model.message_commit_message_changed, self.set_commit_message) self.connect(self.summary, SIGNAL('returnPressed()'), self.focus_description) self.connect(self.summary, SIGNAL('downPressed()'), self.focus_description) self.connect(self.summary, SIGNAL('cursorPosition(int,int)'), self.emit_position) self.connect(self.description, SIGNAL('cursorPosition(int,int)'), # description starts at line 2 lambda row, col: self.emit_position(row + 2, col)) # Keep model informed of changes self.connect(self.summary, SIGNAL('textChanged(QString)'), self.commit_message_changed) self.connect(self.description, SIGNAL('textChanged()'), self.commit_message_changed) self.connect(self.description, SIGNAL('shiftTab()'), self.focus_summary) self.setFont(diff_font()) self.summary.enable_hint(True) self.description.enable_hint(True) self.commit_button.setEnabled(False) self.commit_action.setEnabled(False) self.setFocusProxy(self.summary)
def __init__(self, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self.notifying = False self._linebreak = None self._textwidth = None self._tabwidth = None # Actions self.signoff_action = add_action(self, 'Sign Off', emit(self, signals.signoff), 'Ctrl+I') self.signoff_action.setToolTip('Sign off on this commit') self.commit_action = add_action(self, 'Commit@@verb', self.commit, 'Ctrl+Return') self.commit_action.setToolTip(tr('Commit staged changes')) # Widgets self.summary = CommitSummaryLineEdit() self.summary.extra_actions.append(self.signoff_action) self.summary.extra_actions.append(self.commit_action) self.description = CommitMessageTextEdit() self.description.extra_actions.append(self.signoff_action) self.description.extra_actions.append(self.commit_action) commit_button_tooltip = 'Commit staged changes\nShortcut: Ctrl+Enter' self.commit_button = create_toolbutton(text='Commit@@verb', tooltip=commit_button_tooltip, icon=save_icon()) self.actions_menu = QtGui.QMenu() self.actions_button = create_toolbutton(icon=options_icon(), tooltip='Actions...') self.actions_button.setMenu(self.actions_menu) self.actions_button.setPopupMode(QtGui.QToolButton.InstantPopup) self.actions_menu.addAction(self.signoff_action) self.actions_menu.addAction(self.commit_action) self.actions_menu.addSeparator() # Amend checkbox self.amend_action = self.actions_menu.addAction( tr('Amend Last Commit')) self.amend_action.setCheckable(True) # Line wrapping self.actions_menu.addSeparator() self.autowrap_action = self.actions_menu.addAction( tr('Auto-Wrap Lines')) self.autowrap_action.setCheckable(True) self.autowrap_action.setChecked(linebreak()) self.prev_commits_menu = self.actions_menu.addMenu( tr('Load Previous Commit Message')) self.connect(self.prev_commits_menu, SIGNAL('aboutToShow()'), self.build_prev_commits_menu) self.toplayout = QtGui.QHBoxLayout() self.toplayout.setMargin(0) self.toplayout.setSpacing(defs.spacing) self.toplayout.addWidget(self.actions_button) self.toplayout.addWidget(self.summary) self.toplayout.addWidget(self.commit_button) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.mainlayout.addLayout(self.toplayout) self.mainlayout.addWidget(self.description) self.setLayout(self.mainlayout) relay_signal(self, self.description, SIGNAL(signals.load_previous_message)) connect_button(self.commit_button, self.commit) cola.notifier().connect(signals.amend, self.amend_action.setChecked) # Broadcast the amend mode connect_action_bool(self.amend_action, emit(self, signals.amend_mode)) # Handle the one-off autowrapping connect_action_bool(self.autowrap_action, self.set_linebreak) self.model.add_observer(self.model.message_commit_message_changed, self.set_commit_message) self.connect(self.summary, SIGNAL('returnPressed()'), self.focus_description) self.connect(self.summary, SIGNAL('downPressed()'), self.focus_description) self.connect(self.summary, SIGNAL('cursorPosition(int,int)'), self.emit_position) self.connect( self.description, SIGNAL('cursorPosition(int,int)'), # description starts at line 2 lambda row, col: self.emit_position(row + 2, col)) # Keep model informed of changes self.connect(self.summary, SIGNAL('textChanged(QString)'), self.commit_message_changed) self.connect(self.description, SIGNAL('textChanged()'), self.commit_message_changed) self.connect(self.description, SIGNAL('shiftTab()'), self.focus_summary) self.setFont(diff_font()) self.summary.enable_hint(True) self.description.enable_hint(True) self.commit_button.setEnabled(False) self.commit_action.setEnabled(False) self.setFocusProxy(self.summary) self.set_tabwidth(tabwidth()) self.set_textwidth(textwidth()) self.set_linebreak(linebreak()) # Allow tab to jump from the summary to the description self.setTabOrder(self.summary, self.description)
def __init__(self, model, parent): QtGui.QWidget.__init__(self, parent) self.model = model self.notifying = False self.summary_placeholder = u'Commit summary' self.description_placeholder = u'Extended description...' # Palette for normal text self.default_palette = QtGui.QPalette(self.palette()) # Palette used for the placeholder text self.placeholder_palette = pal = QtGui.QPalette(self.palette()) color = pal.text().color() color.setAlpha(128) pal.setColor(QtGui.QPalette.Active, QtGui.QPalette.Text, color) pal.setColor(QtGui.QPalette.Inactive, QtGui.QPalette.Text, color) self.summary = QtGui.QLineEdit() self.description = CommitMessageTextEdit() self.commit_button = create_toolbutton(text='Commit@@verb', tooltip='Commit staged changes', icon=save_icon()) self.actions_menu = QtGui.QMenu() self.actions_button = create_toolbutton(icon=options_icon(), tooltip='Actions...') self.actions_button.setMenu(self.actions_menu) self.actions_button.setPopupMode(QtGui.QToolButton.InstantPopup) # Amend checkbox self.signoff_action = self.actions_menu.addAction(tr('Sign Off')) self.signoff_action.setToolTip('Sign off on this commit') self.signoff_action.setShortcut('Ctrl+i') self.commit_action = self.actions_menu.addAction(tr('Commit@@verb')) self.commit_action.setToolTip(tr('Commit staged changes')) self.commit_action.setShortcut('Ctrl+m') self.actions_menu.addSeparator() self.amend_action = self.actions_menu.addAction(tr('Amend Last Commit')) self.amend_action.setCheckable(True) self.prev_commits_menu = self.actions_menu.addMenu( 'Load Previous Commit Message') self.connect(self.prev_commits_menu, SIGNAL('aboutToShow()'), self.build_prev_commits_menu) self.toplayout = QtGui.QHBoxLayout() self.toplayout.setMargin(0) self.toplayout.setSpacing(defs.spacing) self.toplayout.addWidget(self.actions_button) self.toplayout.addWidget(self.summary) self.toplayout.addWidget(self.commit_button) self.mainlayout = QtGui.QVBoxLayout() self.mainlayout.setMargin(defs.margin) self.mainlayout.setSpacing(defs.spacing) self.mainlayout.addLayout(self.toplayout) self.mainlayout.addWidget(self.description) self.setLayout(self.mainlayout) relay_signal(self, self.description, SIGNAL(signals.load_previous_message)) connect_button(self.commit_button, self.commit) connect_action(self.commit_action, self.commit) connect_action(self.signoff_action, emit(self, signals.signoff)) cola.notifier().connect(signals.amend, self.amend_action.setChecked) # Broadcast the amend mode connect_action_bool(self.amend_action, emit(self, signals.amend_mode)) self.model.add_message_observer(self.model.message_commit_message_changed, self.set_commit_message) self.connect(self.summary, SIGNAL('returnPressed()'), self.summary_return_pressed) # Keep model informed of changes self.connect(self.summary, SIGNAL('textChanged(QString)'), self.commit_message_changed) self.connect(self.description, SIGNAL('textChanged()'), self.commit_message_changed) self.setFocusProxy(self.summary) self.setFont(diff_font()) self.summary.installEventFilter(self) self.description.installEventFilter(self) self.enable_placeholder_summary(True) self.enable_placeholder_description(True) self.commit_button.setEnabled(False) self.commit_action.setEnabled(False)