diff --git a/fuel.pro b/fuel.pro index f606f86..1c3ab8f 100644 --- a/fuel.pro +++ b/fuel.pro @@ -58,7 +58,8 @@ SOURCES += src/main.cpp\ src/Fossil.cpp \ src/Workspace.cpp \ src/SearchBox.cpp \ - src/Settings.cpp + src/Settings.cpp \ + src/RemoteDialog.cpp HEADERS += src/MainWindow.h \ src/CommitDialog.h \ @@ -75,7 +76,8 @@ HEADERS += src/MainWindow.h \ src/Fossil.h \ src/Workspace.h \ src/SearchBox.h \ - src/Settings.h + src/Settings.h \ + src/RemoteDialog.h FORMS += ui/MainWindow.ui \ ui/CommitDialog.ui \ @@ -84,7 +86,8 @@ FORMS += ui/MainWindow.ui \ ui/FslSettingsDialog.ui \ ui/CloneDialog.ui \ ui/BrowserWidget.ui \ - ui/RevisionDialog.ui + ui/RevisionDialog.ui \ + ui/RemoteDialog.ui RESOURCES += \ rsrc/resources.qrc diff --git a/manifest b/manifest index 66a3301..2d16cb4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Removed\sCreate\sStash\sfrom\stoolbar\nChanged\s"Open\sContaining"\sicon\nMinor\scosmetic\schanges -D 2015-05-24T18:37:29.618 +C Initial\swork\son\sremote\smanagement +D 2015-05-25T12:27:27.983 F .travis.yml 77966888a81c4ceee1fcc79bce842c9667ad8a35 F debian/changelog eb4304dfcb6bb66850ec740838090eb50ce1249b F debian/compat b6abd567fa79cbe0196d093a067271361dc6ca8b @@ -15,7 +15,7 @@ F dist/win/fuel.iss ef3558dbba409eb194938b930377fc9ee27d319e F doc/Building.txt 17b43fa23da764b5d1b828cc48c5a95e612bbd8f F doc/Changes.txt b03302545e4a6c0b16a30d623a7627f8aef65ef6 F doc/License.txt 4cc77b90af91e615a64ae04893fdffa7939db84c -F fuel.pro b010c4ee3093112003a9d27045927efce5985dab +F fuel.pro 641f62716fc90c9430f5c4cbc415c9d63f833a52 F intl/convert.bat 4222ae403418381452b843929d15259ea9850ab1 x F intl/convert.sh 2ca2179ff53e727f241925b75e19182607883c45 x F intl/de_DE.ts e2faceab920ac60c97bbc6fba038e261d51fc741 @@ -202,8 +202,10 @@ F src/FslSettingsDialog.cpp f5a34a70ecb0560d2b6eea6bf27e42048548aedd F src/FslSettingsDialog.h dfe2a61884a55a74cbb9206b6f6b482b979725e7 F src/LoggedProcess.cpp 2a1e5c94bc1e57c8984563e66c210e43a14dc60c F src/LoggedProcess.h 85df7c635c807a5a0e8c4763f17a0752aaff7261 -F src/MainWindow.cpp 4cbfa1fdf3092b97649711388576230e4808d50e -F src/MainWindow.h a848462f21423b5c1e0c218cab1805c308299607 +F src/MainWindow.cpp 717ccd4c91127a08d8cc71d46d8df1a40db62146 +F src/MainWindow.h 6cb82a4fc337793a339ffef4728e6d30b7b74305 +F src/RemoteDialog.cpp f0ee2d05e6d6c079f2a00bb551431407eb9d783d +F src/RemoteDialog.h 364e867210ec55d8d6d23d0c8078f2517b2389ec F src/RevisionDialog.cpp 51065c65a07c118dd1a7363da4a55a135d1c6c9c F src/RevisionDialog.h b718c3009342eaabad39c8a11a253a4e4fef7a73 F src/SearchBox.cpp d4209c575baa9933e1ce5ed376e785b289a145ba @@ -224,10 +226,14 @@ F ui/CloneDialog.ui 4886e7d4f258ea8b852b5eefc860396e35145712 F ui/CommitDialog.ui aea77347eef82b6b591f31fb058a1bb96193c728 F ui/FileActionDialog.ui 89bb4dc2d0b8adcd41adcb11ec65f2028a09a12d F ui/FslSettingsDialog.ui 042717833d8efea905b4fc380bad580be809717d -F ui/MainWindow.ui 2d36b1ba9886356802f2cddf12c4cabb5ee1acde +F ui/MainWindow.ui 72d363caef1a9ce0484509cdf3e5f924af363381 +F ui/RemoteDialog.ui aa738503e4f6625ed8d7cc46169a319a39b0e575 F ui/RevisionDialog.ui 27c3b98c665fec014a50cbf3352c0627f75e68cd F ui/SettingsDialog.ui 4c480cd595a32664d01c85bf74845c4282fc0068 -P 97d0d1e2408832e1fc8b532e059b2141afd9ac55 -R 8f806c4029c039de40ed9c8c7d5c5dca +P 7ebac37b3255e6721889c070b7327a96c63b6c97 +R 70bbd6d1fd63555631752f47198d7051 +T *branch * remote-management +T *sym-remote-management * +T -sym-new-workspace * U kostas -Z 44ccd8fda388c2e574389286ae9da408 +Z a9dba47682969d430cd680d884c75123 diff --git a/manifest.uuid b/manifest.uuid index 40b8481..853493f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7ebac37b3255e6721889c070b7327a96c63b6c97 \ No newline at end of file +13d3a5222dfe24a33a72efffff0ecb0b5bfefe73 \ No newline at end of file diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index 09896a2..1e6b716 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -19,6 +19,7 @@ #include "FileActionDialog.h" #include "CloneDialog.h" #include "RevisionDialog.h" +#include "RemoteDialog.h" #include "Utils.h" #define REVISION_LATEST "Latest revision" @@ -58,7 +59,7 @@ struct WorkspaceItem TYPE_TAGS, TYPE_TAG, TYPE_REMOTES, - TYPE_SETTINGS + TYPE_REMOTE, }; WorkspaceItem() @@ -174,6 +175,10 @@ MainWindow::MainWindow(Settings &_settings, QWidget *parent, QString *workspaceP menuBranches->addAction(ui->actionMergeBranch); menuBranches->addAction(ui->actionUpdate); + // RemotesMenu + menuRemotes = new QMenu(this); + menuRemotes->addAction(ui->actionEditRemote); + // Recent Workspaces // Locate a sequence of two separator actions in file menu QList file_actions = ui->menuFile->actions(); @@ -800,20 +805,19 @@ void MainWindow::updateWorkspaceView() stashes->appendRow(stash); } -#if 0 +#if 1 // Remotes QStandardItem *remotes = new QStandardItem(getInternalIcon(":icons/icon-item-remote"), tr("Remotes")); remotes->setData(WorkspaceItem(WorkspaceItem::TYPE_REMOTES, ""), ROLE_WORKSPACE_ITEM); remotes->setEditable(false); getWorkspace().getTreeModel().appendRow(remotes); -#endif + { + QStandardItem *default_url = new QStandardItem(getInternalIcon(":icons/icon-item-remote"), tr("Default")); + QString url = settings.GetFossilValue(FOSSIL_SETTING_REMOTE_URL).toString(); + default_url->setData(WorkspaceItem(WorkspaceItem::TYPE_REMOTE, url), ROLE_WORKSPACE_ITEM); + remotes->appendRow(default_url); + } -#if 0 // Unimplemented for now - // Settings - QStandardItem *settings = new QStandardItem(getInternalIcon(":icons/icon-action-settings"), tr("Settings")); - settings->setData(WorkspaceItem(WorkspaceItem::TYPE_SETTINGS, ""), ROLE_WORKSPACE_ITEM); - settings->setEditable(false); - getWorkspace().getTreeModel().appendRow(settings); #endif // Expand previously selected nodes @@ -1233,9 +1237,26 @@ void MainWindow::getSelectionStashes(QStringList &stashNames) QString name = mi.model()->data(mi, Qt::DisplayRole).toString(); stashNames.append(name); } - } +//------------------------------------------------------------------------------ +void MainWindow::getSelectionRemotes(QStringList &remoteUrls) +{ + QModelIndexList selection = ui->workspaceTreeView->selectionModel()->selectedIndexes(); + + foreach(const QModelIndex &mi, selection) + { + QVariant data = mi.model()->data(mi, ROLE_WORKSPACE_ITEM); + Q_ASSERT(data.isValid()); + WorkspaceItem tv = data.value(); + + if(tv.Type != WorkspaceItem::TYPE_REMOTE) + continue; + + QString url = tv.Value; + remoteUrls.append(url); + } +} //------------------------------------------------------------------------------ bool MainWindow::diffFile(const QString &repoFile) { @@ -2187,6 +2208,8 @@ void MainWindow::on_workspaceTreeView_customContextMenuRequested(const QPoint &) menu = menuTags; else if (tv.Type == WorkspaceItem::TYPE_BRANCH || tv.Type == WorkspaceItem::TYPE_BRANCHES) menu = menuBranches; + else if (tv.Type == WorkspaceItem::TYPE_REMOTE) + menu = menuRemotes; if(menu) { @@ -2477,3 +2500,17 @@ void MainWindow::onSearch() searchBox->setFocus(); } +//------------------------------------------------------------------------------ +void MainWindow::on_actionEditRemote_triggered() +{ + QStringList remotes; + getSelectionRemotes(remotes); + + if(remotes.empty()) + return; + + QUrl url(remotes.first()); + + if(!RemoteDialog::run(this, url)) + return; +} diff --git a/src/MainWindow.h b/src/MainWindow.h index dc7eb64..250ce69 100644 --- a/src/MainWindow.h +++ b/src/MainWindow.h @@ -40,6 +40,7 @@ private: void getDirViewSelection(QStringList &filenames, int includeMask=WorkspaceFile::TYPE_ALL, bool allIfEmpty=false); void getSelectionStashes(QStringList &stashNames); void getSelectionPaths(stringset_t &paths); + void getSelectionRemotes(QStringList& remoteUrls); void getAllFilenames(QStringList &filenames, int includeMask=WorkspaceFile::TYPE_ALL); bool startUI(); void stopUI(); @@ -124,6 +125,7 @@ private slots: void on_actionDeleteTag_triggered(); void on_actionCreateBranch_triggered(); void on_actionMergeBranch_triggered(); + void on_actionEditRemote_triggered(); private: class MainWinUICallback : public UICallback @@ -171,6 +173,7 @@ private: QMenu *menuStashes; QMenu *menuTags; QMenu *menuBranches; + QMenu *menuRemotes; bool operationAborted; stringset_t selectedDirs; // The directory selected in the tree diff --git a/src/RemoteDialog.cpp b/src/RemoteDialog.cpp new file mode 100644 index 0000000..ed308c9 --- /dev/null +++ b/src/RemoteDialog.cpp @@ -0,0 +1,90 @@ +#include "RemoteDialog.h" +#include "ui_RemoteDialog.h" +#include +#include +#include +#include +#include +#include "Utils.h" + +//----------------------------------------------------------------------------- +RemoteDialog::RemoteDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::RemoteDialog) +{ + ui->setupUi(this); +} + +//----------------------------------------------------------------------------- +RemoteDialog::~RemoteDialog() +{ + delete ui; +} + +//----------------------------------------------------------------------------- +bool RemoteDialog::run(QWidget *parent, QUrl &url) +{ + RemoteDialog dlg(parent); + + // Set URL components + if(!url.isEmpty()) + { + QString qq = url.toString(QUrl::PrettyDecoded|QUrl::RemoveUserInfo); + dlg.ui->lineURL->setText(qq); + dlg.ui->lineUserName->setText(url.userName()); + dlg.ui->linePassword->setText(url.password()); + } + + if(dlg.exec() != QDialog::Accepted) + return false; + + QString urltext = dlg.ui->lineURL->text(); + + url = QUrl::fromUserInput(urltext); + if(url.isEmpty() || !url.isValid()) + { + QMessageBox::critical(parent, tr("Error"), tr("Invalid URL."), QMessageBox::Ok ); + return false; + } + + if(!dlg.ui->lineUserName->text().trimmed().isEmpty()) + url.setUserName(dlg.ui->lineUserName->text()); + + if(!dlg.ui->linePassword->text().trimmed().isEmpty()) + url.setPassword(dlg.ui->linePassword->text()); + + return true; +} + +//----------------------------------------------------------------------------- +void RemoteDialog::GetRepositoryPath(QString &pathResult) +{ + QString filter(tr("Fossil Repository") + QString(" (*." FOSSIL_EXT ")")); + + pathResult = QFileDialog::getSaveFileName( + this, + tr("Select Fossil Repository"), + QDir::toNativeSeparators(pathResult), + filter, + &filter, + QFileDialog::DontConfirmOverwrite); +} + +//----------------------------------------------------------------------------- +void RemoteDialog::on_btnSelectSourceRepo_clicked() +{ + QString path = ui->lineURL->text(); + GetRepositoryPath(path); + + if(path.trimmed().isEmpty()) + return; + + if(!QFile::exists(path)) + { + QMessageBox::critical(this, tr("Error"), tr("Invalid Repository File."), QMessageBox::Ok); + return; + } + + ui->lineURL->setText(QDir::toNativeSeparators(path)); +} + diff --git a/src/RemoteDialog.h b/src/RemoteDialog.h new file mode 100644 index 0000000..641a9fb --- /dev/null +++ b/src/RemoteDialog.h @@ -0,0 +1,29 @@ +#ifndef REMOTEDIALOG_H +#define REMOTEDIALOG_H + +#include + +namespace Ui { +class RemoteDialog; +} + +class RemoteDialog : public QDialog +{ + Q_OBJECT + +public: + explicit RemoteDialog(QWidget *parent = 0); + ~RemoteDialog(); + + static bool run(QWidget *parent, class QUrl &url); + +private slots: + void on_btnSelectSourceRepo_clicked(); + +private: + void GetRepositoryPath(QString &pathResult); + + Ui::RemoteDialog *ui; +}; + +#endif // REMOTEDIALOG_H diff --git a/ui/MainWindow.ui b/ui/MainWindow.ui index 7774bde..86dbbb6 100644 --- a/ui/MainWindow.ui +++ b/ui/MainWindow.ui @@ -978,6 +978,14 @@ F&ossil Settings + + + Edit Remote + + + Edit Remote URL + + diff --git a/ui/RemoteDialog.ui b/ui/RemoteDialog.ui new file mode 100644 index 0000000..2700d67 --- /dev/null +++ b/ui/RemoteDialog.ui @@ -0,0 +1,151 @@ + + + RemoteDialog + + + Qt::WindowModal + + + + 0 + 0 + 478 + 142 + + + + Remote Repository + + + true + + + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + URL + + + + + + + + + The URL of the source repository + + + + + + + + 0 + 0 + + + + + 24 + 24 + + + + ... + + + + + + + + + User Name + + + + + + + The user name used to access the remote repository. Leave blank if not required + + + + + + + Password + + + + + + + The password used to access the remote repository. Leave blank if not required + + + QLineEdit::Password + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + lineURL + btnSelectSourceRepo + lineUserName + linePassword + + + + + buttonBox + accepted() + RemoteDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + RemoteDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + +