/***************************************************************************
- * Copyright (C) 2005-08 by the Quassel Project *
+ * Copyright (C) 2005-09 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
***************************************************************************/
#include "mainwin.h"
+#ifdef HAVE_KDE
+# include <KAction>
+# include <KActionCollection>
+# include <KHelpMenu>
+# include <KMenuBar>
+# include <KShortcutsDialog>
+# include <KStatusBar>
+#endif
+
#include "aboutdlg.h"
#include "action.h"
#include "actioncollection.h"
#include "chatmonitorview.h"
#include "chatview.h"
#include "client.h"
+#include "clientsyncer.h"
#include "clientbacklogmanager.h"
#include "coreinfodlg.h"
#include "coreconnectdlg.h"
#include "topicwidget.h"
#include "verticaldock.h"
-#ifdef HAVE_DBUS
-# include "desktopnotificationbackend.h"
-#endif
-#ifdef HAVE_PHONON
-# include "phononnotificationbackend.h"
-#endif
-#include "systraynotificationbackend.h"
-#include "taskbarnotificationbackend.h"
+#ifndef HAVE_KDE
+# ifdef HAVE_DBUS
+# include "desktopnotificationbackend.h"
+# endif
+# ifdef HAVE_PHONON
+# include "phononnotificationbackend.h"
+# endif
+# include "systraynotificationbackend.h"
+# include "taskbarnotificationbackend.h"
+#else /* HAVE_KDE */
+# include "knotificationbackend.h"
+#endif /* HAVE_KDE */
#include "settingspages/aliasessettingspage.h"
#include "settingspages/appearancesettingspage.h"
#include "settingspages/backlogsettingspage.h"
#include "settingspages/bufferviewsettingspage.h"
-#include "settingspages/colorsettingspage.h"
#include "settingspages/chatmonitorsettingspage.h"
+#include "settingspages/colorsettingspage.h"
#include "settingspages/fontssettingspage.h"
#include "settingspages/generalsettingspage.h"
#include "settingspages/highlightsettingspage.h"
#include "settingspages/notificationssettingspage.h"
MainWin::MainWin(QWidget *parent)
+#ifdef HAVE_KDE
+ : KMainWindow(parent),
+ _kHelpMenu(new KHelpMenu(this, KGlobal::mainComponent().aboutData())),
+#else
: QMainWindow(parent),
+#endif
coreLagLabel(new QLabel()),
sslLabel(new QLabel()),
msgProcessorStatusWidget(new MsgProcessorStatusWidget()),
installEventFilter(new JumpKeyHandler(this));
- 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));
-#endif
-
QtUiApplication* app = qobject_cast<QtUiApplication*> qApp;
connect(app, SIGNAL(saveStateToSession(const QString&)), SLOT(saveStateToSession(const QString&)));
connect(app, SIGNAL(saveStateToSessionSettings(SessionSettings&)), SLOT(saveStateToSessionSettings(SessionSettings&)));
setupActions();
setupBufferWidget();
setupMenus();
- setupViews();
setupTopicWidget();
setupChatMonitor();
setupNickWidget();
setupSystray();
setupTitleSetter();
+#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));
+# endif
+
+#else /* HAVE_KDE */
+ QtUi::registerNotificationBackend(new KNotificationBackend(this));
+#endif /* HAVE_KDE */
+
// restore mainwin state
restoreState(s.value("MainWinState").toByteArray());
setDisconnectedState(); // Disable menus and stuff
show();
- showCoreConnectionDlg(true); // autoconnect if appropriate
+ if(Quassel::runMode() != Quassel::Monolithic) {
+ showCoreConnectionDlg(true); // autoconnect if appropriate
+ } else {
+ startInternalCore();
+ }
}
MainWin::~MainWin() {
Client::instance(), SLOT(disconnectFromCore())));
coll->addAction("CoreInfo", new Action(SmallIcon("help-about"), tr("Core &Info..."), coll,
this, SLOT(showCoreInfoDlg())));
- coll->addAction("EditNetworks", new Action(SmallIcon("configure"), tr("Edit &Networks..."), coll,
- this, SLOT(on_actionEditNetworks_triggered())));
+ 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")));
// View
- coll->addAction("ManageBufferViews", new Action(SmallIcon("view-tree"), tr("&Manage Buffer Views..."), coll,
- this, SLOT(on_actionManageViews_triggered())));
- Action *lockAct = coll->addAction("LockDockPositions", new Action(tr("&Lock Dock Positions"), coll));
+ coll->addAction("ConfigureBufferViews", new Action(tr("&Configure Buffer Views..."), coll,
+ this, SLOT(on_actionConfigureViews_triggered())));
+ QAction *lockAct = coll->addAction("LockDockPositions", new Action(tr("&Lock Dock Positions"), coll));
lockAct->setCheckable(true);
connect(lockAct, SIGNAL(toggled(bool)), SLOT(on_actionLockDockPositions_toggled(bool)));
this, SLOT(showSettingsDlg()), tr("F7")));
// Help
- coll->addAction("AboutQuassel", new Action(SmallIcon("quassel"), tr("&About Quassel..."), coll,
+ coll->addAction("AboutQuassel", new Action(SmallIcon("quassel"), tr("&About Quassel"), coll,
this, SLOT(showAboutDlg())));
- coll->addAction("AboutQt", new Action(QIcon(":/pics/qt-logo.png"), tr("About &Qt..."), coll,
+ coll->addAction("AboutQt", new Action(QIcon(":/pics/qt-logo.png"), tr("About &Qt"), coll,
qApp, SLOT(aboutQt())));
coll->addAction("DebugNetworkModel", new Action(SmallIcon("tools-report-bug"), tr("Debug &NetworkModel"), coll,
this, SLOT(on_actionDebugNetworkModel_triggered())));
ActionCollection *coll = QtUi::actionCollection("General");
_fileMenu = menuBar()->addMenu(tr("&File"));
- _fileMenu->addAction(coll->action("ConnectCore"));
- _fileMenu->addAction(coll->action("DisconnectCore"));
- _fileMenu->addAction(coll->action("CoreInfo"));
- _fileMenu->addSeparator();
+
+ static const QStringList coreActions = QStringList()
+ << "ConnectCore" << "DisconnectCore" << "CoreInfo";
+
+ QAction *coreAction;
+ foreach(QString actionName, coreActions) {
+ coreAction = coll->action(actionName);
+ _fileMenu->addAction(coreAction);
+ flagRemoteCoreOnly(coreAction);
+ }
+ flagRemoteCoreOnly(_fileMenu->addSeparator());
+
_networksMenu = _fileMenu->addMenu(tr("&Networks"));
- _networksMenu->addAction(coll->action("EditNetworks"));
+ _networksMenu->addAction(coll->action("ConfigureNetworks"));
_networksMenu->addSeparator();
_fileMenu->addSeparator();
_fileMenu->addAction(coll->action("Quit"));
_viewMenu = menuBar()->addMenu(tr("&View"));
_bufferViewsMenu = _viewMenu->addMenu(tr("&Buffer Views"));
- _bufferViewsMenu->addAction(coll->action("ManageBufferViews"));
+ _bufferViewsMenu->addAction(coll->action("ConfigureBufferViews"));
_viewMenu->addSeparator();
_viewMenu->addAction(coll->action("ToggleSearchBar"));
_viewMenu->addAction(coll->action("ToggleStatusBar"));
_viewMenu->addAction(coll->action("LockDockPositions"));
_settingsMenu = menuBar()->addMenu(tr("&Settings"));
+#ifdef HAVE_KDE
+ _settingsMenu->addAction(KStandardAction::keyBindings(this, SLOT(showShortcutsDlg()), this));
+ _settingsMenu->addAction(KStandardAction::configureNotifications(this, SLOT(showNotificationsDlg()), this));
+#endif
_settingsMenu->addAction(coll->action("ConfigureQuassel"));
_helpMenu = menuBar()->addMenu(tr("&Help"));
_helpMenu->addAction(coll->action("AboutQuassel"));
+#ifndef HAVE_KDE
_helpMenu->addAction(coll->action("AboutQt"));
+#else
+ _helpMenu->addAction(KStandardAction::aboutKDE(_kHelpMenu, SLOT(aboutKDE()), this));
+#endif
_helpMenu->addSeparator();
_helpDebugMenu = _helpMenu->addMenu(SmallIcon("tools-report-bug"), tr("Debug"));
_helpDebugMenu->addAction(coll->action("DebugNetworkModel"));
setCentralWidget(_bufferWidget);
}
-void MainWin::setupViews() {
- addBufferView();
-}
-
void MainWin::addBufferView(int bufferViewConfigId) {
addBufferView(Client::bufferViewManager()->bufferViewConfig(bufferViewConfigId));
}
void MainWin::addBufferView(BufferViewConfig *config) {
- BufferViewDock *dock;
- if(config)
- dock = new BufferViewDock(config, this);
- else
- dock = new BufferViewDock(this);
+ if(!config)
+ return;
+
+ BufferViewDock *dock = new BufferViewDock(config, this);
//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->show();
Client::bufferModel()->synchronizeView(view);
return 0;
}
-void MainWin::on_actionEditNetworks_triggered() {
+void MainWin::showNotificationsDlg() {
+ SettingsPageDlg dlg(new NotificationsSettingsPage(this), this);
+ dlg.exec();
+}
+
+void MainWin::on_actionConfigureNetworks_triggered() {
SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
dlg.exec();
}
-void MainWin::on_actionManageViews_triggered() {
+void MainWin::on_actionConfigureViews_triggered() {
SettingsPageDlg dlg(new BufferViewSettingsPage(this), this);
dlg.exec();
}
VerticalDock *dock = new VerticalDock(tr("Inputline"), this);
dock->setObjectName("InputDock");
- InputWidget *inputWidget = new InputWidget(dock);
- dock->setWidget(inputWidget);
+ _inputWidget = new InputWidget(dock);
+ dock->setWidget(_inputWidget);
addDockWidget(Qt::BottomDockWidgetArea, dock);
_viewMenu->addAction(dock->toggleViewAction());
dock->toggleViewAction()->setText(tr("Show Input Line"));
- inputWidget->setModel(Client::bufferModel());
- inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
+ _inputWidget->setModel(Client::bufferModel());
+ _inputWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
- _bufferWidget->setFocusProxy(inputWidget);
+ _bufferWidget->setFocusProxy(_inputWidget);
- inputWidget->inputLine()->installEventFilter(_bufferWidget);
+ _inputWidget->inputLine()->installEventFilter(_bufferWidget);
}
void MainWin::setupTopicWidget() {
connect(Client::messageProcessor(), SIGNAL(progressUpdated(int, int)), msgProcessorStatusWidget, SLOT(setProgress(int, int)));
// Core Lag:
- updateLagIndicator(0);
+ updateLagIndicator();
statusBar()->addPermanentWidget(coreLagLabel);
+ coreLagLabel->hide();
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);
+ sslLabel->hide();
_viewMenu->addSeparator();
QAction *showStatusbar = QtUi::actionCollection("General")->action("ToggleStatusBar");
ActionCollection *coll = QtUi::actionCollection("General");
systrayMenu = new QMenu(this);
- systrayMenu->addAction(coll->action("AboutQuassel"));
- systrayMenu->addSeparator();
systrayMenu->addAction(coll->action("ConnectCore"));
systrayMenu->addAction(coll->action("DisconnectCore"));
+ systrayMenu->addAction(coll->action("CoreInfo"));
systrayMenu->addSeparator();
systrayMenu->addAction(coll->action("Quit"));
}
#ifndef Q_WS_MAC
- connect(systemTrayIcon(), SIGNAL(activated( QSystemTrayIcon::ActivationReason )),
- this, SLOT(systrayActivated( QSystemTrayIcon::ActivationReason )));
+ connect(systemTrayIcon(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(systrayActivated(QSystemTrayIcon::ActivationReason)));
#endif
-
}
void MainWin::changeEvent(QEvent *event) {
if(windowState() & Qt::WindowMinimized) {
QtUiSettings s;
if(s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnMinimize").toBool()) {
- toggleVisibility();
- event->ignore();
+ hideToTray();
+ event->accept();
}
}
}
void MainWin::setConnectedState() {
ActionCollection *coll = QtUi::actionCollection("General");
- //ui.menuCore->setEnabled(true);
+
coll->action("ConnectCore")->setEnabled(false);
coll->action("DisconnectCore")->setEnabled(true);
coll->action("CoreInfo")->setEnabled(true);
+
+ foreach(QAction *action, _fileMenu->actions()) {
+ if(isRemoteCoreOnly(action))
+ action->setVisible(!Client::internalCore());
+ }
+
// _viewMenu->setEnabled(true);
- statusBar()->showMessage(tr("Connected to core."));
- if(sslLabel->width() == 0)
+ if(!Client::internalCore())
+ statusBar()->showMessage(tr("Connected to core."));
+
+ if(Client::signalProxy()->isSecure()) {
+ sslLabel->setPixmap(SmallIcon("security-high"));
+ } else {
sslLabel->setPixmap(SmallIcon("security-low"));
+ }
+
+ sslLabel->setVisible(!Client::internalCore());
+ coreLagLabel->setVisible(!Client::internalCore());
updateIcon();
}
}
void MainWin::updateLagIndicator(int lag) {
- coreLagLabel->setText(QString(tr("Core Lag: %1 msec")).arg(lag));
-}
-
-
-void MainWin::securedConnection() {
- // todo: make status bar entry
- sslLabel->setPixmap(SmallIcon("security-high"));
+ QString text = tr("Core Lag: %1");
+ if(lag == -1)
+ text = text.arg('-');
+ else
+ text = text.arg("%1 msec").arg(lag);
+ coreLagLabel->setText(text);
}
void MainWin::disconnectedFromCore() {
//_viewMenu->setEnabled(false);
statusBar()->showMessage(tr("Not connected to core."));
sslLabel->setPixmap(QPixmap());
+ sslLabel->hide();
+ updateLagIndicator();
+ coreLagLabel->hide();
updateIcon();
}
+void MainWin::startInternalCore() {
+ ClientSyncer *syncer = new ClientSyncer();
+ Client::registerClientSyncer(syncer);
+ connect(syncer, SIGNAL(syncFinished()), syncer, SLOT(deleteLater()), Qt::QueuedConnection);
+ syncer->useInternalCore();
+}
+
void MainWin::showCoreConnectionDlg(bool autoConnect) {
CoreConnectDlg(autoConnect, this).exec();
}
AboutDlg(this).exec();
}
+#ifdef HAVE_KDE
+void MainWin::showShortcutsDlg() {
+ KShortcutsDialog::configure(QtUi::actionCollection("General"), KShortcutsEditor::LetterShortcutsDisallowed);
+}
+#endif
+
void MainWin::closeEvent(QCloseEvent *event) {
QtUiSettings s;
- if(s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnClose").toBool()) {
- toggleVisibility();
+ QtUiApplication* app = qobject_cast<QtUiApplication*> qApp;
+ Q_ASSERT(app);
+ if(!app->aboutToQuit() && s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnClose").toBool()) {
+ hideToTray();
event->ignore();
} else {
event->accept();
}
}
-void MainWin::systrayActivated( QSystemTrayIcon::ActivationReason activationReason) {
+void MainWin::systrayActivated(QSystemTrayIcon::ActivationReason activationReason) {
if(activationReason == QSystemTrayIcon::Trigger) {
- toggleVisibility();
+ toggleMinimizedToTray();
}
}
-void MainWin::toggleVisibility() {
- if(isHidden() /*|| !isActiveWindow()*/) {
- show();
- if(isMinimized()) {
- if(isMaximized())
- showMaximized();
- else
- showNormal();
- }
+void MainWin::hideToTray() {
+ if(!systemTrayIcon()->isSystemTrayAvailable()) {
+ qWarning() << Q_FUNC_INFO << "was called with no SystemTray available!";
+ return;
+ }
- raise();
- activateWindow();
- // setFocus(); //Qt::ActiveWindowFocusReason
+ clearFocus();
+ hide();
+ systemTrayIcon()->show();
+}
+void MainWin::toggleMinimizedToTray() {
+ if(windowState() & Qt::WindowMinimized) {
+ // restore
+ setWindowState((windowState() & ~Qt::WindowMinimized) | Qt::WindowActive);
+ show();
+ raise();
} else {
- if(systemTrayIcon()->isSystemTrayAvailable ()) {
- clearFocus();
- hide();
- if(!systemTrayIcon()->isVisible()) {
- systemTrayIcon()->show();
- }
- } else {
- lower();
- }
+ setWindowState((windowState() & ~Qt::WindowActive) | Qt::WindowMinimized);
+ hideToTray();
}
}
void MainWin::showStatusBarMessage(const QString &message) {
statusBar()->showMessage(message, 10000);
}
+