X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=98ecdd38d95f98294559c426645664c4b7aa6476;hp=50e2731e7ea7403509a053317bb6ae39df25390e;hb=f19fea582ace1d8f3dfe29c1096c48758079e56e;hpb=e543fd403c4315d8569ea09d868b6fface37b207 diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 50e2731e..98ecdd38 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -26,6 +26,7 @@ # include # include # include +# include #endif #ifdef Q_WS_X11 @@ -37,6 +38,7 @@ #include "awaylogview.h" #include "action.h" #include "actioncollection.h" +#include "bufferhotlistfilter.h" #include "buffermodel.h" #include "bufferview.h" #include "bufferviewoverlay.h" @@ -52,14 +54,16 @@ #include "clientbacklogmanager.h" #include "clientbufferviewconfig.h" #include "clientbufferviewmanager.h" +#include "clientignorelistmanager.h" #include "coreinfodlg.h" #include "coreconnectdlg.h" #include "contextmenuactionprovider.h" +#include "debugbufferviewoverlay.h" #include "debuglogwidget.h" #include "debugmessagemodelfilter.h" +#include "flatproxymodel.h" #include "iconloader.h" #include "inputwidget.h" -#include "inputline.h" #include "irclistmodel.h" #include "ircconnectionwizard.h" #include "jumpkeyhandler.h" @@ -68,7 +72,7 @@ #include "qtuiapplication.h" #include "qtuimessageprocessor.h" #include "qtuisettings.h" -#include "sessionsettings.h" +#include "qtuistyle.h" #include "settingsdlg.h" #include "settingspagedlg.h" #include "systemtray.h" @@ -94,12 +98,17 @@ #include "settingspages/backlogsettingspage.h" #include "settingspages/bufferviewsettingspage.h" #include "settingspages/chatmonitorsettingspage.h" -#include "settingspages/colorsettingspage.h" +#include "settingspages/chatviewsettingspage.h" +#include "settingspages/connectionsettingspage.h" #include "settingspages/generalsettingspage.h" #include "settingspages/highlightsettingspage.h" #include "settingspages/identitiessettingspage.h" +#include "settingspages/ignorelistsettingspage.h" +#include "settingspages/inputwidgetsettingspage.h" +#include "settingspages/itemviewsettingspage.h" #include "settingspages/networkssettingspage.h" #include "settingspages/notificationssettingspage.h" +#include "settingspages/topicwidgetsettingspage.h" MainWin::MainWin(QWidget *parent) #ifdef HAVE_KDE @@ -131,25 +140,15 @@ MainWin::MainWin(QWidget *parent) updateIcon(); installEventFilter(new JumpKeyHandler(this)); - - QtUiApplication* app = qobject_cast qApp; - connect(app, SIGNAL(saveStateToSession(const QString&)), SLOT(saveStateToSession(const QString&))); - connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), SLOT(saveStateToSessionSettings(SessionSettings&))); } void MainWin::init() { - QtUiSettings s; - if(s.value("MainWinSize").isValid()) - resize(s.value("MainWinSize").toSize()); - else - resize(QSize(800, 500)); - - connect(QApplication::instance(), SIGNAL(aboutToQuit()), SLOT(saveLayout())); connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), SLOT(clientNetworkCreated(NetworkId))); connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), SLOT(clientNetworkRemoved(NetworkId))); 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(GraphicalUi::contextMenuActionProvider(), SIGNAL(showIgnoreList(QString)), SLOT(showIgnoreList(QString))); // Setup Dock Areas setDockNestingEnabled(true); @@ -170,6 +169,7 @@ void MainWin::init() { setupToolBars(); setupSystray(); setupTitleSetter(); + setupHotList(); #ifndef HAVE_KDE QtUi::registerNotificationBackend(new TaskbarNotificationBackend(this)); @@ -185,16 +185,21 @@ void MainWin::init() { QtUi::registerNotificationBackend(new KNotificationBackend(this)); #endif /* HAVE_KDE */ + connect(bufferWidget(), SIGNAL(currentChanged(BufferId)), SLOT(currentBufferChanged(BufferId))); + + setDisconnectedState(); // Disable menus and stuff + +#ifdef HAVE_KDE + setAutoSaveSettings(); +#endif + // restore mainwin state - restoreState(s.value("MainWinState").toByteArray()); + QtUiSettings s; + restoreStateFromSettings(s); // restore locked state of docks QtUi::actionCollection("General")->action("LockLayout")->setChecked(s.value("LockLayout", false).toBool()); - setDisconnectedState(); // Disable menus and stuff - - show(); - if(Quassel::runMode() != Quassel::Monolithic) { showCoreConnectionDlg(true); // autoconnect if appropriate } else { @@ -203,10 +208,58 @@ void MainWin::init() { } MainWin::~MainWin() { + +} + +void MainWin::quit() { QtUiSettings s; - s.setValue("MainWinSize", size()); - s.setValue("MainWinPos", pos()); + saveStateToSettings(s); + saveLayout(); + QApplication::quit(); +} + +void MainWin::saveStateToSettings(UiSettings &s) { + s.setValue("MainWinSize", _normalSize); + s.setValue("MainWinPos", _normalPos); s.setValue("MainWinState", saveState()); + s.setValue("MainWinGeometry", saveGeometry()); + s.setValue("MainWinMinimized", isMinimized()); + s.setValue("MainWinMaximized", isMaximized()); + s.setValue("MainWinHidden", !isVisible()); + +#ifdef HAVE_KDE + saveAutoSaveSettings(); +#endif +} + +void MainWin::restoreStateFromSettings(UiSettings &s) { + _normalSize = s.value("MainWinSize", size()).toSize(); + _normalPos = s.value("MainWinPos", pos()).toPoint(); + bool maximized = s.value("MainWinMaximized", false).toBool(); + +#ifndef HAVE_KDE + restoreGeometry(s.value("MainWinGeometry").toByteArray()); + + if(maximized) { + // restoreGeometry() fails if the windows was maximized, so we resize and position explicitly + resize(_normalSize); + move(_normalPos); + } + + restoreState(s.value("MainWinState").toByteArray()); + +#else + move(_normalPos); +#endif + + if(s.value("MainWinHidden").toBool()) + hideToTray(); + else if(s.value("MainWinMinimized").toBool()) + showMinimized(); + else if(maximized) + showMaximized(); + else + show(); } void MainWin::updateIcon() { @@ -237,10 +290,10 @@ void MainWin::setupActions() { coll->addAction("ConfigureNetworks", new Action(SmallIcon("configure"), tr("Configure &Networks..."), coll, this, SLOT(on_actionConfigureNetworks_triggered()))); coll->addAction("Quit", new Action(SmallIcon("application-exit"), tr("&Quit"), coll, - qApp, SLOT(quit()), tr("Ctrl+Q"))); + this, SLOT(quit()), tr("Ctrl+Q"))); // View - coll->addAction("ConfigureBufferViews", new Action(tr("&Configure Buffer Views..."), coll, + coll->addAction("ConfigureBufferViews", new Action(tr("&Configure Chat Lists..."), coll, this, SLOT(on_actionConfigureViews_triggered()))); QAction *lockAct = coll->addAction("LockLayout", new Action(tr("&Lock Layout"), coll)); @@ -251,8 +304,11 @@ void MainWin::setupActions() { 0, 0, QKeySequence::Find))->setCheckable(true); coll->addAction("ShowAwayLog", new Action(tr("Show Away Log"), coll, this, SLOT(showAwayLog()))); + coll->addAction("ToggleMenuBar", new Action(SmallIcon("show-menu"), tr("Show &Menubar"), coll, + 0, 0, tr("Ctrl+M")))->setCheckable(true); + coll->addAction("ToggleStatusBar", new Action(tr("Show Status &Bar"), coll, - 0, 0))->setCheckable(true); + 0, 0))->setCheckable(true); // Settings coll->addAction("ConfigureQuassel", new Action(SmallIcon("configure"), tr("&Configure Quassel..."), coll, @@ -269,8 +325,16 @@ void MainWin::setupActions() { this, SLOT(on_actionDebugBufferViewOverlay_triggered()))); coll->addAction("DebugMessageModel", new Action(SmallIcon("tools-report-bug"), tr("Debug &MessageModel"), coll, this, SLOT(on_actionDebugMessageModel_triggered()))); + coll->addAction("DebugHotList", new Action(SmallIcon("tools-report-bug"), tr("Debug &HotList"), coll, + this, SLOT(on_actionDebugHotList_triggered()))); coll->addAction("DebugLog", new Action(SmallIcon("tools-report-bug"), tr("Debug &Log"), coll, this, SLOT(on_actionDebugLog_triggered()))); + coll->addAction("ReloadStyle", new Action(SmallIcon("view-refresh"), tr("Reload Stylesheet"), coll, + QtUi::style(), SLOT(reload()), QKeySequence::Refresh)); + + // Navigation + coll->addAction("JumpHotBuffer", new Action(tr("Jump to hot chat"), coll, + this, SLOT(on_jumpHotBuffer_triggered()), QKeySequence(Qt::META + Qt::Key_A))); } void MainWin::setupMenus() { @@ -296,24 +360,26 @@ void MainWin::setupMenus() { _fileMenu->addAction(coll->action("Quit")); _viewMenu = menuBar()->addMenu(tr("&View")); - _bufferViewsMenu = _viewMenu->addMenu(tr("&Buffer Views")); + _bufferViewsMenu = _viewMenu->addMenu(tr("&Chat Lists")); _bufferViewsMenu->addAction(coll->action("ConfigureBufferViews")); _toolbarMenu = _viewMenu->addMenu(tr("&Toolbars")); _viewMenu->addSeparator(); + + _viewMenu->addAction(coll->action("ToggleMenuBar")); + _viewMenu->addAction(coll->action("ToggleStatusBar")); _viewMenu->addAction(coll->action("ToggleSearchBar")); coreAction = coll->action("ShowAwayLog"); flagRemoteCoreOnly(coreAction); _viewMenu->addAction(coreAction); - _viewMenu->addAction(coll->action("ToggleStatusBar")); _viewMenu->addSeparator(); _viewMenu->addAction(coll->action("LockLayout")); _settingsMenu = menuBar()->addMenu(tr("&Settings")); #ifdef HAVE_KDE - _settingsMenu->addAction(KStandardAction::keyBindings(this, SLOT(showShortcutsDlg()), this)); _settingsMenu->addAction(KStandardAction::configureNotifications(this, SLOT(showNotificationsDlg()), this)); + _settingsMenu->addAction(KStandardAction::keyBindings(this, SLOT(showShortcutsDlg()), this)); #endif _settingsMenu->addAction(coll->action("ConfigureQuassel")); @@ -329,7 +395,21 @@ void MainWin::setupMenus() { _helpDebugMenu->addAction(coll->action("DebugNetworkModel")); _helpDebugMenu->addAction(coll->action("DebugBufferViewOverlay")); _helpDebugMenu->addAction(coll->action("DebugMessageModel")); + _helpDebugMenu->addAction(coll->action("DebugHotList")); _helpDebugMenu->addAction(coll->action("DebugLog")); + _helpDebugMenu->addSeparator(); + _helpDebugMenu->addAction(coll->action("ReloadStyle")); + + // Toggle visibility + QAction *showMenuBar = QtUi::actionCollection("General")->action("ToggleMenuBar"); + + QtUiSettings uiSettings; + bool enabled = uiSettings.value("ShowMenuBar", QVariant(true)).toBool(); + showMenuBar->setChecked(enabled); + enabled ? menuBar()->show() : menuBar()->hide(); + + connect(showMenuBar, SIGNAL(toggled(bool)), menuBar(), SLOT(setVisible(bool))); + connect(showMenuBar, SIGNAL(toggled(bool)), this, SLOT(saveMenuBarStatus(bool))); } void MainWin::setupBufferWidget() { @@ -353,7 +433,7 @@ void MainWin::addBufferView(ClientBufferViewConfig *config) { //create the view and initialize it's filter BufferView *view = new BufferView(dock); view->setFilteredModel(Client::bufferModel(), config); - view->installEventFilter(_inputWidget->inputLine()); // for key presses + view->installEventFilter(_inputWidget); // for key presses view->show(); Client::bufferModel()->synchronizeView(view); @@ -552,6 +632,17 @@ void MainWin::setupStatusBar() { connect(showStatusbar, SIGNAL(toggled(bool)), this, SLOT(saveStatusBarStatus(bool))); } +void MainWin::setupHotList() { + FlatProxyModel *flatProxy = new FlatProxyModel(this); + flatProxy->setSourceModel(Client::bufferModel()); + _bufferHotList = new BufferHotListFilter(flatProxy); +} + +void MainWin::saveMenuBarStatus(bool enabled) { + QtUiSettings uiSettings; + uiSettings.setValue("ShowMenuBar", enabled); +} + void MainWin::saveStatusBarStatus(bool enabled) { QtUiSettings uiSettings; uiSettings.setValue("ShowStatusBar", enabled); @@ -570,20 +661,18 @@ void MainWin::setupToolBars() { #ifdef Q_WS_MAC setUnifiedTitleAndToolBarOnMac(true); #endif - _mainToolBar = addToolBar(tr("Main Toolbar")); + +#ifdef HAVE_KDE + _mainToolBar = new KToolBar("MainToolBar", this, Qt::TopToolBarArea, false, true, true); +#else + _mainToolBar = new QToolBar(this); _mainToolBar->setObjectName("MainToolBar"); +#endif + _mainToolBar->setWindowTitle(tr("Main Toolbar")); + addToolBar(_mainToolBar); QtUi::toolBarActionProvider()->addActions(_mainToolBar, ToolBarActionProvider::MainToolBar); _toolbarMenu->addAction(_mainToolBar->toggleViewAction()); - - //_nickToolBar = addToolBar("User"); - //_nickToolBar->setObjectName("NickToolBar"); - //QtUi::toolBarActionProvider()->addActions(_nickToolBar, ToolBarActionProvider::NickToolBar); - -#ifdef HAVE_KDE - _mainToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); - //_nickToolBar->setToolButtonStyle(Qt::ToolButtonTextUnderIcon); -#endif } void MainWin::connectedToCore() { @@ -724,6 +813,14 @@ void MainWin::showChannelList(NetworkId netId) { channelListDlg->show(); } +void MainWin::showIgnoreList(QString newRule) { + SettingsPageDlg dlg(new IgnoreListSettingsPage(this), this); + // prepare config dialog for new rule + if(!newRule.isEmpty()) + qobject_cast(dlg.currentPage())->editIgnoreRule(newRule); + dlg.exec(); +} + void MainWin::showCoreInfoDlg() { CoreInfoDlg(this).exec(); } @@ -746,9 +843,12 @@ void MainWin::awayLogDestroyed() { void MainWin::showSettingsDlg() { SettingsDlg *dlg = new SettingsDlg(); - //Category: Appearance - dlg->registerSettingsPage(new AppearanceSettingsPage(dlg)); //General - dlg->registerSettingsPage(new ColorSettingsPage(dlg)); + //Category: Interface + dlg->registerSettingsPage(new AppearanceSettingsPage(dlg)); + dlg->registerSettingsPage(new ChatViewSettingsPage(dlg)); + dlg->registerSettingsPage(new ItemViewSettingsPage(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)); @@ -757,9 +857,11 @@ void MainWin::showSettingsDlg() { //Category: Misc dlg->registerSettingsPage(new GeneralSettingsPage(dlg)); + 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)); dlg->show(); } @@ -774,43 +876,51 @@ void MainWin::showShortcutsDlg() { } #endif +/********************************************************************************************************/ + +bool MainWin::event(QEvent *event) { + if(event->type() == QEvent::WindowActivate) { + BufferId buffer = Client::bufferModel()->currentBuffer(); + if(buffer.isValid()) + QtUi::closeNotifications(buffer); + } + return QMainWindow::event(event); +} + +void MainWin::moveEvent(QMoveEvent *event) { + if(!(windowState() & Qt::WindowMaximized)) + _normalPos = event->pos(); + + QMainWindow::moveEvent(event); +} + +void MainWin::resizeEvent(QResizeEvent *event) { + if(!(windowState() & Qt::WindowMaximized)) + _normalSize = event->size(); + + QMainWindow::resizeEvent(event); +} + void MainWin::closeEvent(QCloseEvent *event) { QtUiSettings s; QtUiApplication* app = qobject_cast qApp; Q_ASSERT(app); - if(!app->aboutToQuit() && s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnClose").toBool()) { - toggleMinimizedToTray(); + if(!app->isAboutToQuit() && s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnClose").toBool()) { + hideToTray(); event->ignore(); } else { event->accept(); - QApplication::quit(); + quit(); } } -bool MainWin::event(QEvent *event) { - if(event->type() == QEvent::WindowActivate) - QtUi::closeNotifications(); - return QMainWindow::event(event); -} - void MainWin::changeEvent(QEvent *event) { - if(event->type() == QEvent::WindowStateChange) { - if(windowState() & Qt::WindowMinimized) { - QtUiSettings s; - if(s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnMinimize").toBool()) { - hideToTray(); - event->accept(); - return; - } - } - } - #ifdef Q_WS_WIN - else if(event->type() == QEvent::ActivationChange) + if(event->type() == QEvent::ActivationChange) dwTickCount = GetTickCount(); // needed for toggleMinimizedToTray() #endif - event->ignore(); + QMainWindow::changeEvent(event); } void MainWin::hideToTray() { @@ -856,7 +966,8 @@ void MainWin::forceActivated() { setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); } - move(frameGeometry().topLeft()); // avoid placement policies + // this does not actually work on all platforms... and causes more evil than good + // move(frameGeometry().topLeft()); // avoid placement policies show(); raise(); activateWindow(); @@ -876,16 +987,17 @@ void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) { Message::Flags flags = (Message::Flags)idx.data(ChatLineModel::FlagsRole).toInt(); if(flags.testFlag(Message::Backlog) || flags.testFlag(Message::Self)) continue; - flags |= Message::Backlog; // we only want to trigger a highlight once! - Client::messageModel()->setData(idx, (int)flags, ChatLineModel::FlagsRole); BufferId bufId = idx.data(ChatLineModel::BufferIdRole).value(); BufferInfo::Type bufType = Client::networkModel()->bufferType(bufId); - if(hasFocus && bufId == _bufferWidget->currentBuffer()) + if(hasFocus && bufId == Client::bufferModel()->currentBuffer()) continue; - if(flags & Message::Highlight || bufType == BufferInfo::QueryBuffer) { + if((flags & Message::Highlight || bufType == BufferInfo::QueryBuffer) + && !(Client::ignoreListManager() && Client::ignoreListManager()->match(idx.data(MessageModel::MessageRole).value(), + Client::networkModel()->networkName(bufId)))) + { QModelIndex senderIdx = Client::messageModel()->index(i, ChatLineModel::SenderColumn); QString sender = senderIdx.data(ChatLineModel::EditRole).toString(); QString contents = idx.data(ChatLineModel::DisplayRole).toString(); @@ -905,6 +1017,11 @@ void MainWin::messagesInserted(const QModelIndex &parent, int start, int end) { } } +void MainWin::currentBufferChanged(BufferId buffer) { + if(buffer.isValid()) + QtUi::closeNotifications(buffer); +} + void MainWin::clientNetworkCreated(NetworkId id) { const Network *net = Client::network(id); QAction *act = new QAction(net->networkName(), this); @@ -965,6 +1082,15 @@ void MainWin::connectOrDisconnectFromNet() { else net->requestDisconnect(); } +void MainWin::on_jumpHotBuffer_triggered() { + if(!_bufferHotList->rowCount()) + return; + + QModelIndex topIndex = _bufferHotList->index(0, 0); + BufferId bufferId = _bufferHotList->data(topIndex, NetworkModel::BufferIdRole).value(); + Client::bufferModel()->switchToBuffer(bufferId); +} + void MainWin::on_actionDebugNetworkModel_triggered() { QTreeView *view = new QTreeView; view->setAttribute(Qt::WA_DeleteOnClose); @@ -977,20 +1103,19 @@ void MainWin::on_actionDebugNetworkModel_triggered() { view->show(); } -void MainWin::on_actionDebugBufferViewOverlay_triggered() { +void MainWin::on_actionDebugHotList_triggered() { QTreeView *view = new QTreeView; view->setAttribute(Qt::WA_DeleteOnClose); - view->setWindowTitle("Debug BufferViewOverlay View"); - BufferViewOverlayFilter *filter = new BufferViewOverlayFilter(Client::bufferModel(), Client::bufferViewOverlay()); - filter->setParent(view); - view->setModel(filter); - view->setColumnWidth(0, 250); - view->setColumnWidth(1, 250); - view->setColumnWidth(2, 80); - view->resize(610, 300); + view->setModel(_bufferHotList); view->show(); } +void MainWin::on_actionDebugBufferViewOverlay_triggered() { + DebugBufferViewOverlay *overlay = new DebugBufferViewOverlay(0); + overlay->setAttribute(Qt::WA_DeleteOnClose); + overlay->show(); +} + void MainWin::on_actionDebugMessageModel_triggered() { QTableView *view = new QTableView(0); DebugMessageModelFilter *filter = new DebugMessageModelFilter(view); @@ -1007,22 +1132,6 @@ void MainWin::on_actionDebugLog_triggered() { logWidget->show(); } -void MainWin::saveStateToSession(const QString &sessionId) { - return; - SessionSettings s(sessionId); - - s.setValue("MainWinSize", size()); - s.setValue("MainWinPos", pos()); - s.setValue("MainWinState", saveState()); -} - -void MainWin::saveStateToSessionSettings(SessionSettings & s) -{ - s.setValue("MainWinSize", size()); - s.setValue("MainWinPos", pos()); - s.setValue("MainWinState", saveState()); -} - void MainWin::showStatusBarMessage(const QString &message) { statusBar()->showMessage(message, 10000); }