X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=0f99020e7666e767ae10883c827f11da27d8d3d8;hp=b732a2c6aa1d6ce1dd91affcc569a99df8f266cb;hb=3497660529f9fa912f4d46ca2da9e0c97310076c;hpb=2fd8e1c1d5a04b167ffa73e9c011fd34faebe1fc diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index b732a2c6..0f99020e 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -98,6 +99,7 @@ #include "statusnotifieritem.h" #include "toolbaractionprovider.h" #include "topicwidget.h" +#include "transfermodel.h" #include "verticaldock.h" #ifndef HAVE_KDE @@ -140,9 +142,12 @@ #include "settingspages/bufferviewsettingspage.h" #include "settingspages/chatmonitorsettingspage.h" #include "settingspages/chatviewsettingspage.h" +#include "settingspages/chatviewcolorsettingspage.h" #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" @@ -172,7 +177,8 @@ MainWin::MainWin(QWidget *parent) _titleSetter(this), _awayLog(0), _layoutLoaded(false), - _activeBufferViewIndex(-1) + _activeBufferViewIndex(-1), + _aboutToQuit(false) { setAttribute(Qt::WA_DeleteOnClose, false); // we delete the mainwin manually @@ -197,9 +203,11 @@ 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(showIgnoreList(QString)), SLOT(showIgnoreList(QString))); + connect(Client::instance(), SIGNAL(showIgnoreList(QString)), SLOT(showIgnoreList(QString))); - 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 *))); @@ -219,10 +227,11 @@ void MainWin::init() setupActions(); setupBufferWidget(); setupMenus(); + // setupTransferWidget(); not ready yet + setupChatMonitor(); setupTopicWidget(); - setupNickWidget(); setupInputWidget(); - setupChatMonitor(); + setupNickWidget(); setupViewMenuTail(); setupStatusBar(); setupToolBars(); @@ -230,6 +239,9 @@ void MainWin::init() setupTitleSetter(); setupHotList(); + _bufferWidget->setFocusProxy(_inputWidget); + _chatMonitorView->setFocusProxy(_inputWidget); + #ifndef HAVE_KDE # ifdef HAVE_QTMULTIMEDIA QtUi::registerNotificationBackend(new QtMultimediaNotificationBackend(this)); @@ -353,6 +365,15 @@ void MainWin::restoreStateFromSettings(UiSettings &s) show(); } +QMenu *MainWin::createPopupMenu() +{ + QMenu *popupMenu = QMainWindow::createPopupMenu(); + popupMenu->addSeparator(); + ActionCollection *coll = QtUi::actionCollection("General"); + popupMenu->addAction(coll->action("ToggleMenuBar")); + return popupMenu; +} + void MainWin::updateIcon() { @@ -360,7 +381,7 @@ 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); } @@ -370,9 +391,9 @@ void MainWin::setupActions() { ActionCollection *coll = QtUi::actionCollection("General", tr("General")); // File - coll->addAction("ConnectCore", new Action(QIcon::fromTheme("network-connect"), 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::fromTheme("network-disconnect"), 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 +418,7 @@ void MainWin::setupActions() coll->addAction("ShowAwayLog", new Action(tr("Show Away Log"), coll, this, SLOT(showAwayLog()))); coll->addAction("ToggleMenuBar", new Action(QIcon::fromTheme("show-menu"), tr("Show &Menubar"), coll, - 0, 0, QKeySequence(Qt::CTRL + Qt::Key_M)))->setCheckable(true); + 0, 0))->setCheckable(true); coll->addAction("ToggleStatusBar", new Action(tr("Show Status &Bar"), coll, 0, 0))->setCheckable(true); @@ -459,6 +480,9 @@ void MainWin::setupActions() coll->addAction("JumpHotBuffer", new Action(tr("Jump to hot chat"), coll, this, SLOT(on_jumpHotBuffer_triggered()), QKeySequence(Qt::META + Qt::Key_A))); + coll->addAction("ActivateBufferFilter", new Action(tr("Activate the buffer search"), coll, + this, SLOT(on_bufferSearch_triggered()), QKeySequence(Qt::CTRL + Qt::Key_S))); + // Jump keys #ifdef Q_OS_MAC const int bindModifier = Qt::ControlModifier | Qt::AltModifier; @@ -633,6 +657,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 @@ -751,7 +777,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(); } @@ -860,11 +886,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); } @@ -875,6 +916,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); @@ -901,7 +943,6 @@ void MainWin::setupChatMonitor() ChatMonitorFilter *filter = new ChatMonitorFilter(Client::messageModel(), this); _chatMonitorView = new ChatMonitorView(filter, this); - _chatMonitorView->setFocusProxy(_inputWidget); _chatMonitorView->show(); dock->setWidget(_chatMonitorView); dock->hide(); @@ -928,8 +969,6 @@ void MainWin::setupInputWidget() _inputWidget->setModel(Client::bufferModel()); _inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel()); - _bufferWidget->setFocusProxy(_inputWidget); - _inputWidget->inputLine()->installEventFilter(_bufferWidget); connect(_topicWidget, SIGNAL(switchedPlain()), _bufferWidget, SLOT(setFocus())); @@ -954,6 +993,27 @@ void MainWin::setupTopicWidget() } +void MainWin::setupTransferWidget() +{ + auto dock = new QDockWidget(tr("Transfers"), this); + dock->setObjectName("TransferDock"); + dock->setAllowedAreas(Qt::TopDockWidgetArea|Qt::BottomDockWidgetArea); + + auto view = new QTableView(dock); // to be replaced by the real thing + view->setModel(Client::transferModel()); + dock->setWidget(view); + dock->hide(); // hidden by default + addDockWidget(Qt::TopDockWidgetArea, dock, Qt::Vertical); + + auto action = dock->toggleViewAction(); + action->setText(tr("Show File Transfers")); + action->setIcon(QIcon::fromTheme("download")); + action->setShortcut(QKeySequence(Qt::Key_F6)); + QtUi::actionCollection("General")->addAction("ShowTransferWidget", action); + _viewMenu->addAction(action); +} + + void MainWin::setupViewMenuTail() { _viewMenu->addSeparator(); @@ -1047,9 +1107,31 @@ void MainWin::setupToolBars() _mainToolBar->setWindowTitle(tr("Main Toolbar")); addToolBar(_mainToolBar); + if (Quassel::runMode() != Quassel::Monolithic) { + ActionCollection *coll = QtUi::actionCollection("General"); + _mainToolBar->addAction(coll->action("ConnectCore")); + _mainToolBar->addAction(coll->action("DisconnectCore")); + } + + _mainToolBar->setMovable(!QtUiSettings().value("LockLayout", false).toBool()); + QtUi::toolBarActionProvider()->addActions(_mainToolBar, ToolBarActionProvider::MainToolBar); _toolbarMenu->addAction(_mainToolBar->toggleViewAction()); +#ifdef HAVE_KDE + _nickToolBar = new KToolBar("NickToolBar", this, Qt::TopToolBarArea, false, true, true); +#else + _nickToolBar = new QToolBar(this); + _nickToolBar->setObjectName("NickToolBar"); +#endif + _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()); + #ifdef Q_OS_MAC QtUiSettings uiSettings; @@ -1077,7 +1159,9 @@ void MainWin::connectedToCore() connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigDeleted(int)), this, SLOT(removeBufferView(int))); connect(Client::bufferViewManager(), SIGNAL(initDone()), this, SLOT(loadLayout())); - connect(Client::transferManager(), SIGNAL(transferAdded(QUuid)), SLOT(showNewTransferDlg(QUuid))); + if (Client::transferManager()) { + connect(Client::transferManager(), SIGNAL(transferAdded(QUuid)), SLOT(showNewTransferDlg(QUuid))); + } setConnectedState(); } @@ -1306,9 +1390,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(); } @@ -1372,6 +1456,7 @@ void MainWin::showSettingsDlg() //Category: Interface dlg->registerSettingsPage(new AppearanceSettingsPage(dlg)); dlg->registerSettingsPage(new ChatViewSettingsPage(dlg)); + dlg->registerSettingsPage(new ChatViewColorSettingsPage(dlg)); dlg->registerSettingsPage(new ChatMonitorSettingsPage(dlg)); dlg->registerSettingsPage(new ItemViewSettingsPage(dlg)); dlg->registerSettingsPage(new BufferViewSettingsPage(dlg)); @@ -1381,6 +1466,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)); @@ -1390,6 +1476,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) { @@ -1425,8 +1512,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; @@ -1495,14 +1584,21 @@ void MainWin::closeEvent(QCloseEvent *event) QtUiSettings s; QtUiApplication *app = qobject_cast qApp; Q_ASSERT(app); - if (!app->isAboutToQuit() && QtUi::haveSystemTray() && s.value("MinimizeOnClose").toBool()) { + // On OSX it can happen that the closeEvent occurs twice. (Especially if packaged with Frameworks) + // This messes up MainWinState/MainWinHidden save/restore. + // It's a bug in Qt: https://bugreports.qt.io/browse/QTBUG-43344 + if (!_aboutToQuit && !app->isAboutToQuit() && QtUi::haveSystemTray() && s.value("MinimizeOnClose").toBool()) { QtUi::hideMainWidget(); event->ignore(); } - else { + else if(!_aboutToQuit) { + _aboutToQuit = true; event->accept(); quit(); } + else { + event->ignore(); + } } @@ -1653,6 +1749,16 @@ void MainWin::on_jumpHotBuffer_triggered() Client::bufferModel()->switchToBuffer(_bufferHotList->hottestBuffer()); } +void MainWin::on_bufferSearch_triggered() +{ + if (_activeBufferViewIndex < 0 || _activeBufferViewIndex >= _bufferViews.count()) { + qWarning() << "Tried to activate filter on invalid bufferview:" << _activeBufferViewIndex; + return; + } + + _bufferViews[_activeBufferViewIndex]->activateFilter(); +} + void MainWin::onJumpKey() {