# # # patch "src/GuitoneStandalone.cpp" # from [71636aba9f994c85f0ddbbea31ee236f3b7de871] # to [cd22aae3cb96d98ce1bdcc9453381d6c440deed0] # # patch "src/GuitoneStandalone.h" # from [130bd2a5ace20673b853b0f49aa7164dff882c84] # to [ab8ec08a886d6f3909563a44f40d661b9cf69f08] # # patch "src/view/dialogs/CheckoutRevision.cpp" # from [fbe76f3df1ab3931f2b24dd0f0ce72bc52d3bc43] # to [7a2e8f9648693eeec22ef3f9044aad88e9ab0a56] # # patch "src/view/dialogs/CheckoutRevision.h" # from [d3a32557f6207f720fac706237c2c3ab41fa695f] # to [aa4fa2f265f77846134807c1ea1f8359a5884b49] # # patch "src/view/dialogs/CreateDatabase.cpp" # from [f0adb526f2a2cdbe661d0a38705012b9d8759f13] # to [27d181ca418dbbbf277d5740cf5d0830b20e9c46] # # patch "src/view/dialogs/CreateDatabase.h" # from [c2485ec2d5d7bfa7649810f3335d2eff06325cf6] # to [58885d7dfc64b662054789ccad0e68b0b196ca59] # # patch "src/view/dialogs/DatabaseDialogManager.cpp" # from [72e1510e28da336c721c0ba8938ec78dad776d50] # to [960696a7449c832c363205b52f1f92098242abe4] # # patch "src/view/dialogs/DatabaseDialogManager.h" # from [e4fc06163c99e62c43e3b7203c662dc40e87c0ad] # to [b2f547e5843fc3f29c905105d4085ee50a0c3ff5] # # patch "src/view/dialogs/DialogManager.cpp" # from [1b55f1990fc3b7657fa1650c513b4544912bc9eb] # to [35f72fd35f216759ced9c232dfd6f618bdc255bd] # # patch "src/view/dialogs/DialogManager.h" # from [c3d0af32b9678790ab5f4d7e1d9a234fdcacf45c] # to [e9a0ddda832900391b7edd4f182d144a675d74e7] # # patch "src/view/dialogs/NewProjectSetup.cpp" # from [e01886e02a2a056776200ba9579d1b84a72d236d] # to [96c38300054594973c551af20641435b366804a0] # # patch "src/view/dialogs/NewProjectSetup.h" # from [549751034cb18a8e1a02b06363d97318a9ddb7f7] # to [b906d4360631b3928304be252ef198131689374e] # # patch "src/view/dialogs/OpenPrompt.cpp" # from [66b827151457bee77f07dde675514838a1279be1] # to [c2fdd76bcbaa302fcbbe313a5299595a3e4010c9] # # patch "src/view/dialogs/OpenPrompt.h" # from [35502b67323d4deff525e1b79c6dd6066fa45a3c] # to [99d4ca96d8642c7f5e6c7eea897b1c6f12eaa064] # # patch "src/view/dialogs/SourcePicker.cpp" # from [5cb8db11e0b9d8f20a36dcef9de1f0761f4c8c9e] # to [5e9177ff2b985d14559746b495bd96c1ab14b311] # # patch "src/view/dialogs/SourcePicker.h" # from [631d7998979f12f1ced980147f6bbdb778113902] # to [fa1416e51fe88c8d21d452b1b64d2d1c241599dd] # # patch "src/view/mainwindows/DatabaseWindow.cpp" # from [eab02d0c1715637bab6627b63d0c6aad8e4470c3] # to [55a1e7f3e8933fc25ad16646d25be9e4792a205b] # # patch "src/view/mainwindows/MainWindow.cpp" # from [9c3f199deff033bb24420956450e520cc36b35ef] # to [b5e62ce1fccd01cbe21fe85322a17cd521bf4346] # # patch "src/view/mainwindows/MainWindow.h" # from [cc7620bfdf1dc5fa47711d37f3d4229e2c83e5e6] # to [dceea080cbd50d15a4105ad1c94cf9a3347debe8] # # patch "src/view/mainwindows/WorkspaceWindow.cpp" # from [6f381ac342746d4449e31646564ad57be4d50cf7] # to [9b7fca4b808d4282a3b8d634a83e3678939147f4] # # patch "src/view/widgets/MenuBar.cpp" # from [368e1539daa1058938786875240385835ea7b5cb] # to [67c074a4d91ed3a9fd9a89eece0346fecb32fbd5] # # patch "src/view/widgets/MenuBar.h" # from [261ef742ffacd45bde12543579989b2e0e8c97b1] # to [76c5b6092b1e44eaca709910dc984d36a7e354ea] # ============================================================ --- src/GuitoneStandalone.cpp 71636aba9f994c85f0ddbbea31ee236f3b7de871 +++ src/GuitoneStandalone.cpp cd22aae3cb96d98ce1bdcc9453381d6c440deed0 @@ -64,7 +64,7 @@ GuitoneStandalone::GuitoneStandalone(int connect( this, SIGNAL(monotoneBinaryPathSet()), - this, SLOT(loadSomething()), + this, SLOT(tryLoadSomething()), Qt::QueuedConnection ); } @@ -78,7 +78,7 @@ GuitoneStandalone::~GuitoneStandalone() if (openPrompt) delete openPrompt; } -void GuitoneStandalone::loadSomething() +void GuitoneStandalone::tryLoadSomething() { I(manager()->monotoneBinaryPathSet()); @@ -86,7 +86,7 @@ void GuitoneStandalone::loadSomething() for (int i=1, j=programArgs.size(); ishow(); -} + connect( + this, SIGNAL(updateRecentLists()), + openPrompt, SLOT(updateRecentLists()) + ); -bool GuitoneStandalone::tryLoadSomething(const QString & pathOrURI) -{ - bool loaded = true; - try - { - load(pathOrURI); - } - catch (GuitoneException & e) - { - W(QString("loading of '%1' failed: %2").arg(pathOrURI).arg(e.what())); - loaded = false; - } - D(QString("loading of '%1' succeeded").arg(pathOrURI)); + connect( + this, SIGNAL(loadFromStringFailed(const QString &, const QString &)), + openPrompt, SLOT(loadFromStringFailed(const QString &, const QString &)) + ); - return loaded; + openPrompt->show(); } // this code is borrowed and adapted from QDesigner - thanks to the Trolls! @@ -151,12 +139,7 @@ bool GuitoneStandalone::event(QEvent * e } else { - if (tryLoadSomething(file)) - { - somethingLoaded = true; - if (openPrompt) - openPrompt->hide(); - } + somethingLoaded = somethingLoaded || loadFromString(file); } eaten = true; break; @@ -183,141 +166,76 @@ bool GuitoneStandalone::event(QEvent * e return eaten; } -void GuitoneStandalone::load(const QString & pathOrURI) +void GuitoneStandalone::loadFromHandle(const MonotoneHandlePtr & handle) { QMutexLocker locker(&lock); MainWindow * wnd = 0; - try - { - MonotoneHandlePtr handle = MonotoneHandle::create(pathOrURI); + I(!handle.isNull()); - if (handle->getType() == MonotoneHandle::empty_handle) - { - throw new GuitoneException(tr("Source was empty")); - } - - switch (handle->getType()) - { - case MonotoneHandle::database_handle: - wnd = new DatabaseWindow(); - Settings::addItemToList("RecentDatabaseList", handle->getData(), 5); - break; - case MonotoneHandle::workspace_handle: - wnd = new WorkspaceWindow(); - Settings::addItemToList("RecentWorkspaceList", handle->getData(), 5); - break; - case MonotoneHandle::server_handle: - wnd = new ServerWindow(); - Settings::addItemToList("RecentServerList", handle->getData(), 5); - break; - default: - I(false); - } - - wnd->init(); - wnd->load(handle); - - openWindows.append(wnd); - ensureCascadedWindowPlacement(wnd); - wnd->show(); - - triggerUpdateWindowList(); - emit updateRecentLists(); - } - catch (GuitoneException & e) + switch (handle->getType()) { - if (wnd) delete wnd; - Settings::removeItemFromList("RecentWorkspaceList", pathOrURI); - Settings::removeItemFromList("RecentDatabaseList", pathOrURI); - Settings::removeItemFromList("RecentServerList", pathOrURI); - emit updateRecentLists(); - throw e; + case MonotoneHandle::database_handle: + wnd = new DatabaseWindow(); + Settings::addItemToList("RecentDatabaseList", handle->getData(), 5); + break; + case MonotoneHandle::workspace_handle: + wnd = new WorkspaceWindow(); + Settings::addItemToList("RecentWorkspaceList", handle->getData(), 5); + break; + case MonotoneHandle::server_handle: + wnd = new ServerWindow(); + Settings::addItemToList("RecentServerList", handle->getData(), 5); + break; + default: + I(false); } -} -void GuitoneStandalone::loadWorkspace(const QString & path) -{ - try - { - load(path); - } - catch (GuitoneException & e) - { - QMessageBox::critical( - NULL, - tr("Failed to load workspace"), - tr("The workspace could not be loaded:\n%1").arg(e.what()), - QMessageBox::Ok - ); + wnd->init(); + wnd->load(handle); - if (openPrompt) - { - openPrompt->setEnabled(true); - openPrompt->raise(); - } + openWindows.append(wnd); + ensureCascadedWindowPlacement(wnd); + wnd->show(); - return; - } + triggerUpdateWindowList(); + emit updateRecentLists(); + // FIXME: maybe we should signal this instead...? if (openPrompt) openPrompt->hide(); } -void GuitoneStandalone::loadDatabase(const QString & path) +bool GuitoneStandalone::loadFromString(const QString & pathOrURI) { + MonotoneHandlePtr handle; try { - load(path); - } - catch (GuitoneException & e) - { - QMessageBox::critical( - NULL, - tr("Failed to load database"), - tr("The database could not be loaded:\n%1").arg(e.what()), - QMessageBox::Ok - ); + handle = MonotoneHandle::create(pathOrURI); - if (openPrompt) + if (handle->getType() == MonotoneHandle::empty_handle) { - openPrompt->setEnabled(true); - openPrompt->raise(); + throw new GuitoneException(tr("Source was empty")); } - - return; } - - if (openPrompt) - openPrompt->hide(); -} - -void GuitoneStandalone::connectToServer(const QString & server) -{ - try - { - load(server); - } catch (GuitoneException & e) { - QMessageBox::critical( - NULL, - tr("Failed to connect to server"), - tr("The server connection could not be established:\n%1").arg(e.what()), - QMessageBox::Ok - ); + Settings::removeItemFromList("RecentWorkspaceList", pathOrURI); + Settings::removeItemFromList("RecentDatabaseList", pathOrURI); + Settings::removeItemFromList("RecentServerList", pathOrURI); - if (openPrompt) - { - openPrompt->setEnabled(true); - openPrompt->raise(); - } + emit updateRecentLists(); - return; + W(QString("loading of '%1' failed: %2").arg(pathOrURI).arg(e.what())); + + emit loadFromStringFailed(pathOrURI, e.what()); + + return false; } - if (openPrompt) - openPrompt->hide(); + loadFromHandle(handle); + + return true; } void GuitoneStandalone::windowClosed(MainWindow * wnd) ============================================================ --- src/GuitoneStandalone.h 130bd2a5ace20673b853b0f49aa7164dff882c84 +++ src/GuitoneStandalone.h ab8ec08a886d6f3909563a44f40d661b9cf69f08 @@ -39,11 +39,11 @@ signals: signals: void updateWindowList(const QStringList &); void updateRecentLists(); + void loadFromStringFailed(const QString &, const QString &); public slots: - void loadWorkspace(const QString &); - void loadDatabase(const QString &); - void connectToServer(const QString &); + void loadFromHandle(const MonotoneHandlePtr &); + bool loadFromString(const QString &); void activateWindow(int); void raiseAllWindows(); @@ -52,12 +52,10 @@ private slots: private slots: void windowClosed(MainWindow *); - void loadSomething(); + void tryLoadSomething(); void threadAborted(const QString &); private: - bool tryLoadSomething(const QString &); - void load(const QString &); void triggerUpdateWindowList(); void ensureCascadedWindowPlacement(MainWindow *); bool closeAllWindows(); ============================================================ --- src/view/dialogs/CheckoutRevision.cpp fbe76f3df1ab3931f2b24dd0f0ce72bc52d3bc43 +++ src/view/dialogs/CheckoutRevision.cpp 7a2e8f9648693eeec22ef3f9044aad88e9ab0a56 @@ -192,7 +192,7 @@ void CheckoutRevision::accept() return; } - emit revisionCheckedOut(checkoutDir.absolutePath()); + emit revisionCheckedOut(MonotoneHandle::create(checkoutDir.absolutePath())); done(0); } ============================================================ --- src/view/dialogs/CheckoutRevision.h d3a32557f6207f720fac706237c2c3ab41fa695f +++ src/view/dialogs/CheckoutRevision.h aa4fa2f265f77846134807c1ea1f8359a5884b49 @@ -44,7 +44,7 @@ signals: signals: void selectRevisionFromSelector(const QString &); - void revisionCheckedOut(const QString &); + void revisionCheckedOut(const MonotoneHandlePtr &); private: Branches * branchesModel; ============================================================ --- src/view/dialogs/CreateDatabase.cpp f0adb526f2a2cdbe661d0a38705012b9d8759f13 +++ src/view/dialogs/CreateDatabase.cpp 27d181ca418dbbbf277d5740cf5d0830b20e9c46 @@ -113,7 +113,7 @@ void CreateDatabase::accept() return; } - emit databaseCreated(filePath); + emit databaseCreated(MonotoneHandle::create(filePath)); done(QDialog::Accepted); } ============================================================ --- src/view/dialogs/CreateDatabase.h c2485ec2d5d7bfa7649810f3335d2eff06325cf6 +++ src/view/dialogs/CreateDatabase.h 58885d7dfc64b662054789ccad0e68b0b196ca59 @@ -19,6 +19,7 @@ #ifndef CREATE_DATABASE_H #define CREATE_DATABASE_H +#include "vocab.h" #include "Dialog.h" #include "ui_create_database.h" @@ -30,7 +31,7 @@ signals: ~CreateDatabase(); signals: - void databaseCreated(const QString &); + void databaseCreated(const MonotoneHandlePtr &); private slots: void accept(); ============================================================ --- src/view/dialogs/DatabaseDialogManager.cpp 72e1510e28da336c721c0ba8938ec78dad776d50 +++ src/view/dialogs/DatabaseDialogManager.cpp 960696a7449c832c363205b52f1f92098242abe4 @@ -138,8 +138,8 @@ void DatabaseDialogManager::showCheckout // delegate this further connect( - checkoutRevision, SIGNAL(revisionCheckedOut(const QString &)), - this, SIGNAL(revisionCheckedOut(const QString &)) + checkoutRevision, SIGNAL(revisionCheckedOut(const MonotoneHandlePtr &)), + this, SIGNAL(revisionCheckedOut(const MonotoneHandlePtr &)) ); connect( @@ -320,8 +320,8 @@ void DatabaseDialogManager::showNewProje // delegate this further connect( - newProjectSetup, SIGNAL(newProjectCreated(const QString &)), - this, SIGNAL(newProjectCreated(const QString &)) + newProjectSetup, SIGNAL(newProjectCreated(const MonotoneHandlePtr &)), + this, SIGNAL(newProjectCreated(const MonotoneHandlePtr &)) ); } ============================================================ --- src/view/dialogs/DatabaseDialogManager.h e4fc06163c99e62c43e3b7203c662dc40e87c0ad +++ src/view/dialogs/DatabaseDialogManager.h b2f547e5843fc3f29c905105d4085ee50a0c3ff5 @@ -47,8 +47,8 @@ signals: //! delegated signals signals: void revisionSelected(const QString &); - void revisionCheckedOut(const QString &); - void newProjectCreated(const QString &); + void revisionCheckedOut(const MonotoneHandlePtr &); + void newProjectCreated(const MonotoneHandlePtr &); void keypairGenerated(const QString &); void certCreated(const QString &, const QString &, const QString &, const QString &); ============================================================ --- src/view/dialogs/DialogManager.cpp 1b55f1990fc3b7657fa1650c513b4544912bc9eb +++ src/view/dialogs/DialogManager.cpp 35f72fd35f216759ced9c232dfd6f618bdc255bd @@ -72,8 +72,8 @@ void DialogManager::showCreateDatabase() createDatabase = new CreateDatabase(parentWidget()); connect( - createDatabase, SIGNAL(databaseCreated(const QString &)), - this, SIGNAL(databaseCreated(const QString &)) + createDatabase, SIGNAL(databaseCreated(const MonotoneHandlePtr &)), + this, SIGNAL(sourceSelected(const MonotoneHandlePtr &)) ); } showDialog(createDatabase); @@ -100,6 +100,11 @@ void DialogManager::showSourcePicker(con if (!sourcePicker) { sourcePicker = new SourcePicker(parentWidget()); + + connect( + sourcePicker, SIGNAL(sourceSelected(const MonotoneHandlePtr &)), + this, SIGNAL(sourceSelected(const MonotoneHandlePtr &)) + ); } sourcePicker->init(type); ============================================================ --- src/view/dialogs/DialogManager.h c3d0af32b9678790ab5f4d7e1d9a234fdcacf45c +++ src/view/dialogs/DialogManager.h e9a0ddda832900391b7edd4f182d144a675d74e7 @@ -46,7 +46,7 @@ signals: void showSourcePicker(const MonotoneHandle::Type &); signals: - void databaseCreated(const QString &); + void sourceSelected(const MonotoneHandlePtr &); void keyPasswordChanged(const QString &); void allDialogsClosed(); ============================================================ --- src/view/dialogs/NewProjectSetup.cpp e01886e02a2a056776200ba9579d1b84a72d236d +++ src/view/dialogs/NewProjectSetup.cpp 96c38300054594973c551af20641435b366804a0 @@ -103,7 +103,7 @@ void NewProjectSetup::accept() return; } - emit newProjectCreated(workspaceDir.absolutePath()); + emit newProjectCreated(MonotoneHandle::create(workspaceDir.absolutePath())); done(0); } ============================================================ --- src/view/dialogs/NewProjectSetup.h 549751034cb18a8e1a02b06363d97318a9ddb7f7 +++ src/view/dialogs/NewProjectSetup.h b906d4360631b3928304be252ef198131689374e @@ -32,7 +32,7 @@ signals: void init(); signals: - void newProjectCreated(const QString &); + void newProjectCreated(const MonotoneHandlePtr &); private: MonotoneHandlePtr monotoneHandle; ============================================================ --- src/view/dialogs/OpenPrompt.cpp 66b827151457bee77f07dde675514838a1279be1 +++ src/view/dialogs/OpenPrompt.cpp c2fdd76bcbaa302fcbbe313a5299595a3e4010c9 @@ -19,8 +19,7 @@ #include "OpenPrompt.h" #include "Settings.h" -#include -#include +#include class GuitoneStandalone; @@ -77,8 +76,8 @@ OpenPrompt::OpenPrompt(QWidget * parent) ); connect( - dialogManager, SIGNAL(databaseCreated(const QString &)), - qApp, SLOT(loadDatabase(const QString &)) + dialogManager, SIGNAL(sourceSelected(const MonotoneHandlePtr &)), + this, SIGNAL(loadFromHandle(const MonotoneHandlePtr &)) ); connect( @@ -123,26 +122,36 @@ void OpenPrompt::recentWorkspacesChanged { // skip the first dummy item if (idx < 1) return; - setDisabled(true); - emit loadWorkspace(recentWorkspaces->itemText(idx)); + emit loadFromString(recentWorkspaces->itemText(idx)); } void OpenPrompt::recentDatabasesChanged(int idx) { // skip the first dummy item if (idx < 1) return; - setDisabled(true); - emit loadDatabase(recentDatabases->itemText(idx)); + emit loadFromString(recentDatabases->itemText(idx)); } void OpenPrompt::recentServersChanged(int idx) { // skip the first dummy item if (idx < 1) return; - setDisabled(true); - emit connectToServer(recentServers->itemText(idx)); + emit loadFromString(recentServers->itemText(idx)); } +void OpenPrompt::loadFromStringFailed(const QString & source, const QString & errmsg) +{ + QMessageBox::critical( + NULL, + tr("Failed to load source"), + tr("The source '%1' could not be loaded:\n%1") + .arg(source).arg(errmsg), + QMessageBox::Ok + ); + + raise(); +} + void OpenPrompt::updateRecentLists() { QStringList workspaces = Settings::getItemList("RecentWorkspaceList"); ============================================================ --- src/view/dialogs/OpenPrompt.h 35502b67323d4deff525e1b79c6dd6066fa45a3c +++ src/view/dialogs/OpenPrompt.h 99d4ca96d8642c7f5e6c7eea897b1c6f12eaa064 @@ -31,11 +31,14 @@ signals: ~OpenPrompt(); signals: - void loadDatabase(const QString &); - void loadWorkspace(const QString &); - void connectToServer(const QString &); + void loadFromHandle(const MonotoneHandlePtr &); + void loadFromString(const QString &); void quitApp(); +public slots: + void loadFromStringFailed(const QString &, const QString &); + void updateRecentLists(); + private slots: void openDatabase(); void openWorkspace(); @@ -43,7 +46,6 @@ private slots: void recentDatabasesChanged(int); void recentWorkspacesChanged(int); void recentServersChanged(int); - void updateRecentLists(); private: DialogManager * dialogManager; ============================================================ --- src/view/dialogs/SourcePicker.cpp 5cb8db11e0b9d8f20a36dcef9de1f0761f4c8c9e +++ src/view/dialogs/SourcePicker.cpp 5e9177ff2b985d14559746b495bd96c1ab14b311 @@ -28,8 +28,21 @@ SourcePicker::SourcePicker(QWidget * par setupUi(this); Dialog::init(); + timer = new QTimer(this); + timer->setInterval(1000); + + connect( + timer, SIGNAL(timeout()), + this, SLOT(serverConnectionChanged()) + ); + + connect( + serverAddress, SIGNAL(textEdited(const QString &)), + timer, SLOT(start()) + ); + serverAddress->setValidator(new QRegExpValidator( - QRegExp("^mtn://([\\w\\-]+(\\.[\\w\\-]+)*(:\\d+)?)$"), + QRegExp("^([\\w\\-]+(\\.[\\w\\-]+)*(:\\d+)?)$"), this )); @@ -114,9 +127,16 @@ void SourcePicker::init(const MonotoneHa if (type == MonotoneHandle::server_handle) { + disconnect( + privateKeys, SIGNAL(currentIndexChanged(int)), + this, SLOT(serverConnectionChanged()) + ); + privateKeys->clear(); - privateKeys->addItem(tr(""), QString()); + // FIXME: anonymous connections are not yet supported by remote_stdio + //privateKeys->addItem(tr(""), QString()); + QMap keys = MonotoneUtil::getPrivateKeyMap(MonotoneHandle::create()); @@ -127,6 +147,11 @@ void SourcePicker::init(const MonotoneHa privateKeys->addItem(it.value(), it.key()); } + connect( + privateKeys, SIGNAL(currentIndexChanged(int)), + this, SLOT(serverConnectionChanged()) + ); + fileWidget->hide(); serverWidget->show(); } @@ -162,10 +187,29 @@ void SourcePicker::fileBrowserClicked(co if ((index.flags() & Qt::ItemIsEnabled) != Qt::ItemIsEnabled) return; - QString path = fsModel->fileInfo(index).absoluteFilePath(); + validate(fsModel->fileInfo(index).absoluteFilePath()); +} + +void SourcePicker::serverConnectionChanged() +{ + timer->stop(); + + QString address = serverAddress->text(); + if (address.isEmpty()) + return; + + QString selectedKey = + privateKeys->itemData(privateKeys->currentIndex()).toString(); + + validate("mtn://" + selectedKey + "@" + address); +} + +void SourcePicker::validate(const QString & pathOrUri) +{ try { - MonotoneHandlePtr handle = MonotoneHandle::create(path); + lastValidatedHandle.clear(); + lastValidatedHandle = MonotoneHandle::create(pathOrUri); } catch (GuitoneException & e) { @@ -178,3 +222,10 @@ void SourcePicker::fileBrowserClicked(co buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true); } +void SourcePicker::accept() +{ + I(lastValidatedHandle); + emit sourceSelected(lastValidatedHandle); + done(0); +} + ============================================================ --- src/view/dialogs/SourcePicker.h 631d7998979f12f1ced980147f6bbdb778113902 +++ src/view/dialogs/SourcePicker.h fa1416e51fe88c8d21d452b1b64d2d1c241599dd @@ -25,6 +25,7 @@ #include #include +#include class SourcePicker : public Dialog, private Ui::SourcePicker { @@ -42,10 +43,15 @@ private slots: private slots: void placesClicked(QTreeWidgetItem *, int); void fileBrowserClicked(const QModelIndex &); + void serverConnectionChanged(); + void accept(); private: - QFileSystemModel * fsModel; + void validate(const QString &); + QTimer * timer; + QFileSystemModel * fsModel; + MonotoneHandlePtr lastValidatedHandle; }; #endif ============================================================ --- src/view/mainwindows/DatabaseWindow.cpp eab02d0c1715637bab6627b63d0c6aad8e4470c3 +++ src/view/mainwindows/DatabaseWindow.cpp 55a1e7f3e8933fc25ad16646d25be9e4792a205b @@ -60,13 +60,13 @@ void DatabaseWindow::init() } connect( - dialogManager, SIGNAL(revisionCheckedOut(const QString &)), - APP, SLOT(loadWorkspace(const QString &)) + dialogManager, SIGNAL(revisionCheckedOut(const MonotoneHandlePtr &)), + APP, SLOT(loadFromHandle(const MonotoneHandlePtr &)) ); connect( - dialogManager, SIGNAL(newProjectCreated(const QString &)), - APP, SLOT(loadWorkspace(const QString &)) + dialogManager, SIGNAL(newProjectCreated(const MonotoneHandlePtr &)), + APP, SLOT(loadFromHandle(const MonotoneHandlePtr &)) ); connect( @@ -164,8 +164,6 @@ void DatabaseWindow::load(const Monotone tr("%1 - database mode - guitone").arg(fi.fileName()) ); - Settings::addItemToList("RecentDatabaseList", dbpath, 5); - reinterpret_cast(dialogManager)->init(monotoneHandle); databaseVariables->setMonotoneHandle(monotoneHandle); ============================================================ --- src/view/mainwindows/MainWindow.cpp 9c3f199deff033bb24420956450e520cc36b35ef +++ src/view/mainwindows/MainWindow.cpp b5e62ce1fccd01cbe21fe85322a17cd521bf4346 @@ -25,6 +25,7 @@ #include #include +#include MainWindow::MainWindow() : QMainWindow(), menuBar(0), dialogManager(0) { @@ -79,6 +80,21 @@ void MainWindow::init() this, SLOT(close()) ); + connect( + menuBar, SIGNAL(openDatabase()), + this, SLOT(openDatabase()) + ); + + connect( + menuBar, SIGNAL(openWorkspace()), + this, SLOT(openWorkspace()) + ); + + connect( + menuBar, SIGNAL(newServerConnection()), + this, SLOT(newServerConnection()) + ); + GuitoneStandalone * app = reinterpret_cast(APP); // since the window is deleted afterwards, make this connection @@ -90,23 +106,23 @@ void MainWindow::init() ); connect( - dialogManager, SIGNAL(databaseCreated(const QString &)), - app, SLOT(loadDatabase(const QString &)) + dialogManager, SIGNAL(sourceSelected(const MonotoneHandlePtr &)), + app, SLOT(loadFromHandle(const MonotoneHandlePtr &)) ); connect( menuBar, SIGNAL(loadWorkspace(const QString &)), - app, SLOT(loadWorkspace(const QString &)) + app, SLOT(loadFromString(const QString &)) ); connect( menuBar, SIGNAL(loadDatabase(const QString &)), - app, SLOT(loadDatabase(const QString &)) + app, SLOT(loadFromString(const QString &)) ); connect( menuBar, SIGNAL(connectToServer(const QString &)), - app, SLOT(connectToServer(const QString &)) + app, SLOT(loadFromString(const QString &)) ); connect( @@ -130,6 +146,11 @@ void MainWindow::init() ); connect( + app, SIGNAL(loadFromStringFailed(const QString &, const QString &)), + this, SLOT(loadFromStringFailed(const QString &, const QString &)) + ); + + connect( app, SIGNAL(updateWindowList(const QStringList &)), menuBar, SLOT(updateWindowList(const QStringList &)) ); @@ -141,6 +162,34 @@ void MainWindow::init() setup(); } +void MainWindow::openDatabase() +{ + dialogManager->showSourcePicker(MonotoneHandle::database_handle); +} + +void MainWindow::openWorkspace() +{ + dialogManager->showSourcePicker(MonotoneHandle::workspace_handle); +} + +void MainWindow::newServerConnection() +{ + dialogManager->showSourcePicker(MonotoneHandle::server_handle); +} + +void MainWindow::loadFromStringFailed(const QString & source, const QString & errmsg) +{ + QMessageBox::critical( + NULL, + tr("Failed to load source"), + tr("The source '%1' could not be loaded:\n%1") + .arg(source).arg(errmsg), + QMessageBox::Ok + ); + + raise(); +} + void MainWindow::closeEvent(QCloseEvent * event) { event->accept(); ============================================================ --- src/view/mainwindows/MainWindow.h cc7620bfdf1dc5fa47711d37f3d4229e2c83e5e6 +++ src/view/mainwindows/MainWindow.h dceea080cbd50d15a4105ad1c94cf9a3347debe8 @@ -44,6 +44,10 @@ private slots: void closeEvent(QCloseEvent *); private slots: + void openDatabase(); + void openWorkspace(); + void newServerConnection(); + void loadFromStringFailed(const QString &, const QString &); void allDialogsClosed(); void showMonotoneManual(); }; ============================================================ --- src/view/mainwindows/WorkspaceWindow.cpp 6f381ac342746d4449e31646564ad57be4d50cf7 +++ src/view/mainwindows/WorkspaceWindow.cpp 9b7fca4b808d4282a3b8d634a83e3678939147f4 @@ -421,8 +421,6 @@ void WorkspaceWindow::load(const Monoton arg(MonotoneUtil::getBranchNameShort(handle)) ); - Settings::addItemToList("RecentWorkspaceList", handle->getData(), 5); - reinterpret_cast(dialogManager)->init(handle); invModel->setMonotoneHandle(handle); ============================================================ --- src/view/widgets/MenuBar.cpp 368e1539daa1058938786875240385835ea7b5cb +++ src/view/widgets/MenuBar.cpp 67c074a4d91ed3a9fd9a89eece0346fecb32fbd5 @@ -111,17 +111,17 @@ MenuBar::MenuBar(QWidget * parent) : QMe connect( actionOpen_Database, SIGNAL(triggered()), - this, SLOT(openDatabase()) + this, SIGNAL(openDatabase()) ); connect( actionOpen_Workspace, SIGNAL(triggered()), - this, SLOT(openWorkspace()) + this, SIGNAL(openWorkspace()) ); connect( actionConnect_to_Server, SIGNAL(triggered()), - this, SLOT(newServerConnection()) + this, SIGNAL(newServerConnection()) ); connect( @@ -239,46 +239,6 @@ void MenuBar::updateRecentLists() } } -void MenuBar::openDatabase() -{ - QString fn = QFileDialog::getOpenFileName( - 0, - tr("Select your database..."), - QString(), - tr("monotone Databases (*.mtn *.db)") - ); - - if (fn.isEmpty()) return; - - emit loadDatabase(fn); -} - -void MenuBar::openWorkspace() -{ - QString fn = QFileDialog::getExistingDirectory(0, - tr("Select your workspace...") - ); - - if (fn.isEmpty()) return; - - emit loadWorkspace(fn); -} - -void MenuBar::newServerConnection() -{ - bool ok; - QString connection = QInputDialog::getText( - this, - tr("Enter a new server connection"), - tr("Please enter a new server connection (f.e. mtn://my.server.com:4691):"), - QLineEdit::Normal, "mtn://", &ok).trimmed(); - - if (!ok || connection.isEmpty()) - return; - - emit connectToServer(connection); -} - void MenuBar::openRecentWorkspace() { QAction * action = qobject_cast(sender()); ============================================================ --- src/view/widgets/MenuBar.h 261ef742ffacd45bde12543579989b2e0e8c97b1 +++ src/view/widgets/MenuBar.h 76c5b6092b1e44eaca709910dc984d36a7e354ea @@ -33,6 +33,9 @@ signals: void updateWindowList(const QStringList &); signals: + void openDatabase(); + void openWorkspace(); + void newServerConnection(); void loadWorkspace(const QString &); void loadDatabase(const QString &); void connectToServer(const QString &); @@ -68,9 +71,6 @@ private slots: QMenu * menuHelp; private slots: - void openDatabase(); - void openWorkspace(); - void newServerConnection(); void openRecentDatabase(); void openRecentWorkspace(); void connectRecentServer();