X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=49c3d3d4ba14fd9987c6a313b6d4cc7b7c28a529;hp=7688512d34f11d4c93aca8756e735391e807ad92;hb=68ba16b2340ed20508bb7789c51b700b562f2392;hpb=123fc368f8705fa7799c04ee84af85999a7ebde3 diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 7688512d..49c3d3d4 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -114,6 +114,7 @@ #else /* HAVE_KDE */ # include "knotificationbackend.h" #endif /* HAVE_KDE */ +#include "systrayanimationnotificationbackend.h" #ifdef HAVE_LIBSNORE @@ -146,6 +147,8 @@ #include "settingspages/connectionsettingspage.h" #include "settingspages/coreaccountsettingspage.h" #include "settingspages/coreconnectionsettingspage.h" +#include +#include "settingspages/dccsettingspage.h" #include "settingspages/highlightsettingspage.h" #include "settingspages/identitiessettingspage.h" #include "settingspages/ignorelistsettingspage.h" @@ -190,6 +193,8 @@ MainWin::MainWin(QWidget *parent) setWindowTitle("Quassel IRC"); setWindowIconText("Quassel IRC"); + // Set the default icon for all windows + QApplication::setWindowIcon(QIcon::fromTheme("quassel")); updateIcon(); } @@ -201,9 +206,13 @@ void MainWin::init() connect(Client::messageModel(), SIGNAL(rowsInserted(const QModelIndex &, int, int)), SLOT(messagesInserted(const QModelIndex &, int, int))); connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showChannelList(NetworkId)), SLOT(showChannelList(NetworkId))); + connect(Client::instance(), SIGNAL(showChannelList(NetworkId)), SLOT(showChannelList(NetworkId))); + connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showNetworkConfig(NetworkId)), SLOT(showNetworkConfig(NetworkId))); connect(GraphicalUi::contextMenuActionProvider(), SIGNAL(showIgnoreList(QString)), SLOT(showIgnoreList(QString))); + connect(Client::instance(), SIGNAL(showIgnoreList(QString)), SLOT(showIgnoreList(QString))); + connect(Client::instance(), SIGNAL(dbUpgradeInProgress(bool)), SLOT(showMigrationWarning(bool))); - connect(Client::coreConnection(), SIGNAL(startCoreSetup(QVariantList)), SLOT(showCoreConfigWizard(QVariantList))); + connect(Client::coreConnection(), SIGNAL(startCoreSetup(QVariantList, QVariantList)), SLOT(showCoreConfigWizard(QVariantList, 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 *))); @@ -223,7 +232,7 @@ void MainWin::init() setupActions(); setupBufferWidget(); setupMenus(); - setupTransferWidget(); + // setupTransferWidget(); not ready yet setupChatMonitor(); setupTopicWidget(); setupInputWidget(); @@ -251,6 +260,9 @@ void MainWin::init() #endif /* HAVE_KDE */ +#ifndef QT_NO_SYSTEMTRAYICON + QtUi::registerNotificationBackend(new SystrayAnimationNotificationBackend(this)); +#endif #ifdef HAVE_LIBSNORE QtUi::registerNotificationBackend(new SnoreNotificationBackend(this)); #elif !defined(QT_NO_SYSTEMTRAYICON) && !defined(HAVE_KDE) @@ -377,9 +389,8 @@ void MainWin::updateIcon() if (Client::isConnected()) icon = QIcon::fromTheme("quassel", QIcon(":/icons/quassel-128.png")); else - icon = QIcon::fromTheme("quassel-inactive", QIcon(":/icons/quassel-128.png")); + icon = QIcon::fromTheme("inactive-quassel", QIcon(":/icons/inactive-quassel.png")); setWindowIcon(icon); - qApp->setWindowIcon(icon); } @@ -387,9 +398,9 @@ void MainWin::setupActions() { ActionCollection *coll = QtUi::actionCollection("General", tr("General")); // File - coll->addAction("ConnectCore", new Action(QIcon(":/icons/quassel-128.png"), tr("&Connect to Core..."), coll, + coll->addAction("ConnectCore", new Action(QIcon::fromTheme("connect-quassel", QIcon(":/icons/connect-quassel.png")), tr("&Connect to Core..."), coll, this, SLOT(showCoreConnectionDlg()))); - coll->addAction("DisconnectCore", new Action(QIcon(":/icons/quassel-disconnect.png"), tr("&Disconnect from Core"), coll, + coll->addAction("DisconnectCore", new Action(QIcon::fromTheme("disconnect-quassel", QIcon(":/icons/disconnect-quassel.png")), tr("&Disconnect from Core"), coll, Client::instance(), SLOT(disconnectFromCore()))); coll->addAction("ChangePassword", new Action(QIcon::fromTheme("dialog-password"), tr("Change &Password..."), coll, this, SLOT(showPasswordChangeDlg()))); @@ -397,7 +408,11 @@ void MainWin::setupActions() this, SLOT(showCoreInfoDlg()))); coll->addAction("ConfigureNetworks", new Action(QIcon::fromTheme("configure"), tr("Configure &Networks..."), coll, this, SLOT(on_actionConfigureNetworks_triggered()))); - // FIXME: use QKeySequence::Quit once we depend on Qt 4.6 + // QKeySequence::Quit was added in Qt 4.6, and could be used instead. However, that key + // sequence is empty by default on Windows, which would remove Ctrl-Q to quit. It may be best + // to just keep it this way. + // + // See https://doc.qt.io/qt-5/qkeysequence.html coll->addAction("Quit", new Action(QIcon::fromTheme("application-exit"), tr("&Quit"), coll, this, SLOT(quit()), Qt::CTRL + Qt::Key_Q)); @@ -465,11 +480,43 @@ void MainWin::setupActions() coll->addAction("DebugLog", new Action(QIcon::fromTheme("tools-report-bug"), tr("Debug &Log"), coll, this, SLOT(on_actionDebugLog_triggered()))); coll->addAction("ReloadStyle", new Action(QIcon::fromTheme("view-refresh"), tr("Reload Stylesheet"), coll, - QtUi::style(), SLOT(reload()), QKeySequence::Refresh)); + QtUi::style(), SLOT(reload()), QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_R))); coll->addAction("HideCurrentBuffer", new Action(tr("Hide Current Buffer"), coll, this, SLOT(hideCurrentBuffer()), QKeySequence::Close)); + // Text formatting + coll = QtUi::actionCollection("TextFormat", tr("Text formatting")); + + coll->addAction("FormatApplyColor", new Action( + QIcon::fromTheme("format-text-color"), tr("Apply foreground color"), coll, + this, SLOT(on_inputFormatApplyColor_triggered()), + QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_G))); + + coll->addAction("FormatApplyColorFill", new Action( + QIcon::fromTheme("format-fill-color"), tr("Apply background color"), coll, + this, SLOT(on_inputFormatApplyColorFill_triggered()), + QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_B))); + + coll->addAction("FormatClear", new Action( + QIcon::fromTheme("edit-clear"), tr("Clear formatting"), coll, + this, SLOT(on_inputFormatClear_triggered()), + QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_C))); + + coll->addAction("FormatBold", new Action( + QIcon::fromTheme("format-text-bold"), tr("Toggle bold"), coll, + this, SLOT(on_inputFormatBold_triggered()), + QKeySequence::Bold)); + + coll->addAction("FormatItalic", new Action( + QIcon::fromTheme("format-text-italic"), tr("Toggle italics"), coll, + this, SLOT(on_inputFormatItalic_triggered()), + QKeySequence::Italic)); + + coll->addAction("FormatUnderline", new Action( + QIcon::fromTheme("format-text-underline"), tr("Toggle underline"), coll, + this, SLOT(on_inputFormatUnderline_triggered()), QKeySequence::Underline)); + // Navigation coll = QtUi::actionCollection("Navigation", tr("Navigation")); @@ -653,6 +700,8 @@ void MainWin::addBufferView(ClientBufferViewConfig *config) Client::bufferModel()->synchronizeView(view); + dock->setLocked(QtUiSettings().value("LockLayout", false).toBool()); + dock->setWidget(view); dock->setVisible(_layoutLoaded); // don't show before state has been restored @@ -771,7 +820,7 @@ void MainWin::changeActiveBufferView(int bufferViewId) void MainWin::showPasswordChangeDlg() { - if((Client::coreFeatures() & Quassel::PasswordChange)) { + if(Client::isCoreFeatureEnabled(Quassel::Feature::PasswordChange)) { PasswordChangeDlg dlg(this); dlg.exec(); } @@ -785,6 +834,29 @@ void MainWin::showPasswordChangeDlg() } +void MainWin::showMigrationWarning(bool show) +{ + if (show && !_migrationWarning) { + _migrationWarning = new QMessageBox(QMessageBox::Information, + tr("Upgrading..."), + "" + tr("Your database is being upgraded") + "", + QMessageBox::NoButton, this); + _migrationWarning->setInformativeText("

" + + tr("In order to support new features, we need to make changes to your backlog database. This may take a long while.") + + "

" + + tr("Do not exit Quassel until the upgrade is complete!") + + "

"); + _migrationWarning->setStandardButtons(QMessageBox::NoButton); + _migrationWarning->show(); + } + else if (!show && _migrationWarning) { + _migrationWarning->close(); + _migrationWarning->deleteLater(); + _migrationWarning = nullptr; + } +} + + void MainWin::changeActiveBufferView(bool backwards) { if (_activeBufferViewIndex >= 0 && _activeBufferViewIndex < _bufferViews.count()) { @@ -880,11 +952,26 @@ void MainWin::on_actionLockLayout_toggled(bool lock) foreach(VerticalDock *dock, docks) { dock->showTitle(!lock); } + + QList nickdocks = findChildren(); + foreach(NickListDock *nickdock, nickdocks) { + nickdock->setLocked(lock); + } + + QList bufferdocks = findChildren(); + foreach(BufferViewDock *bufferdock, bufferdocks) { + bufferdock->setLocked(lock); + } + if (Client::bufferViewManager()) { foreach(ClientBufferViewConfig *config, Client::bufferViewManager()->clientBufferViewConfigs()) { config->setLocked(lock); } } + + _mainToolBar->setMovable(!lock); + _nickToolBar->setMovable(!lock); + QtUiSettings().setValue("LockLayout", lock); } @@ -895,6 +982,7 @@ void MainWin::setupNickWidget() NickListDock *nickDock = new NickListDock(tr("Nicks"), this); nickDock->setObjectName("NickDock"); nickDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); + nickDock->setLocked(QtUiSettings().value("LockLayout", false).toBool()); _nickListWidget = new NickListWidget(nickDock); nickDock->setWidget(_nickListWidget); @@ -1091,6 +1179,8 @@ void MainWin::setupToolBars() _mainToolBar->addAction(coll->action("DisconnectCore")); } + _mainToolBar->setMovable(!QtUiSettings().value("LockLayout", false).toBool()); + QtUi::toolBarActionProvider()->addActions(_mainToolBar, ToolBarActionProvider::MainToolBar); _toolbarMenu->addAction(_mainToolBar->toggleViewAction()); @@ -1103,6 +1193,7 @@ void MainWin::setupToolBars() _nickToolBar->setWindowTitle(tr("Nick Toolbar")); _nickToolBar->setVisible(false); //default: not visible addToolBar(_nickToolBar); + _nickToolBar->setMovable(!QtUiSettings().value("LockLayout", false).toBool()); QtUi::toolBarActionProvider()->addActions(_nickToolBar, ToolBarActionProvider::NickToolBar); _toolbarMenu->addAction(_nickToolBar->toggleViewAction()); @@ -1365,9 +1456,9 @@ void MainWin::showCoreConnectionDlg() } -void MainWin::showCoreConfigWizard(const QVariantList &backends) +void MainWin::showCoreConfigWizard(const QVariantList &backends, const QVariantList &authenticators) { - CoreConfigWizard *wizard = new CoreConfigWizard(Client::coreConnection(), backends, this); + CoreConfigWizard *wizard = new CoreConfigWizard(Client::coreConnection(), backends, authenticators, this); wizard->show(); } @@ -1389,6 +1480,15 @@ void MainWin::showChannelList(NetworkId netId) } +void MainWin::showNetworkConfig(NetworkId netId) +{ + SettingsPageDlg dlg(new NetworksSettingsPage(this), this); + if (netId.isValid()) + qobject_cast(dlg.currentPage())->bufferList_Open(netId); + dlg.exec(); +} + + void MainWin::showIgnoreList(QString newRule) { SettingsPageDlg dlg(new IgnoreListSettingsPage(this), this); @@ -1441,6 +1541,7 @@ void MainWin::showSettingsDlg() dlg->registerSettingsPage(new SonnetSettingsPage(dlg)); #endif dlg->registerSettingsPage(new HighlightSettingsPage(dlg)); + dlg->registerSettingsPage(new CoreHighlightSettingsPage(dlg)); dlg->registerSettingsPage(new NotificationsSettingsPage(dlg)); dlg->registerSettingsPage(new BacklogSettingsPage(dlg)); @@ -1450,6 +1551,7 @@ void MainWin::showSettingsDlg() dlg->registerSettingsPage(new NetworksSettingsPage(dlg)); dlg->registerSettingsPage(new AliasesSettingsPage(dlg)); dlg->registerSettingsPage(new IgnoreListSettingsPage(dlg)); + // dlg->registerSettingsPage(new DccSettingsPage(dlg)); not ready yet // Category: Remote Cores if (Quassel::runMode() != Quassel::Monolithic) { @@ -1485,8 +1587,10 @@ void MainWin::showNewTransferDlg(const QUuid &transferId) { auto transfer = Client::transferManager()->transfer(transferId); if (transfer) { - ReceiveFileDlg *dlg = new ReceiveFileDlg(transfer, this); - dlg->show(); + if (transfer->status() == Transfer::Status::New) { + ReceiveFileDlg *dlg = new ReceiveFileDlg(transfer, this); + dlg->show(); + } } else { qWarning() << "Unknown transfer ID" << transferId; @@ -1712,6 +1816,60 @@ void MainWin::connectOrDisconnectFromNet() } +void MainWin::on_inputFormatApplyColor_triggered() +{ + if (!_inputWidget) + return; + + _inputWidget->applyFormatActiveColor(); +} + + +void MainWin::on_inputFormatApplyColorFill_triggered() +{ + if (!_inputWidget) + return; + + _inputWidget->applyFormatActiveColorFill(); +} + + +void MainWin::on_inputFormatClear_triggered() +{ + if (!_inputWidget) + return; + + _inputWidget->clearFormat(); +} + + +void MainWin::on_inputFormatBold_triggered() +{ + if (!_inputWidget) + return; + + _inputWidget->toggleFormatBold(); +} + + +void MainWin::on_inputFormatItalic_triggered() +{ + if (!_inputWidget) + return; + + _inputWidget->toggleFormatItalic(); +} + + +void MainWin::on_inputFormatUnderline_triggered() +{ + if (!_inputWidget) + return; + + _inputWidget->toggleFormatUnderline(); +} + + void MainWin::on_jumpHotBuffer_triggered() { if (!_bufferHotList->rowCount())