Initial work on remote management

FossilOrigin-Name: 13d3a5222dfe24a33a72efffff0ecb0b5bfefe73
This commit is contained in:
kostas 2015-05-25 12:27:27 +00:00
parent eb564e533f
commit 86af187c23
9 changed files with 350 additions and 23 deletions

View File

@ -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

View File

@ -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

View File

@ -1 +1 @@
7ebac37b3255e6721889c070b7327a96c63b6c97
13d3a5222dfe24a33a72efffff0ecb0b5bfefe73

View File

@ -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<QAction*> 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<WorkspaceItem>();
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;
}

View File

@ -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

90
src/RemoteDialog.cpp Normal file
View File

@ -0,0 +1,90 @@
#include "RemoteDialog.h"
#include "ui_RemoteDialog.h"
#include <QFileDialog>
#include <QDir>
#include <QMessageBox>
#include <QClipboard>
#include <QUrl>
#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));
}

29
src/RemoteDialog.h Normal file
View File

@ -0,0 +1,29 @@
#ifndef REMOTEDIALOG_H
#define REMOTEDIALOG_H
#include <QDialog>
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

View File

@ -978,6 +978,14 @@
<string>F&amp;ossil Settings</string>
</property>
</action>
<action name="actionEditRemote">
<property name="text">
<string>Edit Remote</string>
</property>
<property name="toolTip">
<string>Edit Remote URL</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<customwidgets>

151
ui/RemoteDialog.ui Normal file
View File

@ -0,0 +1,151 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>RemoteDialog</class>
<widget class="QDialog" name="RemoteDialog">
<property name="windowModality">
<enum>Qt::WindowModal</enum>
</property>
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>478</width>
<height>142</height>
</rect>
</property>
<property name="windowTitle">
<string>Remote Repository</string>
</property>
<property name="modal">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QLabel" name="label_1">
<property name="text">
<string>URL</string>
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_11">
<item>
<widget class="QLineEdit" name="lineURL">
<property name="toolTip">
<string>The URL of the source repository</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnSelectSourceRepo">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="text">
<string>...</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>User Name</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="lineUserName">
<property name="toolTip">
<string>The user name used to access the remote repository. Leave blank if not required</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Password</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="linePassword">
<property name="toolTip">
<string>The password used to access the remote repository. Leave blank if not required</string>
</property>
<property name="echoMode">
<enum>QLineEdit::Password</enum>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
<tabstop>lineURL</tabstop>
<tabstop>btnSelectSourceRepo</tabstop>
<tabstop>lineUserName</tabstop>
<tabstop>linePassword</tabstop>
</tabstops>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>RemoteDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>RemoteDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>