X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=79f20aa85742385df3eafd2eeb53c1494cfb9fa9;hp=0b5fe8533efd9d6fdbd518b2445e759f1864c3e1;hb=a9cc264bc4ee3e51ede21b79276704d4043e3656;hpb=8386eed0a503bd2683b908bc05d682231331894b diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 0b5fe853..79f20aa8 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -55,6 +55,7 @@ #include "clientbufferviewconfig.h" #include "clientbufferviewmanager.h" #include "clientignorelistmanager.h" +#include "coreconfigwizard.h" #include "coreconnectdlg.h" #include "coreconnection.h" #include "coreconnectionstatuswidget.h" @@ -69,6 +70,7 @@ #include "irclistmodel.h" #include "ircconnectionwizard.h" #include "jumpkeyhandler.h" +#include "legacysystemtray.h" #include "msgprocessorstatuswidget.h" #include "nicklistwidget.h" #include "qtuiapplication.h" @@ -77,15 +79,12 @@ #include "qtuistyle.h" #include "settingsdlg.h" #include "settingspagedlg.h" -#include "systemtray.h" +#include "statusnotifieritem.h" #include "toolbaractionprovider.h" #include "topicwidget.h" #include "verticaldock.h" #ifndef HAVE_KDE -# ifdef HAVE_DBUS -# include "desktopnotificationbackend.h" -# endif # ifdef HAVE_PHONON # include "phononnotificationbackend.h" # endif @@ -111,7 +110,7 @@ #include "settingspages/chatviewsettingspage.h" #include "settingspages/connectionsettingspage.h" #include "settingspages/coreaccountsettingspage.h" -#include "settingspages/generalsettingspage.h" +#include "settingspages/coreconnectionsettingspage.h" #include "settingspages/highlightsettingspage.h" #include "settingspages/identitiessettingspage.h" #include "settingspages/ignorelistsettingspage.h" @@ -134,9 +133,7 @@ MainWin::MainWin(QWidget *parent) _awayLog(0), _layoutLoaded(false) { -#ifdef Q_WS_WIN - dwTickCount = 0; -#endif + setAttribute(Qt::WA_DeleteOnClose, false); // we delete the mainwin manually QtUiSettings uiSettings; QString style = uiSettings.value("Style", QString()).toString(); @@ -160,6 +157,9 @@ void MainWin::init() { SLOT(messagesInserted(const QModelIndex &, int, int))); connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showChannelList(NetworkId)), SLOT(showChannelList(NetworkId))); connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showIgnoreList(QString)), SLOT(showIgnoreList(QString))); + + connect(Client::coreConnection(), SIGNAL(startCoreSetup(QVariantList)), SLOT(showCoreConfigWizard(QVariantList))); + connect(Client::coreConnection(), SIGNAL(connectionErrorPopup(QString)), SLOT(handleCoreConnectionError(QString))); connect(Client::coreConnection(), SIGNAL(userAuthenticationRequired(CoreAccount *, bool *, QString)), SLOT(userAuthenticationRequired(CoreAccount *, bool *, QString))); connect(Client::coreConnection(), SIGNAL(handleNoSslInClient(bool*)), SLOT(handleNoSslInClient(bool *))); connect(Client::coreConnection(), SIGNAL(handleNoSslInCore(bool*)), SLOT(handleNoSslInCore(bool *))); @@ -179,9 +179,9 @@ void MainWin::init() { setupBufferWidget(); setupMenus(); setupTopicWidget(); - setupChatMonitor(); setupNickWidget(); setupInputWidget(); + setupChatMonitor(); setupStatusBar(); setupToolBars(); setupSystray(); @@ -189,15 +189,15 @@ void MainWin::init() { setupHotList(); #ifndef HAVE_KDE - QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this)); - QtUi::registerNotificationBackend(new SystrayNotificationBackend(this)); # ifdef HAVE_PHONON QtUi::registerNotificationBackend(new PhononNotificationBackend(this)); # endif -# ifdef HAVE_DBUS - QtUi::registerNotificationBackend(new DesktopNotificationBackend(this)); +# ifndef QT_NO_SYSTEMTRAYICON + QtUi::registerNotificationBackend(new SystrayNotificationBackend(this)); # endif + QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this)); + #else /* HAVE_KDE */ QtUi::registerNotificationBackend(new KNotificationBackend(this)); #endif /* HAVE_KDE */ @@ -273,8 +273,8 @@ void MainWin::restoreStateFromSettings(UiSettings &s) { move(_normalPos); #endif - if(s.value("MainWinHidden").toBool()) - hideToTray(); + if(s.value("MainWinHidden").toBool() && QtUi::haveSystemTray()) + QtUi::hideMainWidget(); else if(s.value("MainWinMinimized").toBool()) showMinimized(); else if(maximized) @@ -581,9 +581,10 @@ void MainWin::setupChatMonitor() { dock->setObjectName("ChatMonitorDock"); ChatMonitorFilter *filter = new ChatMonitorFilter(Client::messageModel(), this); - ChatMonitorView *chatView = new ChatMonitorView(filter, this); - chatView->show(); - dock->setWidget(chatView); + _chatMonitorView = new ChatMonitorView(filter, this); + _chatMonitorView->setFocusProxy(_inputWidget); + _chatMonitorView->show(); + dock->setWidget(_chatMonitorView); dock->hide(); addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical); @@ -609,17 +610,19 @@ void MainWin::setupInputWidget() { _bufferWidget->setFocusProxy(_inputWidget); _inputWidget->inputLine()->installEventFilter(_bufferWidget); + + connect(_topicWidget, SIGNAL(switchedPlain()), _bufferWidget, SLOT(setFocus())); } void MainWin::setupTopicWidget() { VerticalDock *dock = new VerticalDock(tr("Topic"), this); dock->setObjectName("TopicDock"); - TopicWidget *topicwidget = new TopicWidget(dock); + _topicWidget = new TopicWidget(dock); - dock->setWidget(topicwidget); + dock->setWidget(_topicWidget); - topicwidget->setModel(Client::bufferModel()); - topicwidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); + _topicWidget->setModel(Client::bufferModel()); + _topicWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical); @@ -671,7 +674,14 @@ void MainWin::saveStatusBarStatus(bool enabled) { } void MainWin::setupSystray() { - _systemTray = new SystemTray(this); +#ifdef HAVE_DBUS + _systemTray = new StatusNotifierItem(this); +#elif !defined QT_NO_SYSTEMTRAYICON + _systemTray = new LegacySystemTray(this); +#else + _systemTray = new SystemTray(this); // dummy +#endif + _systemTray->init(); } void MainWin::setupToolBars() { @@ -760,8 +770,9 @@ void MainWin::loadLayout() { void MainWin::saveLayout() { QtUiSettings s; - int accountId = Client::currentCoreAccount().accountId().toInt(); - if(accountId > 0) s.setValue(QString("MainWinState-%1").arg(accountId) , saveState(accountId)); + int accountId = _bufferViews.count()? Client::currentCoreAccount().accountId().toInt() : 0; // only save if we still have a layout! + if(accountId > 0) + s.setValue(QString("MainWinState-%1").arg(accountId) , saveState(accountId)); } void MainWin::disconnectedFromCore() { @@ -801,11 +812,7 @@ void MainWin::setDisconnectedState() { if(_msgProcessorStatusWidget) _msgProcessorStatusWidget->setProgress(0, 0); updateIcon(); - systemTray()->setState(SystemTray::Inactive); -} - -void MainWin::startInternalCore() { - + systemTray()->setState(SystemTray::Passive); } void MainWin::userAuthenticationRequired(CoreAccount *account, bool *valid, const QString &errorMessage) { @@ -872,6 +879,10 @@ void MainWin::handleSslErrors(const QSslSocket *socket, bool *accepted, bool *pe #endif /* HAVE_SSL */ +void MainWin::handleCoreConnectionError(const QString &error) { + QMessageBox::critical(this, tr("Core Connection Error"), error, QMessageBox::Ok); +} + void MainWin::showCoreConnectionDlg() { CoreConnectDlg dlg(this); if(dlg.exec() == QDialog::Accepted) { @@ -881,6 +892,12 @@ void MainWin::showCoreConnectionDlg() { } } +void MainWin::showCoreConfigWizard(const QVariantList &backends) { + CoreConfigWizard *wizard = new CoreConfigWizard(Client::coreConnection(), backends, this); + + wizard->show(); +} + void MainWin::showChannelList(NetworkId netId) { ChannelListDlg *channelListDlg = new ChannelListDlg(); @@ -928,25 +945,26 @@ void MainWin::showSettingsDlg() { //Category: Interface dlg->registerSettingsPage(new AppearanceSettingsPage(dlg)); dlg->registerSettingsPage(new ChatViewSettingsPage(dlg)); + dlg->registerSettingsPage(new ChatMonitorSettingsPage(dlg)); dlg->registerSettingsPage(new ItemViewSettingsPage(dlg)); + dlg->registerSettingsPage(new BufferViewSettingsPage(dlg)); dlg->registerSettingsPage(new InputWidgetSettingsPage(dlg)); dlg->registerSettingsPage(new TopicWidgetSettingsPage(dlg)); dlg->registerSettingsPage(new HighlightSettingsPage(dlg)); dlg->registerSettingsPage(new NotificationsSettingsPage(dlg)); dlg->registerSettingsPage(new BacklogSettingsPage(dlg)); - dlg->registerSettingsPage(new BufferViewSettingsPage(dlg)); - dlg->registerSettingsPage(new ChatMonitorSettingsPage(dlg)); - //Category: Misc - dlg->registerSettingsPage(new GeneralSettingsPage(dlg)); + //Category: IRC dlg->registerSettingsPage(new ConnectionSettingsPage(dlg)); dlg->registerSettingsPage(new IdentitiesSettingsPage(dlg)); dlg->registerSettingsPage(new NetworksSettingsPage(dlg)); dlg->registerSettingsPage(new AliasesSettingsPage(dlg)); dlg->registerSettingsPage(new IgnoreListSettingsPage(dlg)); + // Category: Remote Cores if(Quassel::runMode() != Quassel::Monolithic) { dlg->registerSettingsPage(new CoreAccountSettingsPage(dlg)); + dlg->registerSettingsPage(new CoreConnectionSettingsPage(dlg)); } dlg->show(); @@ -991,8 +1009,8 @@ void MainWin::closeEvent(QCloseEvent *event) { QtUiSettings s; QtUiApplication* app = qobject_cast qApp; Q_ASSERT(app); - if(!app->isAboutToQuit() && s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnClose").toBool()) { - hideToTray(); + if(!app->isAboutToQuit() && QtUi::haveSystemTray() && s.value("MinimizeOnClose").toBool()) { + QtUi::hideMainWidget(); event->ignore(); } else { event->accept(); @@ -1000,71 +1018,6 @@ void MainWin::closeEvent(QCloseEvent *event) { } } -void MainWin::changeEvent(QEvent *event) { -#ifdef Q_WS_WIN - if(event->type() == QEvent::ActivationChange) - dwTickCount = GetTickCount(); // needed for toggleMinimizedToTray() -#endif - - QMainWindow::changeEvent(event); -} - -void MainWin::hideToTray() { - if(!systemTray()->isSystemTrayAvailable()) { - qWarning() << Q_FUNC_INFO << "was called with no SystemTray available!"; - return; - } - hide(); - systemTray()->setIconVisible(); -} - -void MainWin::toggleMinimizedToTray() { -#ifdef Q_WS_WIN - // the problem is that we lose focus when the systray icon is activated - // and we don't know the former active window - // therefore we watch for activation event and use our stopwatch :) - // courtesy: KSystemTrayIcon - if(GetTickCount() - dwTickCount >= 300) - // we weren't active in the last 300ms -> activate - forceActivated(); - else - hideToTray(); - -#else - - if(!isVisible() || isMinimized()) - // restore - forceActivated(); - else - hideToTray(); - -#endif -} - -void MainWin::forceActivated() { -#ifdef HAVE_KDE - show(); - KWindowSystem::forceActiveWindow(winId()); -#else - -#ifdef Q_WS_X11 - // Bypass focus stealing prevention - QX11Info::setAppUserTime(QX11Info::appTime()); -#endif - - if(windowState() & Qt::WindowMinimized) { - // restore - setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); - } - - // this does not actually work on all platforms... and causes more evil than good - // move(frameGeometry().topLeft()); // avoid placement policies - show(); - raise(); - activateWindow(); -#endif /* HAVE_KDE */ -} - void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) { Q_UNUSED(parent);