X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fmainwin.cpp;h=2ae203d9aaba1e1ccfc0746c8563917df5f5f21f;hp=52699e93cc134a4bb7f18492731291fec8f5390b;hb=d3f60cb05a682113f75ff21beb1c7fcdf9a85b67;hpb=25eb89768427a8c62f0ea776d05407db3aec2f97 diff --git a/src/qtui/mainwin.cpp b/src/qtui/mainwin.cpp index 52699e93..2ae203d9 100644 --- a/src/qtui/mainwin.cpp +++ b/src/qtui/mainwin.cpp @@ -28,6 +28,7 @@ #include "channellistdlg.h" #include "client.h" #include "clientbacklogmanager.h" +#include "coreinfodlg.h" #include "coreconnectdlg.h" #include "networkmodel.h" #include "buffermodel.h" @@ -40,6 +41,7 @@ #include "irclistmodel.h" #include "verticaldock.h" #include "uisettings.h" +#include "util.h" #include "qtuisettings.h" #include "jumpkeyhandler.h" @@ -48,6 +50,7 @@ #include "selectionmodelsynchronizer.h" #include "mappedselectionmodel.h" +#include "settingspages/aliasessettingspage.h" #include "settingspages/appearancesettingspage.h" #include "settingspages/bufferviewsettingspage.h" #include "settingspages/colorsettingspage.h" @@ -62,10 +65,10 @@ #include "global.h" #include "qtuistyle.h" - MainWin::MainWin(QtUi *_gui, QWidget *parent) : QMainWindow(parent), gui(_gui), + coreLagLabel(new QLabel()), sslLabel(new QLabel()), _titleSetter(this), systray(new QSystemTrayIcon(this)), @@ -78,6 +81,14 @@ MainWin::MainWin(QtUi *_gui, QWidget *parent) settingsDlg(new SettingsDlg(this)), debugConsole(new DebugConsole(this)) { + UiSettings uiSettings; + loadTranslation(uiSettings.value("Locale", QLocale::system()).value()); + + QString style = uiSettings.value("Style", QString("")).toString(); + if(style != "") { + QApplication::setStyle(style); + } + ui.setupUi(this); setWindowTitle("Quassel IRC"); setWindowIcon(offlineTrayIcon); @@ -94,6 +105,16 @@ MainWin::MainWin(QtUi *_gui, QWidget *parent) if(style != "") { QApplication::setStyle(style); } + +#ifdef HAVE_DBUS + desktopNotifications = new org::freedesktop::Notifications( + "org.freedesktop.Notifications", + "/org/freedesktop/Notifications", + QDBusConnection::sessionBus(), this); + notificationId = 0; + connect(desktopNotifications, SIGNAL(NotificationClosed(uint, uint)), this, SLOT(desktopNotificationClosed(uint, uint))); + connect(desktopNotifications, SIGNAL(ActionInvoked(uint, const QString&)), this, SLOT(desktopNotificationInvoked(uint, const QString&))); +#endif } void MainWin::init() { @@ -109,7 +130,6 @@ void MainWin::init() { connect(Client::instance(), SIGNAL(networkCreated(NetworkId)), this, SLOT(clientNetworkCreated(NetworkId))); connect(Client::instance(), SIGNAL(networkRemoved(NetworkId)), this, SLOT(clientNetworkRemoved(NetworkId))); - //ui.bufferWidget->init(); show(); @@ -130,12 +150,6 @@ void MainWin::init() { setupTopicWidget(); setupChatMonitor(); setupInputWidget(); - - QAction *toggleLockDocksAction = ui.menuViews->addAction(tr("Lock dock positions")); - toggleLockDocksAction->setCheckable(true); - connect(toggleLockDocksAction, SIGNAL(toggled(bool)), this, SLOT(lockVerticalDocks(bool))); - toggleLockDocksAction->setChecked(s.value("LockDocks", false).toBool()); - setupStatusBar(); setupSystray(); @@ -144,6 +158,10 @@ void MainWin::init() { // restore mainwin state restoreState(s.value("MainWinState").toByteArray()); + // restore locked state of docks + ui.actionLockDockPositions->setChecked(s.value("LockDocks", false).toBool()); + + setDisconnectedState(); // Disable menus and stuff showCoreConnectionDlg(true); // autoconnect if appropriate @@ -165,22 +183,15 @@ MainWin::~MainWin() { void MainWin::setupMenus() { connect(ui.actionConnectCore, SIGNAL(triggered()), this, SLOT(showCoreConnectionDlg())); connect(ui.actionDisconnectCore, SIGNAL(triggered()), Client::instance(), SLOT(disconnectFromCore())); + connect(ui.actionCoreInfo, SIGNAL(triggered()), this, SLOT(showCoreInfoDlg())); connect(ui.actionQuit, SIGNAL(triggered()), QCoreApplication::instance(), SLOT(quit())); - //connect(ui.actionNetworkList, SIGNAL(triggered()), this, SLOT(showServerList())); connect(ui.actionSettingsDlg, SIGNAL(triggered()), this, SLOT(showSettingsDlg())); // connect(ui.actionDebug_Console, SIGNAL(triggered()), this, SLOT(showDebugConsole())); connect(ui.actionAboutQuassel, SIGNAL(triggered()), this, SLOT(showAboutDlg())); connect(ui.actionAboutQt, SIGNAL(triggered()), QApplication::instance(), SLOT(aboutQt())); - - actionEditNetworks = new QAction(QIcon(":/22x22/actions/configure"), tr("Edit &Networks..."), this); - ui.menuNetworks->addAction(actionEditNetworks); - connect(actionEditNetworks, SIGNAL(triggered()), this, SLOT(showNetworkDlg())); - connect(ui.actionManageViews, SIGNAL(triggered()), this, SLOT(showManageViewsDlg())); } void MainWin::setupViews() { - QAction *separator = ui.menuViews->addSeparator(); - separator->setData("__EOBV__"); addBufferView(); } @@ -208,16 +219,7 @@ void MainWin::addBufferView(BufferViewConfig *config) { dock->show(); addDockWidget(Qt::LeftDockWidgetArea, dock); - - QAction *endOfBufferViews = 0; - foreach(QAction *action, ui.menuViews->actions()) { - if(action->data().toString() == "__EOBV__") { - endOfBufferViews = action; - break; - } - } - Q_CHECK_PTR(endOfBufferViews); - ui.menuViews->insertAction(endOfBufferViews, dock->toggleViewAction()); + ui.menuBufferViews->addAction(dock->toggleViewAction()); _netViews.append(dock); } @@ -225,13 +227,10 @@ void MainWin::addBufferView(BufferViewConfig *config) { void MainWin::removeBufferView(int bufferViewConfigId) { QVariant actionData; BufferViewDock *dock; - foreach(QAction *action, ui.menuViews->actions()) { + foreach(QAction *action, ui.menuBufferViews->actions()) { actionData = action->data(); if(!actionData.isValid()) continue; - - if(actionData.toString() == "__EOBV__") - break; dock = qobject_cast(action->parent()); if(dock && actionData.toInt() == bufferViewConfigId) { @@ -249,23 +248,24 @@ void MainWin::setupSettingsDlg() { //Category: Behaviour settingsDlg->registerSettingsPage(new GeneralSettingsPage(settingsDlg)); settingsDlg->registerSettingsPage(new HighlightSettingsPage(settingsDlg)); + settingsDlg->registerSettingsPage(new AliasesSettingsPage(settingsDlg)); //Category: General settingsDlg->registerSettingsPage(new IdentitiesSettingsPage(settingsDlg)); settingsDlg->registerSettingsPage(new NetworksSettingsPage(settingsDlg)); settingsDlg->registerSettingsPage(new BufferViewSettingsPage(settingsDlg)); } -void MainWin::showNetworkDlg() { +void MainWin::on_actionEditNetworks_triggered() { SettingsPageDlg dlg(new NetworksSettingsPage(this), this); dlg.exec(); } -void MainWin::showManageViewsDlg() { +void MainWin::on_actionManageViews_triggered() { SettingsPageDlg dlg(new BufferViewSettingsPage(this), this); dlg.exec(); } -void MainWin::lockVerticalDocks(bool lock) { +void MainWin::on_actionLockDockPositions_toggled(bool lock) { QList docks = findChildren(); foreach(VerticalDock *dock, docks) { dock->showTitle(!lock); @@ -349,6 +349,12 @@ void MainWin::setupTopicWidget() { } void MainWin::setupStatusBar() { + // Core Lag: + updateLagIndicator(0); + statusBar()->addPermanentWidget(coreLagLabel); + connect(Client::signalProxy(), SIGNAL(lagUpdated(int)), this, SLOT(updateLagIndicator(int))); + + // SSL indicator connect(Client::instance(), SIGNAL(securedConnection()), this, SLOT(securedConnection())); sslLabel->setPixmap(QPixmap()); statusBar()->addPermanentWidget(sslLabel); @@ -423,7 +429,7 @@ void MainWin::connectedToCore() { connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigAdded(int)), this, SLOT(addBufferView(int))); connect(Client::bufferViewManager(), SIGNAL(bufferViewConfigDeleted(int)), this, SLOT(removeBufferView(int))); connect(Client::bufferViewManager(), SIGNAL(initDone()), this, SLOT(loadLayout())); - + foreach(BufferInfo id, Client::allBufferInfos()) { Client::backlogManager()->requestBacklog(id.bufferId(), 500, -1); } @@ -431,11 +437,11 @@ void MainWin::connectedToCore() { } void MainWin::setConnectedState() { - ui.menuViews->setEnabled(true); //ui.menuCore->setEnabled(true); ui.actionConnectCore->setEnabled(false); ui.actionDisconnectCore->setEnabled(true); - //ui.actionNetworkList->setEnabled(true); + ui.actionCoreInfo->setEnabled(true); + ui.menuViews->setEnabled(true); ui.bufferWidget->show(); statusBar()->showMessage(tr("Connected to core.")); setWindowIcon(onlineTrayIcon); @@ -457,10 +463,13 @@ void MainWin::saveLayout() { if(accountId > 0) s.setValue(QString("MainWinState-%1").arg(accountId) , saveState(accountId)); } +void MainWin::updateLagIndicator(int lag) { + coreLagLabel->setText(QString("Core Lag: %1 msec").arg(lag)); +} + + void MainWin::securedConnection() { // todo: make status bar entry - qDebug() << "secured the connection"; - sslLabel->setPixmap(QPixmap::fromImage(QImage(":/16x16/status/ssl"))); } @@ -469,13 +478,10 @@ void MainWin::disconnectedFromCore() { saveLayout(); QVariant actionData; BufferViewDock *dock; - foreach(QAction *action, ui.menuViews->actions()) { + foreach(QAction *action, ui.menuBufferViews->actions()) { actionData = action->data(); if(!actionData.isValid()) continue; - - if(actionData.toString() == "__EOBV__") - break; dock = qobject_cast(action->parent()); if(dock && actionData.toInt() != -1) { @@ -489,13 +495,12 @@ void MainWin::disconnectedFromCore() { } void MainWin::setDisconnectedState() { - ui.menuViews->setEnabled(false); //ui.menuCore->setEnabled(false); + ui.actionConnectCore->setEnabled(true); ui.actionDisconnectCore->setEnabled(false); - //ui.actionNetworkList->setEnabled(false); + ui.actionCoreInfo->setEnabled(false); + ui.menuViews->setEnabled(false); ui.bufferWidget->hide(); - ui.actionConnectCore->setEnabled(true); - // nickListWidget->reset(); statusBar()->showMessage(tr("Not connected to core.")); setWindowIcon(offlineTrayIcon); qApp->setWindowIcon(offlineTrayIcon); @@ -525,6 +530,11 @@ void MainWin::showChannelList(NetworkId netId) { channelListDlg->show(); } +void MainWin::showCoreInfoDlg() { + CoreInfoDlg dlg(this); + dlg.exec(); +} + void MainWin::showSettingsDlg() { settingsDlg->show(); } @@ -598,10 +608,15 @@ void MainWin::receiveMessage(const Message &msg) { UiSettings uiSettings; #ifndef SPUTDEV - if(uiSettings.value("DisplayPopupMessages", QVariant(true)).toBool()) { + bool displayBubble = uiSettings.value("NotificationBubble", QVariant(true)).toBool(); + bool displayDesktop = uiSettings.value("NotificationDesktop", QVariant(true)).toBool(); + if(displayBubble || displayDesktop) { // FIXME don't invoke style engine for this! QString text = QtUi::style()->styleString(Message::mircToInternal(msg.contents())).plainText; - displayTrayIconMessage(title, text); + if(displayBubble) displayTrayIconMessage(title, text); +# ifdef HAVE_DBUS + if(displayDesktop) sendDesktopNotification(title, text); +# endif } #endif if(uiSettings.value("AnimateTrayIcon", QVariant(true)).toBool()) { @@ -617,6 +632,57 @@ bool MainWin::event(QEvent *event) { return QMainWindow::event(event); } +#ifdef HAVE_DBUS + +/* +Using the notification-daemon from Freedesktop's Galago project +http://www.galago-project.org/specs/notification/0.9/x408.html#command-notify +*/ +void MainWin::sendDesktopNotification(const QString &title, const QString &message) { + QStringList actions; + QMap hints; + UiSettings uiSettings; + + hints["x"] = uiSettings.value("NotificationDesktopHintX", QVariant(0)).toInt(); // Standard hint: x location for the popup to show up + hints["y"] = uiSettings.value("NotificationDesktopHintY", QVariant(0)).toInt(); // Standard hint: y location for the popup to show up + + actions << "click" << "Click Me!"; + + QDBusReply reply = desktopNotifications->Notify( + "Quassel", // Application name + notificationId, // ID of previous notification to replace + "", // Icon to display + title, // Summary / Header of the message to display + QString("%1: %2:\n%3").arg(QTime::currentTime().toString()).arg(title).arg(message), // Body of the message to display + actions, // Actions from which the user may choose + hints, // Hints to the server displaying the message + uiSettings.value("NotificationDesktopTimeout", QVariant(5000)).toInt() // Timeout in milliseconds + ); + + if(!reply.isValid()) { + /* ERROR */ + qDebug() << "Error on sending notification..."; + return; + } + + notificationId = reply.value(); + + qDebug() << "ID: " << notificationId << " Time: " << QTime::currentTime().toString(); +} + + +void MainWin::desktopNotificationClosed(uint id, uint reason) { + qDebug() << "OID: " << notificationId << " ID: " << id << " Reason: " << reason << " Time: " << QTime::currentTime().toString(); + notificationId = 0; +} + + +void MainWin::desktopNotificationInvoked(uint id, const QString & action) { + qDebug() << "OID: " << notificationId << " ID: " << id << " Action: " << action << " Time: " << QTime::currentTime().toString(); +} + +#endif /* HAVE_DBUS */ + void MainWin::displayTrayIconMessage(const QString &title, const QString &message) { systray->showMessage(title, message); } @@ -641,61 +707,58 @@ void MainWin::makeTrayIconBlink() { } } - - void MainWin::clientNetworkCreated(NetworkId id) { const Network *net = Client::network(id); QAction *act = new QAction(net->networkName(), this); + act->setObjectName(QString("NetworkAction-%1").arg(id.toInt())); act->setData(QVariant::fromValue(id)); connect(net, SIGNAL(updatedRemotely()), this, SLOT(clientNetworkUpdated())); connect(act, SIGNAL(triggered()), this, SLOT(connectOrDisconnectFromNet())); - bool inserted = false; - for(int i = 0; i < networkActions.count(); i++) { - if(net->networkName().localeAwareCompare(networkActions[i]->text()) < 0) { - networkActions.insert(i, act); - inserted = true; + + QAction *beforeAction = 0; + foreach(QAction *action, ui.menuNetworks->actions()) { + if(action->isSeparator()) { + beforeAction = action; + break; + } + if(net->networkName().localeAwareCompare(action->text()) < 0) { + beforeAction = action; break; } } - if(!inserted) networkActions.append(act); - ui.menuNetworks->clear(); // why the f*** isn't there a QMenu::insertAction()??? - foreach(QAction *a, networkActions) ui.menuNetworks->addAction(a); - ui.menuNetworks->addSeparator(); - ui.menuNetworks->addAction(actionEditNetworks); + Q_CHECK_PTR(beforeAction); + ui.menuNetworks->insertAction(beforeAction, act); } void MainWin::clientNetworkUpdated() { const Network *net = qobject_cast(sender()); - if(!net) return; - foreach(QAction *a, networkActions) { - if(a->data().value() == net->networkId()) { - a->setText(net->networkName()); - if(net->connectionState() == Network::Initialized) { - a->setIcon(QIcon(":/16x16/actions/network-connect")); - //a->setEnabled(true); - } else if(net->connectionState() == Network::Disconnected) { - a->setIcon(QIcon(":/16x16/actions/network-disconnect")); - //a->setEnabled(true); - } else { - a->setIcon(QIcon(":/16x16/actions/gear")); - //a->setEnabled(false); - } - return; - } + if(!net) + return; + + QAction *action = findChild(QString("NetworkAction-%1").arg(net->networkId().toInt())); + if(!action) + return; + + action->setText(net->networkName()); + + switch(net->connectionState()) { + case Network::Initialized: + action->setIcon(QIcon(":/16x16/actions/network-connect")); + break; + case Network::Disconnected: + action->setIcon(QIcon(":/16x16/actions/network-disconnect")); + break; + default: + action->setIcon(QIcon(":/16x16/actions/gear")); } } void MainWin::clientNetworkRemoved(NetworkId id) { - QList::iterator actionIter = networkActions.begin();; - QAction *action; - while(actionIter != networkActions.end()) { - action = *actionIter; - if(action->data().value() == id) { - action->deleteLater(); - actionIter = networkActions.erase(actionIter); - } else - actionIter++; - } + QAction *action = findChild(QString("NetworkAction-%1").arg(id.toInt())); + if(!action) + return; + + action->deleteLater(); } void MainWin::connectOrDisconnectFromNet() {