Added support for stashes
Generalized the commit dialog to support stashes Parameters are now quoted in the log if necessary Fixed another issue with the folderview show/hide logic Various minor ui tweaks FossilOrigin-Name: ce70efe67a1fe0087cc6d3aa79757a5011c57db2
This commit is contained in:
		| @@ -3,7 +3,7 @@ | |||||||
| #include "ui_CommitDialog.h" | #include "ui_CommitDialog.h" | ||||||
| #include "MainWindow.h" // Ugly. I know. | #include "MainWindow.h" // Ugly. I know. | ||||||
|  |  | ||||||
| CommitDialog::CommitDialog(QWidget *parent, const QStringList &commitMsgHistory, QStringList &files) : | CommitDialog::CommitDialog(QWidget *parent, QString title, QStringList &files, const QStringList *history, bool singleLineEntry, const QString *checkBoxText, bool *checkBoxValue) : | ||||||
| 	QDialog(parent, Qt::Sheet), | 	QDialog(parent, Qt::Sheet), | ||||||
|     ui(new Ui::CommitDialog) |     ui(new Ui::CommitDialog) | ||||||
| { | { | ||||||
| @@ -11,20 +11,40 @@ CommitDialog::CommitDialog(QWidget *parent, const QStringList &commitMsgHistory, | |||||||
| 	ui->plainTextEdit->clear(); | 	ui->plainTextEdit->clear(); | ||||||
| 	ui->listView->setModel(&itemModel); | 	ui->listView->setModel(&itemModel); | ||||||
|  |  | ||||||
| 	// Generate the history combo | 	setWindowTitle(title); | ||||||
| 	foreach(const QString msg, commitMsgHistory) |  | ||||||
|  | 	// Activate the appropriate control based on mode | ||||||
|  | 	ui->plainTextEdit->setVisible(!singleLineEntry); | ||||||
|  | 	ui->lineEdit->setVisible(singleLineEntry); | ||||||
|  |  | ||||||
|  | 	// Activate the checkbox if we have some text | ||||||
|  | 	ui->checkBox->setVisible(checkBoxText!=0); | ||||||
|  | 	if(checkBoxText) | ||||||
| 	{ | 	{ | ||||||
| 		QString trimmed = msg.trimmed(); | 		Q_ASSERT(checkBoxValue); | ||||||
| 		if(trimmed.isEmpty()) | 		ui->checkBox->setText(*checkBoxText); | ||||||
| 			continue; | 		ui->checkBox->setCheckState(*checkBoxValue ? Qt::Checked : Qt::Unchecked); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 		commitMessages.append(trimmed); | 	// Activate the combo if we have history | ||||||
| 		QStringList lines = trimmed.split('\n'); | 	ui->comboBox->setVisible(history!=0); | ||||||
| 		QString first_line; | 	if(history) | ||||||
| 		if(!lines.empty()) | 	{ | ||||||
| 			first_line = lines[0] + "..."; | 		// Generate the history combo | ||||||
|  | 		foreach(const QString msg, *history) | ||||||
|  | 		{ | ||||||
|  | 			QString trimmed = msg.trimmed(); | ||||||
|  | 			if(trimmed.isEmpty()) | ||||||
|  | 				continue; | ||||||
|  |  | ||||||
| 		ui->comboBox->addItem(first_line); | 			commitMessages.append(trimmed); | ||||||
|  | 			QStringList lines = trimmed.split('\n'); | ||||||
|  | 			QString first_line; | ||||||
|  | 			if(!lines.empty()) | ||||||
|  | 				first_line = lines[0] + "..."; | ||||||
|  |  | ||||||
|  | 			ui->comboBox->addItem(first_line); | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Populate file list | 	// Populate file list | ||||||
| @@ -44,11 +64,16 @@ CommitDialog::~CommitDialog() | |||||||
| } | } | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| bool CommitDialog::run(QWidget *parent, QString &commitMsg, const QStringList &commitMsgHistory, QStringList &files) | bool CommitDialog::run(QWidget *parent, QString title, QStringList &files, QString &commitMsg, const QStringList *history, bool singleLineEntry, const QString *checkBoxText, bool *checkBoxValue) | ||||||
| { | { | ||||||
| 	CommitDialog dlg(parent, commitMsgHistory, files); | 	CommitDialog dlg(parent, title, files, history, singleLineEntry, checkBoxText, checkBoxValue); | ||||||
| 	int res = dlg.exec(); | 	int res = dlg.exec(); | ||||||
| 	commitMsg = dlg.ui->plainTextEdit->toPlainText(); |  | ||||||
|  | 	if(singleLineEntry) | ||||||
|  | 		commitMsg = dlg.ui->lineEdit->text(); | ||||||
|  | 	else | ||||||
|  | 		commitMsg = dlg.ui->plainTextEdit->toPlainText(); | ||||||
|  |  | ||||||
|  |  | ||||||
| 	if(res!=QDialog::Accepted) | 	if(res!=QDialog::Accepted) | ||||||
| 		return false; | 		return false; | ||||||
| @@ -62,6 +87,12 @@ bool CommitDialog::run(QWidget *parent, QString &commitMsg, const QStringList &c | |||||||
| 		files.append(si->text()); | 		files.append(si->text()); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if(checkBoxText) | ||||||
|  | 	{ | ||||||
|  | 		Q_ASSERT(checkBoxValue); | ||||||
|  | 		*checkBoxValue = dlg.ui->checkBox->checkState() == Qt::Checked; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return true; | 	return true; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -69,7 +100,12 @@ bool CommitDialog::run(QWidget *parent, QString &commitMsg, const QStringList &c | |||||||
| void CommitDialog::on_comboBox_activated(int index) | void CommitDialog::on_comboBox_activated(int index) | ||||||
| { | { | ||||||
| 	Q_ASSERT(index < commitMessages.length()); | 	Q_ASSERT(index < commitMessages.length()); | ||||||
| 	ui->plainTextEdit->setPlainText(commitMessages[index]); |  | ||||||
|  | 	if(ui->plainTextEdit->isVisible()) | ||||||
|  | 		ui->plainTextEdit->setPlainText(commitMessages[index]); | ||||||
|  |  | ||||||
|  | 	if(ui->lineEdit->isVisible()) | ||||||
|  | 		ui->lineEdit->setText(commitMessages[index]); | ||||||
| } | } | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
|   | |||||||
| @@ -13,10 +13,10 @@ class CommitDialog : public QDialog | |||||||
|     Q_OBJECT |     Q_OBJECT | ||||||
|  |  | ||||||
| public: | public: | ||||||
| 	explicit CommitDialog(QWidget *parent, const QStringList &commitMsgHistory, QStringList &files); | 	explicit CommitDialog(QWidget *parent, QString title, QStringList &files, const QStringList *history=0, bool singleLineEntry=false, const QString *checkBoxText=0, bool *checkBoxValue=0); | ||||||
|     ~CommitDialog(); |     ~CommitDialog(); | ||||||
|  |  | ||||||
| 	static bool run(QWidget *parent, QString &commitMsg, const QStringList &commitMsgHistory, QStringList &files); | 	static bool run(QWidget *parent, QString title, QStringList &files, QString &commitMsg, const QStringList *history=0, bool singleLineEntry=false, const QString *checkBoxText=0, bool *checkBoxValue=0); | ||||||
|  |  | ||||||
| private slots: | private slots: | ||||||
| 	void on_comboBox_activated(int index); | 	void on_comboBox_activated(int index); | ||||||
|   | |||||||
| @@ -23,6 +23,9 @@ | |||||||
|    <item> |    <item> | ||||||
|     <widget class="QComboBox" name="comboBox"/> |     <widget class="QComboBox" name="comboBox"/> | ||||||
|    </item> |    </item> | ||||||
|  |    <item> | ||||||
|  |     <widget class="QLineEdit" name="lineEdit"/> | ||||||
|  |    </item> | ||||||
|    <item> |    <item> | ||||||
|     <widget class="QSplitter" name="splitter"> |     <widget class="QSplitter" name="splitter"> | ||||||
|      <property name="orientation"> |      <property name="orientation"> | ||||||
| @@ -58,6 +61,13 @@ | |||||||
|      </widget> |      </widget> | ||||||
|     </widget> |     </widget> | ||||||
|    </item> |    </item> | ||||||
|  |    <item> | ||||||
|  |     <widget class="QCheckBox" name="checkBox"> | ||||||
|  |      <property name="text"> | ||||||
|  |       <string>CheckBox</string> | ||||||
|  |      </property> | ||||||
|  |     </widget> | ||||||
|  |    </item> | ||||||
|    <item> |    <item> | ||||||
|     <widget class="QDialogButtonBox" name="buttonBox"> |     <widget class="QDialogButtonBox" name="buttonBox"> | ||||||
|      <property name="orientation"> |      <property name="orientation"> | ||||||
|   | |||||||
							
								
								
									
										244
									
								
								MainWindow.cpp
									
									
									
									
									
								
							
							
						
						
									
										244
									
								
								MainWindow.cpp
									
									
									
									
									
								
							| @@ -124,6 +124,12 @@ MainWindow::MainWindow(QWidget *parent) : | |||||||
| 	ui->treeView->addAction(ui->actionRenameFolder); | 	ui->treeView->addAction(ui->actionRenameFolder); | ||||||
| 	ui->treeView->addAction(ui->actionOpenFolder); | 	ui->treeView->addAction(ui->actionOpenFolder); | ||||||
|  |  | ||||||
|  | 	// StashView | ||||||
|  | 	ui->tableViewStash->setModel(&repoStashModel); | ||||||
|  | 	ui->tableViewStash->addAction(ui->actionApplyStash); | ||||||
|  | 	ui->tableViewStash->addAction(ui->actionDiffStash); | ||||||
|  | 	ui->tableViewStash->addAction(ui->actionDeleteStash); | ||||||
|  |  | ||||||
| 	// Recent Workspaces | 	// Recent Workspaces | ||||||
| 	// Locate a sequence of two separator actions in file menu | 	// Locate a sequence of two separator actions in file menu | ||||||
| 	QList<QAction*> file_actions = ui->menuFile->actions(); | 	QList<QAction*> file_actions = ui->menuFile->actions(); | ||||||
| @@ -632,9 +638,40 @@ void MainWindow::scanWorkspace() | |||||||
| 		pathSet.insert(path); | 		pathSet.insert(path); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// Load the stash | ||||||
|  | 	stashMap.clear(); | ||||||
|  | 	res.clear(); | ||||||
|  | 	if(!runFossil(QStringList() << "stash" << "ls", &res, RUNGLAGS_SILENT_ALL)) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	for(QStringList::iterator line_it=res.begin(); line_it!=res.end(); ++line_it) | ||||||
|  | 	{ | ||||||
|  | 		QString l = (*line_it).trimmed(); | ||||||
|  | 		int colon = l.indexOf(':'); | ||||||
|  |  | ||||||
|  | 		// When no colon we have no stash to process | ||||||
|  | 		if(colon==-1) | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 		QString id = l.left(colon); | ||||||
|  |  | ||||||
|  | 		// Parse stash name | ||||||
|  | 		++line_it; | ||||||
|  |  | ||||||
|  | 		// Invalid stash, exit | ||||||
|  | 		if(line_it==res.end()) | ||||||
|  | 			break; | ||||||
|  |  | ||||||
|  | 		QString name = (*line_it); | ||||||
|  | 		name = name.trimmed(); | ||||||
|  | 		stashMap.insert(name, id); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
| 	// Update the file item model | 	// Update the file item model | ||||||
| 	updateDirView(); | 	updateDirView(); | ||||||
| 	updateFileView(); | 	updateFileView(); | ||||||
|  | 	updateStashView(); | ||||||
|  |  | ||||||
| 	setEnabled(true); | 	setEnabled(true); | ||||||
| 	setStatus(""); | 	setStatus(""); | ||||||
| @@ -682,6 +719,11 @@ void MainWindow::updateDirView() | |||||||
| { | { | ||||||
| 	// Directory View | 	// Directory View | ||||||
| 	repoDirModel.clear(); | 	repoDirModel.clear(); | ||||||
|  |  | ||||||
|  | 	QStringList header; | ||||||
|  | 	header << tr("Folders"); | ||||||
|  | 	repoDirModel.setHorizontalHeaderLabels(header); | ||||||
|  |  | ||||||
| 	QStandardItem *root = new QStandardItem(QIcon(":icons/icons/My Documents-01.png"), projectName); | 	QStandardItem *root = new QStandardItem(QIcon(":icons/icons/My Documents-01.png"), projectName); | ||||||
| 	root->setData(""); // Empty Path | 	root->setData(""); // Empty Path | ||||||
| 	root->setEditable(false); | 	root->setEditable(false); | ||||||
| @@ -825,6 +867,24 @@ MainWindow::RepoStatus MainWindow::getRepoStatus() | |||||||
|  |  | ||||||
| 	return run_ok ? REPO_OK : REPO_NOT_FOUND; | 	return run_ok ? REPO_OK : REPO_NOT_FOUND; | ||||||
| } | } | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  | void MainWindow::updateStashView() | ||||||
|  | { | ||||||
|  | 	repoStashModel.clear(); | ||||||
|  |  | ||||||
|  | 	QStringList header; | ||||||
|  | 	header << tr("Stashes"); | ||||||
|  | 	repoStashModel.setHorizontalHeaderLabels(header); | ||||||
|  |  | ||||||
|  | 	for(stashmap_t::iterator it=stashMap.begin(); it!=stashMap.end(); ++it) | ||||||
|  | 	{ | ||||||
|  | 		QStandardItem *item = new QStandardItem(it.key()); | ||||||
|  | 		repoStashModel.appendRow(item); | ||||||
|  | 	} | ||||||
|  | 	ui->tableViewStash->resizeColumnsToContents(); | ||||||
|  | 	ui->tableViewStash->resizeRowsToContents(); | ||||||
|  | } | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| void MainWindow::log(const QString &text, bool isHTML) | void MainWindow::log(const QString &text, bool isHTML) | ||||||
| { | { | ||||||
| @@ -885,7 +945,17 @@ bool MainWindow::runFossilRaw(const QStringList &args, QStringList *output, int | |||||||
| 	bool detached = (runFlags & RUNGLAGS_DETACHED) != 0; | 	bool detached = (runFlags & RUNGLAGS_DETACHED) != 0; | ||||||
|  |  | ||||||
| 	if(!silent_input) | 	if(!silent_input) | ||||||
| 		log("<b>> fossil "+args.join(" ")+"</b><br>", true); | 	{ | ||||||
|  | 		QString params; | ||||||
|  | 		foreach(QString p, args) | ||||||
|  | 		{ | ||||||
|  | 			if(p.indexOf(' ')!=-1) | ||||||
|  | 				params += '"' + p + "\" "; | ||||||
|  | 			else | ||||||
|  | 				params += p + ' '; | ||||||
|  | 		} | ||||||
|  | 		log("<b>> fossil "+params+"</b><br>", true); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	QString wkdir = getCurrentWorkspace(); | 	QString wkdir = getCurrentWorkspace(); | ||||||
|  |  | ||||||
| @@ -914,13 +984,19 @@ bool MainWindow::runFossilRaw(const QStringList &args, QStringList *output, int | |||||||
| 	fossilAbort = false; | 	fossilAbort = false; | ||||||
| 	QString buffer; | 	QString buffer; | ||||||
|  |  | ||||||
| 	while(process.state()==QProcess::Running || process.bytesAvailable()>0) | 	while(true) | ||||||
| 	{ | 	{ | ||||||
|  | 		QProcess::ProcessState state = process.state(); | ||||||
|  | 		qint64 bytes_avail = process.bytesAvailable(); | ||||||
|  |  | ||||||
|  | 		if(state!=QProcess::Running && bytes_avail<1) | ||||||
|  | 			break; | ||||||
|  |  | ||||||
| 		if(fossilAbort) | 		if(fossilAbort) | ||||||
| 		{ | 		{ | ||||||
| 			log("\n* "+tr("Terminated")+" *\n"); | 			log("\n* "+tr("Terminated")+" *\n"); | ||||||
| 			#ifdef Q_WS_WIN | 			#ifdef Q_WS_WIN | ||||||
| 				fossilUI.kill(); // QT on windows cannot terminate console processes with QProcess::terminate | 				process.kill(); // QT on windows cannot terminate console processes with QProcess::terminate | ||||||
| 			#else | 			#else | ||||||
| 				process.terminate(); | 				process.terminate(); | ||||||
| 			#endif | 			#endif | ||||||
| @@ -1137,8 +1213,13 @@ void MainWindow::loadSettings() | |||||||
| 	if(qsettings.contains("ViewAsList")) | 	if(qsettings.contains("ViewAsList")) | ||||||
| 	{ | 	{ | ||||||
| 		ui->actionViewAsList->setChecked(qsettings.value("ViewAsList").toBool()); | 		ui->actionViewAsList->setChecked(qsettings.value("ViewAsList").toBool()); | ||||||
| 		ui->treeView->setVisible(qsettings.value("ViewAsList").toBool() == VIEWMODE_LIST); | 		viewMode = qsettings.value("ViewAsList").toBool()? VIEWMODE_LIST : VIEWMODE_TREE; | ||||||
| 	} | 	} | ||||||
|  | 	ui->treeView->setVisible(viewMode == VIEWMODE_TREE); | ||||||
|  |  | ||||||
|  | 	if(qsettings.contains("ViewStash")) | ||||||
|  | 		ui->actionViewStash->setChecked(qsettings.value("ViewStash").toBool()); | ||||||
|  | 	ui->tableViewStash->setVisible(ui->actionViewStash->isChecked()); | ||||||
| } | } | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| @@ -1173,6 +1254,7 @@ void MainWindow::saveSettings() | |||||||
| 	qsettings.setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked()); | 	qsettings.setValue("ViewUnchanged", ui->actionViewUnchanged->isChecked()); | ||||||
| 	qsettings.setValue("ViewIgnored", ui->actionViewIgnored->isChecked()); | 	qsettings.setValue("ViewIgnored", ui->actionViewIgnored->isChecked()); | ||||||
| 	qsettings.setValue("ViewAsList", ui->actionViewAsList->isChecked()); | 	qsettings.setValue("ViewAsList", ui->actionViewAsList->isChecked()); | ||||||
|  | 	qsettings.setValue("ViewStash", ui->actionViewStash->isChecked()); | ||||||
| } | } | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| @@ -1285,6 +1367,28 @@ void MainWindow::getFileViewSelection(QStringList &filenames, int includeMask, b | |||||||
| 		filenames.append(filename); | 		filenames.append(filename); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  | void MainWindow::getStashViewSelection(QStringList &stashNames, bool allIfEmpty) | ||||||
|  | { | ||||||
|  | 	QModelIndexList selection = ui->tableViewStash->selectionModel()->selectedIndexes(); | ||||||
|  | 	if(selection.empty() && allIfEmpty) | ||||||
|  | 	{ | ||||||
|  | 		ui->tableViewStash->selectAll(); | ||||||
|  | 		selection = ui->tableViewStash->selectionModel()->selectedIndexes(); | ||||||
|  | 		ui->tableViewStash->clearSelection(); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for(QModelIndexList::iterator mi_it = selection.begin(); mi_it!=selection.end(); ++mi_it) | ||||||
|  | 	{ | ||||||
|  | 		const QModelIndex &mi = *mi_it; | ||||||
|  |  | ||||||
|  | 		if(mi.column()!=0) | ||||||
|  | 			continue; | ||||||
|  | 		QString name = repoStashModel.data(mi).toString(); | ||||||
|  | 		stashNames.append(name); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| //------------------------------------------------------------------------------ | //------------------------------------------------------------------------------ | ||||||
| bool MainWindow::diffFile(QString repoFile) | bool MainWindow::diffFile(QString repoFile) | ||||||
| { | { | ||||||
| @@ -1462,7 +1566,7 @@ void MainWindow::on_actionCommit_triggered() | |||||||
| 	QStringList commit_msgs = settings.Mappings[FUEL_SETTING_COMMIT_MSG].Value.toStringList(); | 	QStringList commit_msgs = settings.Mappings[FUEL_SETTING_COMMIT_MSG].Value.toStringList(); | ||||||
|  |  | ||||||
| 	QString msg; | 	QString msg; | ||||||
| 	bool aborted = !CommitDialog::run(this, msg, commit_msgs, modified_files); | 	bool aborted = !CommitDialog::run(this, tr("Commit Changes"), modified_files, msg, &commit_msgs); | ||||||
|  |  | ||||||
| 	// Aborted or not we always keep the commit messages. | 	// Aborted or not we always keep the commit messages. | ||||||
| 	// (This has saved me way too many times on TortoiseSVN) | 	// (This has saved me way too many times on TortoiseSVN) | ||||||
| @@ -2046,3 +2150,133 @@ QMenu * MainWindow::createPopupMenu() | |||||||
| 	return NULL; | 	return NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  | void MainWindow::on_actionViewStash_triggered() | ||||||
|  | { | ||||||
|  | 	ui->tableViewStash->setVisible(ui->actionViewStash->isChecked()); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  | void MainWindow::on_actionNewStash_triggered() | ||||||
|  | { | ||||||
|  | 	QStringList stashed_files; | ||||||
|  | 	getSelectionFilenames(stashed_files, RepoFile::TYPE_MODIFIED, true); | ||||||
|  |  | ||||||
|  | 	if(stashed_files.empty()) | ||||||
|  | 		return; | ||||||
|  | 	 | ||||||
|  | 	QString stash_name; | ||||||
|  | 	bool revert = false; | ||||||
|  | 	QString checkbox_text = tr("Revert stashed files"); | ||||||
|  | 	if(!CommitDialog::run(this, tr("Stash Changes"), stashed_files, stash_name, 0, true, &checkbox_text, &revert) || stashed_files.empty()) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	stash_name = stash_name.trimmed(); | ||||||
|  |  | ||||||
|  | 	if(stash_name.indexOf("\"")!=-1 || stash_name.isEmpty()) | ||||||
|  | 	{ | ||||||
|  | 		QMessageBox::critical(this, tr("Error"), tr("Invalid stash name")); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Check that this stash does not exist | ||||||
|  | 	for(stashmap_t::iterator it=stashMap.begin(); it!=stashMap.end(); ++it) | ||||||
|  | 	{ | ||||||
|  | 		if(stash_name == it.key()) | ||||||
|  | 		{ | ||||||
|  | 			QMessageBox::critical(this, tr("Error"), tr("This stash already exists"));			 | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Do Stash | ||||||
|  | 	QString command = "snapshot"; | ||||||
|  | 	if(revert) | ||||||
|  | 		command = "save"; | ||||||
|  |  | ||||||
|  | 	runFossil(QStringList() << "stash" << command << "-m" << stash_name << QuotePaths(stashed_files) ); | ||||||
|  | 	refresh(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  | void MainWindow::on_actionApplyStash_triggered() | ||||||
|  | { | ||||||
|  | 	QStringList stashes; | ||||||
|  | 	getStashViewSelection(stashes); | ||||||
|  |  | ||||||
|  | 	bool delete_stashes = false; | ||||||
|  | 	if(!FileActionDialog::run(this, tr("Apply Stash"), tr("The following stashes will be applied. Are you sure?"), stashes, tr("Delete after applying"), &delete_stashes)) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	// Apply stashes | ||||||
|  | 	for(QStringList::iterator it=stashes.begin(); it!=stashes.end(); ++it) | ||||||
|  | 	{ | ||||||
|  | 		stashmap_t::iterator id_it = stashMap.find(*it); | ||||||
|  | 		Q_ASSERT(id_it!=stashMap.end()); | ||||||
|  |  | ||||||
|  | 		if(!runFossil(QStringList() << "stash" << "apply" << *id_it)) | ||||||
|  | 		{ | ||||||
|  | 			log(tr("Stash application aborted due to errors\n")); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	// Delete stashes | ||||||
|  | 	for(QStringList::iterator it=stashes.begin(); delete_stashes && it!=stashes.end(); ++it) | ||||||
|  | 	{ | ||||||
|  | 		stashmap_t::iterator id_it = stashMap.find(*it); | ||||||
|  | 		Q_ASSERT(id_it!=stashMap.end()); | ||||||
|  |  | ||||||
|  | 		if(!runFossil(QStringList() << "stash" << "drop" << *id_it)) | ||||||
|  | 		{ | ||||||
|  | 			log(tr("Stash deletion aborted due to errors\n")); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	refresh(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  | void MainWindow::on_actionDeleteStash_triggered() | ||||||
|  | { | ||||||
|  | 	QStringList stashes; | ||||||
|  | 	getStashViewSelection(stashes); | ||||||
|  |  | ||||||
|  | 	if(stashes.empty()) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	if(!FileActionDialog::run(this, tr("Delete Stashes"), tr("The following stashes will be deleted. Are you sure?"), stashes)) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	// Delete stashes | ||||||
|  | 	for(QStringList::iterator it=stashes.begin(); it!=stashes.end(); ++it) | ||||||
|  | 	{ | ||||||
|  | 		stashmap_t::iterator id_it = stashMap.find(*it); | ||||||
|  | 		Q_ASSERT(id_it!=stashMap.end()); | ||||||
|  |  | ||||||
|  | 		if(!runFossil(QStringList() << "stash" << "drop" << *id_it)) | ||||||
|  | 		{ | ||||||
|  | 			log(tr("Stash deletion aborted due to errors\n")); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	refresh(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | //------------------------------------------------------------------------------ | ||||||
|  | void MainWindow::on_actionDiffStash_triggered() | ||||||
|  | { | ||||||
|  | 	QStringList stashes; | ||||||
|  | 	getStashViewSelection(stashes); | ||||||
|  |  | ||||||
|  | 	if(stashes.length() != 1) | ||||||
|  | 		return; | ||||||
|  | 	 | ||||||
|  | 	stashmap_t::iterator id_it = stashMap.find(*stashes.begin()); | ||||||
|  | 	Q_ASSERT(id_it!=stashMap.end()); | ||||||
|  | 	 | ||||||
|  | 	// Run diff | ||||||
|  | 	runFossil(QStringList() << "stash" << "diff" << *id_it, 0); | ||||||
|  | } | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								MainWindow.h
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								MainWindow.h
									
									
									
									
									
								
							| @@ -108,8 +108,6 @@ private: | |||||||
| 	QString		Path; | 	QString		Path; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| ////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////// | ||||||
| // MainWindow | // MainWindow | ||||||
| ////////////////////////////////////////////////////////////////////////// | ////////////////////////////////////////////////////////////////////////// | ||||||
| @@ -148,6 +146,7 @@ private: | |||||||
| 	void getSelectionFilenames(QStringList &filenames, int includeMask=RepoFile::TYPE_ALL, bool allIfEmpty=false); | 	void getSelectionFilenames(QStringList &filenames, int includeMask=RepoFile::TYPE_ALL, bool allIfEmpty=false); | ||||||
| 	void getFileViewSelection(QStringList &filenames, int includeMask=RepoFile::TYPE_ALL, bool allIfEmpty=false); | 	void getFileViewSelection(QStringList &filenames, int includeMask=RepoFile::TYPE_ALL, bool allIfEmpty=false); | ||||||
| 	void getDirViewSelection(QStringList &filenames, int includeMask=RepoFile::TYPE_ALL, bool allIfEmpty=false); | 	void getDirViewSelection(QStringList &filenames, int includeMask=RepoFile::TYPE_ALL, bool allIfEmpty=false); | ||||||
|  | 	void getStashViewSelection(QStringList &stashNames, bool allIfEmpty=false); | ||||||
| 	void getSelectionPaths(stringset_t &paths); | 	void getSelectionPaths(stringset_t &paths); | ||||||
| 	bool startUI(); | 	bool startUI(); | ||||||
| 	void stopUI(); | 	void stopUI(); | ||||||
| @@ -161,7 +160,9 @@ private: | |||||||
| 	bool scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec); | 	bool scanDirectory(QFileInfoList &entries, const QString& dirPath, const QString &baseDir, const QString ignoreSpec); | ||||||
| 	void updateDirView(); | 	void updateDirView(); | ||||||
| 	void updateFileView(); | 	void updateFileView(); | ||||||
|  | 	void updateStashView(); | ||||||
| 	void selectRootDir(); | 	void selectRootDir(); | ||||||
|  |  | ||||||
| 	virtual QMenu *createPopupMenu(); | 	virtual QMenu *createPopupMenu(); | ||||||
|  |  | ||||||
| 	enum RepoStatus | 	enum RepoStatus | ||||||
| @@ -218,6 +219,11 @@ private slots: | |||||||
| 	void on_actionNewRepository_triggered(); | 	void on_actionNewRepository_triggered(); | ||||||
| 	void on_actionOpenRepository_triggered(); | 	void on_actionOpenRepository_triggered(); | ||||||
| 	void on_actionCloseRepository_triggered(); | 	void on_actionCloseRepository_triggered(); | ||||||
|  | 	void on_actionViewStash_triggered(); | ||||||
|  | 	void on_actionNewStash_triggered(); | ||||||
|  | 	void on_actionApplyStash_triggered(); | ||||||
|  | 	void on_actionDeleteStash_triggered(); | ||||||
|  | 	void on_actionDiffStash_triggered(); | ||||||
|  |  | ||||||
| private: | private: | ||||||
| 	enum | 	enum | ||||||
| @@ -229,6 +235,7 @@ private: | |||||||
| 	Ui::MainWindow		*ui; | 	Ui::MainWindow		*ui; | ||||||
| 	QStandardItemModel	repoFileModel; | 	QStandardItemModel	repoFileModel; | ||||||
| 	QStandardItemModel	repoDirModel; | 	QStandardItemModel	repoDirModel; | ||||||
|  | 	QStandardItemModel	repoStashModel; | ||||||
| 	QProcess			fossilUI; | 	QProcess			fossilUI; | ||||||
| 	QString				fossilUIPort; | 	QString				fossilUIPort; | ||||||
| 	class QAction		*recentWorkspaceActs[MAX_RECENT]; | 	class QAction		*recentWorkspaceActs[MAX_RECENT]; | ||||||
| @@ -246,8 +253,10 @@ private: | |||||||
| 	// Repo State | 	// Repo State | ||||||
| 	typedef QList<RepoFile*> filelist_t; | 	typedef QList<RepoFile*> filelist_t; | ||||||
| 	typedef QMap<QString, RepoFile*> filemap_t; | 	typedef QMap<QString, RepoFile*> filemap_t; | ||||||
|  | 	typedef QMap<QString, QString> stashmap_t; | ||||||
| 	filemap_t			workspaceFiles; | 	filemap_t			workspaceFiles; | ||||||
| 	stringset_t			pathSet; | 	stringset_t			pathSet; | ||||||
|  | 	stashmap_t			stashMap; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| #endif // MAINWINDOW_H | #endif // MAINWINDOW_H | ||||||
|   | |||||||
							
								
								
									
										152
									
								
								MainWindow.ui
									
									
									
									
									
								
							
							
						
						
									
										152
									
								
								MainWindow.ui
									
									
									
									
									
								
							| @@ -32,7 +32,7 @@ | |||||||
|       </property> |       </property> | ||||||
|       <widget class="QSplitter" name="splitter"> |       <widget class="QSplitter" name="splitter"> | ||||||
|        <property name="sizePolicy"> |        <property name="sizePolicy"> | ||||||
|         <sizepolicy hsizetype="Expanding" vsizetype="Preferred"> |         <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> | ||||||
|          <horstretch>0</horstretch> |          <horstretch>0</horstretch> | ||||||
|          <verstretch>80</verstretch> |          <verstretch>80</verstretch> | ||||||
|         </sizepolicy> |         </sizepolicy> | ||||||
| @@ -42,7 +42,7 @@ | |||||||
|        </property> |        </property> | ||||||
|        <widget class="QTreeView" name="treeView"> |        <widget class="QTreeView" name="treeView"> | ||||||
|         <property name="sizePolicy"> |         <property name="sizePolicy"> | ||||||
|          <sizepolicy hsizetype="Expanding" vsizetype="Expanding"> |          <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> | ||||||
|           <horstretch>20</horstretch> |           <horstretch>20</horstretch> | ||||||
|           <verstretch>0</verstretch> |           <verstretch>0</verstretch> | ||||||
|          </sizepolicy> |          </sizepolicy> | ||||||
| @@ -65,6 +65,9 @@ | |||||||
|         <attribute name="headerVisible"> |         <attribute name="headerVisible"> | ||||||
|          <bool>false</bool> |          <bool>false</bool> | ||||||
|         </attribute> |         </attribute> | ||||||
|  |         <attribute name="headerShowSortIndicator" stdset="0"> | ||||||
|  |          <bool>false</bool> | ||||||
|  |         </attribute> | ||||||
|        </widget> |        </widget> | ||||||
|        <widget class="QTableView" name="tableView"> |        <widget class="QTableView" name="tableView"> | ||||||
|         <property name="sizePolicy"> |         <property name="sizePolicy"> | ||||||
| @@ -94,9 +97,15 @@ | |||||||
|         <property name="wordWrap"> |         <property name="wordWrap"> | ||||||
|          <bool>false</bool> |          <bool>false</bool> | ||||||
|         </property> |         </property> | ||||||
|  |         <attribute name="horizontalHeaderHighlightSections"> | ||||||
|  |          <bool>false</bool> | ||||||
|  |         </attribute> | ||||||
|         <attribute name="horizontalHeaderMinimumSectionSize"> |         <attribute name="horizontalHeaderMinimumSectionSize"> | ||||||
|          <number>20</number> |          <number>20</number> | ||||||
|         </attribute> |         </attribute> | ||||||
|  |         <attribute name="horizontalHeaderShowSortIndicator" stdset="0"> | ||||||
|  |          <bool>false</bool> | ||||||
|  |         </attribute> | ||||||
|         <attribute name="verticalHeaderVisible"> |         <attribute name="verticalHeaderVisible"> | ||||||
|          <bool>false</bool> |          <bool>false</bool> | ||||||
|         </attribute> |         </attribute> | ||||||
| @@ -104,6 +113,44 @@ | |||||||
|          <number>30</number> |          <number>30</number> | ||||||
|         </attribute> |         </attribute> | ||||||
|        </widget> |        </widget> | ||||||
|  |        <widget class="QTableView" name="tableViewStash"> | ||||||
|  |         <property name="sizePolicy"> | ||||||
|  |          <sizepolicy hsizetype="Preferred" vsizetype="Expanding"> | ||||||
|  |           <horstretch>20</horstretch> | ||||||
|  |           <verstretch>0</verstretch> | ||||||
|  |          </sizepolicy> | ||||||
|  |         </property> | ||||||
|  |         <property name="contextMenuPolicy"> | ||||||
|  |          <enum>Qt::ActionsContextMenu</enum> | ||||||
|  |         </property> | ||||||
|  |         <property name="editTriggers"> | ||||||
|  |          <set>QAbstractItemView::NoEditTriggers</set> | ||||||
|  |         </property> | ||||||
|  |         <property name="alternatingRowColors"> | ||||||
|  |          <bool>true</bool> | ||||||
|  |         </property> | ||||||
|  |         <property name="selectionBehavior"> | ||||||
|  |          <enum>QAbstractItemView::SelectRows</enum> | ||||||
|  |         </property> | ||||||
|  |         <property name="showGrid"> | ||||||
|  |          <bool>false</bool> | ||||||
|  |         </property> | ||||||
|  |         <property name="sortingEnabled"> | ||||||
|  |          <bool>true</bool> | ||||||
|  |         </property> | ||||||
|  |         <property name="wordWrap"> | ||||||
|  |          <bool>false</bool> | ||||||
|  |         </property> | ||||||
|  |         <attribute name="horizontalHeaderHighlightSections"> | ||||||
|  |          <bool>false</bool> | ||||||
|  |         </attribute> | ||||||
|  |         <attribute name="horizontalHeaderStretchLastSection"> | ||||||
|  |          <bool>true</bool> | ||||||
|  |         </attribute> | ||||||
|  |         <attribute name="verticalHeaderVisible"> | ||||||
|  |          <bool>false</bool> | ||||||
|  |         </attribute> | ||||||
|  |        </widget> | ||||||
|       </widget> |       </widget> | ||||||
|       <widget class="QTextBrowser" name="textBrowser"> |       <widget class="QTextBrowser" name="textBrowser"> | ||||||
|        <property name="sizePolicy"> |        <property name="sizePolicy"> | ||||||
| @@ -128,7 +175,7 @@ | |||||||
|    </property> |    </property> | ||||||
|    <widget class="QMenu" name="menuFile"> |    <widget class="QMenu" name="menuFile"> | ||||||
|     <property name="title"> |     <property name="title"> | ||||||
|      <string>File</string> |      <string>&File</string> | ||||||
|     </property> |     </property> | ||||||
|     <addaction name="actionNewRepository"/> |     <addaction name="actionNewRepository"/> | ||||||
|     <addaction name="actionOpenRepository"/> |     <addaction name="actionOpenRepository"/> | ||||||
| @@ -141,19 +188,21 @@ | |||||||
|    </widget> |    </widget> | ||||||
|    <widget class="QMenu" name="menuHelp"> |    <widget class="QMenu" name="menuHelp"> | ||||||
|     <property name="title"> |     <property name="title"> | ||||||
|      <string>Help</string> |      <string>&Help</string> | ||||||
|     </property> |     </property> | ||||||
|     <addaction name="actionAbout"/> |     <addaction name="actionAbout"/> | ||||||
|    </widget> |    </widget> | ||||||
|    <widget class="QMenu" name="menuView"> |    <widget class="QMenu" name="menuView"> | ||||||
|     <property name="title"> |     <property name="title"> | ||||||
|      <string>View</string> |      <string>&View</string> | ||||||
|     </property> |     </property> | ||||||
|     <addaction name="actionViewModified"/> |     <addaction name="actionViewModified"/> | ||||||
|     <addaction name="actionViewUnchanged"/> |     <addaction name="actionViewUnchanged"/> | ||||||
|     <addaction name="actionViewUnknown"/> |     <addaction name="actionViewUnknown"/> | ||||||
|     <addaction name="actionViewIgnored"/> |     <addaction name="actionViewIgnored"/> | ||||||
|     <addaction name="separator"/> |     <addaction name="separator"/> | ||||||
|  |     <addaction name="actionViewStash"/> | ||||||
|  |     <addaction name="separator"/> | ||||||
|     <addaction name="actionViewAsList"/> |     <addaction name="actionViewAsList"/> | ||||||
|    </widget> |    </widget> | ||||||
|    <addaction name="menuFile"/> |    <addaction name="menuFile"/> | ||||||
| @@ -199,6 +248,8 @@ | |||||||
|    <addaction name="actionRevert"/> |    <addaction name="actionRevert"/> | ||||||
|    <addaction name="actionDelete"/> |    <addaction name="actionDelete"/> | ||||||
|    <addaction name="separator"/> |    <addaction name="separator"/> | ||||||
|  |    <addaction name="actionNewStash"/> | ||||||
|  |    <addaction name="separator"/> | ||||||
|    <addaction name="actionDiff"/> |    <addaction name="actionDiff"/> | ||||||
|    <addaction name="actionHistory"/> |    <addaction name="actionHistory"/> | ||||||
|    <addaction name="separator"/> |    <addaction name="separator"/> | ||||||
| @@ -305,7 +356,7 @@ | |||||||
|      <normaloff>:/icons/icons/Document Blank-01.png</normaloff>:/icons/icons/Document Blank-01.png</iconset> |      <normaloff>:/icons/icons/Document Blank-01.png</normaloff>:/icons/icons/Document Blank-01.png</iconset> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>New...</string> |     <string>&New...</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="toolTip"> |    <property name="toolTip"> | ||||||
|     <string>Make a new Fossil repository</string> |     <string>Make a new Fossil repository</string> | ||||||
| @@ -323,7 +374,7 @@ | |||||||
|      <normaloff>:/icons/icons/My Documents-01.png</normaloff>:/icons/icons/My Documents-01.png</iconset> |      <normaloff>:/icons/icons/My Documents-01.png</normaloff>:/icons/icons/My Documents-01.png</iconset> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Open...</string> |     <string>&Open...</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="toolTip"> |    <property name="toolTip"> | ||||||
|     <string>Open a Fossil repository or workspace folder</string> |     <string>Open a Fossil repository or workspace folder</string> | ||||||
| @@ -340,7 +391,7 @@ | |||||||
|   </action> |   </action> | ||||||
|   <action name="actionCloseRepository"> |   <action name="actionCloseRepository"> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Close</string> |     <string>&Close</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="toolTip"> |    <property name="toolTip"> | ||||||
|     <string>Close the current workspace</string> |     <string>Close the current workspace</string> | ||||||
| @@ -418,7 +469,7 @@ | |||||||
|      <normaloff>:/icons/icons/Button Turn Off-01.png</normaloff>:/icons/icons/Button Turn Off-01.png</iconset> |      <normaloff>:/icons/icons/Button Turn Off-01.png</normaloff>:/icons/icons/Button Turn Off-01.png</iconset> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Quit</string> |     <string>&Quit</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="statusTip"> |    <property name="statusTip"> | ||||||
|     <string>Quit</string> |     <string>Quit</string> | ||||||
| @@ -532,7 +583,7 @@ | |||||||
|   <action name="actionOpenContaining"> |   <action name="actionOpenContaining"> | ||||||
|    <property name="icon"> |    <property name="icon"> | ||||||
|     <iconset resource="resources.qrc"> |     <iconset resource="resources.qrc"> | ||||||
|      <normaloff>:/icons/icons/My Documents-01.png</normaloff>:/icons/icons/My Documents-01.png</iconset> |      <normaloff>:/icons/icons/Folder-01.png</normaloff>:/icons/icons/Folder-01.png</iconset> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Open Containing</string> |     <string>Open Containing</string> | ||||||
| @@ -571,7 +622,7 @@ | |||||||
|      <normaloff>:/icons/icons/Battery-01.png</normaloff>:/icons/icons/Battery-01.png</iconset> |      <normaloff>:/icons/icons/Battery-01.png</normaloff>:/icons/icons/Battery-01.png</iconset> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>About...</string> |     <string>&About...</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="statusTip"> |    <property name="statusTip"> | ||||||
|     <string>About Fuel</string> |     <string>About Fuel</string> | ||||||
| @@ -601,7 +652,7 @@ | |||||||
|      <normaloff>:/icons/icons/Gear-01.png</normaloff>:/icons/icons/Gear-01.png</iconset> |      <normaloff>:/icons/icons/Gear-01.png</normaloff>:/icons/icons/Gear-01.png</iconset> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Preferences...</string> |     <string>&Preferences...</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="toolTip"> |    <property name="toolTip"> | ||||||
|     <string>Fuel Preferences</string> |     <string>Fuel Preferences</string> | ||||||
| @@ -618,7 +669,7 @@ | |||||||
|     <bool>true</bool> |     <bool>true</bool> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Modified</string> |     <string>&Modified</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="statusTip"> |    <property name="statusTip"> | ||||||
|     <string>Show modifed files</string> |     <string>Show modifed files</string> | ||||||
| @@ -632,7 +683,7 @@ | |||||||
|     <bool>true</bool> |     <bool>true</bool> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Unchanged</string> |     <string>&Unchanged</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="statusTip"> |    <property name="statusTip"> | ||||||
|     <string>Show unchanged files</string> |     <string>Show unchanged files</string> | ||||||
| @@ -646,7 +697,7 @@ | |||||||
|     <bool>true</bool> |     <bool>true</bool> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Unknown</string> |     <string>Un&known</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="statusTip"> |    <property name="statusTip"> | ||||||
|     <string>Show unknown files</string> |     <string>Show unknown files</string> | ||||||
| @@ -657,7 +708,7 @@ | |||||||
|     <bool>true</bool> |     <bool>true</bool> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Ignored</string> |     <string>&Ignored</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="statusTip"> |    <property name="statusTip"> | ||||||
|     <string>Show ignored files</string> |     <string>Show ignored files</string> | ||||||
| @@ -668,7 +719,13 @@ | |||||||
|     <bool>true</bool> |     <bool>true</bool> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>View as List</string> |     <string>File &List</string> | ||||||
|  |    </property> | ||||||
|  |    <property name="iconText"> | ||||||
|  |     <string>View as files as a list</string> | ||||||
|  |    </property> | ||||||
|  |    <property name="toolTip"> | ||||||
|  |     <string>View as files as a list</string> | ||||||
|    </property> |    </property> | ||||||
|    <property name="statusTip"> |    <property name="statusTip"> | ||||||
|     <string>View the workspace as a list of files</string> |     <string>View the workspace as a list of files</string> | ||||||
| @@ -677,7 +734,7 @@ | |||||||
|   <action name="actionOpenFolder"> |   <action name="actionOpenFolder"> | ||||||
|    <property name="icon"> |    <property name="icon"> | ||||||
|     <iconset resource="resources.qrc"> |     <iconset resource="resources.qrc"> | ||||||
|      <normaloff>:/icons/icons/My Documents-01.png</normaloff>:/icons/icons/My Documents-01.png</iconset> |      <normaloff>:/icons/icons/Folder-01.png</normaloff>:/icons/icons/Folder-01.png</iconset> | ||||||
|    </property> |    </property> | ||||||
|    <property name="text"> |    <property name="text"> | ||||||
|     <string>Open Folder</string> |     <string>Open Folder</string> | ||||||
| @@ -704,6 +761,65 @@ | |||||||
|     <string>Rename the selected folder</string> |     <string>Rename the selected folder</string> | ||||||
|    </property> |    </property> | ||||||
|   </action> |   </action> | ||||||
|  |   <action name="actionNewStash"> | ||||||
|  |    <property name="icon"> | ||||||
|  |     <iconset resource="resources.qrc"> | ||||||
|  |      <normaloff>:/icons/icons/Folder Add-01.png</normaloff>:/icons/icons/Folder Add-01.png</iconset> | ||||||
|  |    </property> | ||||||
|  |    <property name="text"> | ||||||
|  |     <string>Stash changes</string> | ||||||
|  |    </property> | ||||||
|  |    <property name="statusTip"> | ||||||
|  |     <string>Show the stash</string> | ||||||
|  |    </property> | ||||||
|  |   </action> | ||||||
|  |   <action name="actionApplyStash"> | ||||||
|  |    <property name="icon"> | ||||||
|  |     <iconset resource="resources.qrc"> | ||||||
|  |      <normaloff>:/icons/icons/Folder Open-01.png</normaloff>:/icons/icons/Folder Open-01.png</iconset> | ||||||
|  |    </property> | ||||||
|  |    <property name="text"> | ||||||
|  |     <string>Apply Stash</string> | ||||||
|  |    </property> | ||||||
|  |    <property name="iconText"> | ||||||
|  |     <string>Apply stashed changes</string> | ||||||
|  |    </property> | ||||||
|  |    <property name="toolTip"> | ||||||
|  |     <string>Apply stashed changes</string> | ||||||
|  |    </property> | ||||||
|  |   </action> | ||||||
|  |   <action name="actionViewStash"> | ||||||
|  |    <property name="checkable"> | ||||||
|  |     <bool>true</bool> | ||||||
|  |    </property> | ||||||
|  |    <property name="text"> | ||||||
|  |     <string>&Stashed Changes</string> | ||||||
|  |    </property> | ||||||
|  |    <property name="iconText"> | ||||||
|  |     <string>View the Stash</string> | ||||||
|  |    </property> | ||||||
|  |    <property name="toolTip"> | ||||||
|  |     <string>Show the list of stashed changes</string> | ||||||
|  |    </property> | ||||||
|  |   </action> | ||||||
|  |   <action name="actionDeleteStash"> | ||||||
|  |    <property name="icon"> | ||||||
|  |     <iconset resource="resources.qrc"> | ||||||
|  |      <normaloff>:/icons/icons/Folder Delete-01.png</normaloff>:/icons/icons/Folder Delete-01.png</iconset> | ||||||
|  |    </property> | ||||||
|  |    <property name="text"> | ||||||
|  |     <string>Delete Stash</string> | ||||||
|  |    </property> | ||||||
|  |   </action> | ||||||
|  |   <action name="actionDiffStash"> | ||||||
|  |    <property name="icon"> | ||||||
|  |     <iconset resource="resources.qrc"> | ||||||
|  |      <normaloff>:/icons/icons/Folder Explorer-01.png</normaloff>:/icons/icons/Folder Explorer-01.png</iconset> | ||||||
|  |    </property> | ||||||
|  |    <property name="text"> | ||||||
|  |     <string>Diff Stash</string> | ||||||
|  |    </property> | ||||||
|  |   </action> | ||||||
|  </widget> |  </widget> | ||||||
|  <layoutdefault spacing="6" margin="11"/> |  <layoutdefault spacing="6" margin="11"/> | ||||||
|  <resources> |  <resources> | ||||||
|   | |||||||
							
								
								
									
										22
									
								
								manifest
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								manifest
									
									
									
									
									
								
							| @@ -1,14 +1,14 @@ | |||||||
| C Allow\sfor\sopening\sworkspaces\svia\sthe\scheckout\sfile.\s[Thanks\sChris]\nAdded\ssupport\sfor\sthe\snew\s".fslckout"\sfile\nFixed\san\sissue\swhere\sthe\s\stree\sview\swas\snot\sbeing\supdated\swhen\shidden\sand\sa\sdifferent\sworkspace\swas\sopened\nMinor\sdialog\stext\simprovements\n | C Added\ssupport\sfor\sstashes\nGeneralized\sthe\scommit\sdialog\sto\ssupport\sstashes\nParameters\sare\snow\squoted\sin\sthe\slog\sif\snecessary\nFixed\sanother\sissue\swith\sthe\sfolderview\sshow/hide\slogic\nVarious\sminor\sui\stweaks | ||||||
| D 2012-04-14T09:16:30.450 | D 2012-04-15T06:56:51.575 | ||||||
| F CommitDialog.cpp bc05504be08d9ffe2b24d341a18e37035e1941b7 | F CommitDialog.cpp a46020a9361151d8d286a2670257d01d8967bf69 | ||||||
| F CommitDialog.h 65a7238dcdd41b578536a0b0ac2a65f2e7f23c9a | F CommitDialog.h f1ee8db92103164e7db55a8407ccdcff24571b72 | ||||||
| F CommitDialog.ui 5067623f6af6f5a42c87df903278e383e945e154 | F CommitDialog.ui 813d7cba316e226de1a22b7e480bb969fbe9b0c4 | ||||||
| F FileActionDialog.cpp fcaebf9986f789b3440d5390b3458ad5f86fe0c8 | F FileActionDialog.cpp fcaebf9986f789b3440d5390b3458ad5f86fe0c8 | ||||||
| F FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce | F FileActionDialog.h 15db1650b3a13d70bc338371e4c033c66e3b79ce | ||||||
| F FileActionDialog.ui c63644428579741aeb5fa052e237ba799ced9ad7 | F FileActionDialog.ui c63644428579741aeb5fa052e237ba799ced9ad7 | ||||||
| F MainWindow.cpp f6ee64df8e4d275e3ed60462904566154758e9e1 | F MainWindow.cpp 36e0fa67dbae7db5612d00e28267a2f8240353d0 | ||||||
| F MainWindow.h 643f13d4b5615c51c38b164768bf62258ccb94b1 | F MainWindow.h 552f6bd4061ae15be90e52402bcde6a8d7fbb7ad | ||||||
| F MainWindow.ui 0afb7d2a8e9ce2cff2966295f9eefaed01f1ed51 | F MainWindow.ui b96e3126e2966f8fdeda1dd063efbbc731c7338e | ||||||
| F SettingsDialog.cpp e1fad18cc020d08b82c6d35dc94f6624deec9a3b | F SettingsDialog.cpp e1fad18cc020d08b82c6d35dc94f6624deec9a3b | ||||||
| F SettingsDialog.h f5da6cab4ccc82e2eb78ec835fb849c4c104d6cc | F SettingsDialog.h f5da6cab4ccc82e2eb78ec835fb849c4c104d6cc | ||||||
| F SettingsDialog.ui 8964629ea80c61971c0601624c84d1927902b1fd | F SettingsDialog.ui 8964629ea80c61971c0601624c84d1927902b1fd | ||||||
| @@ -174,7 +174,7 @@ F installer/fuel.iss 13b6a938bcdf273cbd3649d2549887baa1577214 | |||||||
| F installer/license.txt 4cc77b90af91e615a64ae04893fdffa7939db84c | F installer/license.txt 4cc77b90af91e615a64ae04893fdffa7939db84c | ||||||
| F main.cpp 46bf5ddc90fca01c9ef2e8e3d14b4d32217945dd | F main.cpp 46bf5ddc90fca01c9ef2e8e3d14b4d32217945dd | ||||||
| F resources.qrc e98383ed205f4e37100c60057e0129c3b86dea53 | F resources.qrc e98383ed205f4e37100c60057e0129c3b86dea53 | ||||||
| P b04aa4a2a385325b9b50e4ce700a364b05c7b70b | P d0520ae5050524145697206927a579823b8920d0 | ||||||
| R ba6b4795a2456f34d550ae60fa343370 | R b055358a254079018cada6a15162fbb7 | ||||||
| U kostas | U kostas | ||||||
| Z 6b958dff62628f63360ab69f37796e8d | Z c15f935758986542ce2828f4282ddc7a | ||||||
|   | |||||||
| @@ -1 +1 @@ | |||||||
| d0520ae5050524145697206927a579823b8920d0 | ce70efe67a1fe0087cc6d3aa79757a5011c57db2 | ||||||
		Reference in New Issue
	
	Block a user