#include "mainwin.h"
+#include "aboutdlg.h"
#include "chatwidget.h"
#include "bufferview.h"
#include "chatline-old.h"
#include "networkmodel.h"
#include "buffermodel.h"
#include "nicklistwidget.h"
-#include "serverlist.h"
#include "settingsdlg.h"
+#include "settingspagedlg.h"
#include "signalproxy.h"
#include "topicwidget.h"
#include "inputwidget.h"
#include "verticaldock.h"
#include "uisettings.h"
+#include "qtuisettings.h"
+#include "jumpkeyhandler.h"
#include "selectionmodelsynchronizer.h"
#include "mappedselectionmodel.h"
+#include "settingspages/colorsettingspage.h"
#include "settingspages/fontssettingspage.h"
+#include "settingspages/generalsettingspage.h"
#include "settingspages/identitiessettingspage.h"
#include "settingspages/networkssettingspage.h"
+
#include "debugconsole.h"
-MainWin::MainWin(QtUi *_gui, QWidget *parent) : QMainWindow(parent), gui(_gui) {
+MainWin::MainWin(QtUi *_gui, QWidget *parent)
+ : QMainWindow(parent),
+ gui(_gui),
+ settingsDlg(new SettingsDlg(this)),
+ debugConsole(new DebugConsole(this))
+{
ui.setupUi(this);
setWindowTitle("Quassel IRC");
- //setWindowTitle(QString::fromUtf8("Κυασελ Εγαρζη"));
setWindowIcon(QIcon(":icons/quassel-icon.png"));
setWindowIconText("Quassel IRC");
statusBar()->showMessage(tr("Waiting for core..."));
- serverListDlg = new ServerListDlg(this);
- settingsDlg = new SettingsDlg(this);
- debugConsole = new DebugConsole(this);
+
+ installEventFilter(new JumpKeyHandler(this));
}
void MainWin::init() {
- UiSettings s;
+ QtUiSettings s;
resize(s.value("MainWinSize").toSize());
Client::signalProxy()->attachSignal(this, SIGNAL(requestBacklog(BufferInfo, QVariant, QVariant)));
- Client::signalProxy()->attachSignal(this, SIGNAL(disconnectFromNetwork(NetworkId)));
- ui.bufferWidget->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();
- //QVariantMap connInfo;
- //connInfo["User"] = "Default";
- //connInfo["Password"] = "password";
- //connectToCore(connInfo);
-
statusBar()->showMessage(tr("Not connected to core."));
- systray = new QSystemTrayIcon(this);
- systray->setIcon(QIcon(":/icons/quassel-icon.png"));
-
- QString toolTip("left click to minimize the quassel client to tray");
- systray->setToolTip(toolTip);
-
- QMenu *systrayMenu = new QMenu();
- systrayMenu->addAction(ui.actionAboutQuassel);
- systrayMenu->addSeparator();
- systrayMenu->addAction(ui.actionConnectCore);
- systrayMenu->addAction(ui.actionDisconnectCore);
- systrayMenu->addSeparator();
- systrayMenu->addAction(ui.actionQuit);
-
- systray->setContextMenu(systrayMenu);
-
- systray->show();
- connect(systray, SIGNAL(activated( QSystemTrayIcon::ActivationReason )),
- this, SLOT(systrayActivated( QSystemTrayIcon::ActivationReason )));
-
// DOCK OPTIONS
setDockNestingEnabled(true);
setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea);
setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea);
-
setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea);
setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea);
- // setup the docks etc...
+ // setup stuff...
setupMenus();
setupViews();
setupNickWidget();
setupChatMonitor();
setupInputWidget();
setupTopicWidget();
+ setupSystray();
+
setupSettingsDlg();
disconnectedFromCore(); // Disable menus and stuff
showCoreConnectionDlg(true); // autoconnect if appropriate
- //ui.actionConnectCore->activate(QAction::Trigger);
- if(serverListDlg->showOnStartup()) {
- showServerList();
- }
-
// attach the BufferWidget to the PropertyMapper
ui.bufferWidget->setModel(Client::bufferModel());
ui.bufferWidget->setSelectionModel(Client::bufferModel()->standardSelectionModel());
-
#ifdef SPUTDEV
- showSettingsDlg();
+ //showSettingsDlg();
+ //showAboutDlg();
+ showNetworkDlg();
+ exit(1);
#endif
}
MainWin::~MainWin() {
- //typedef QHash<QString, Buffer*> BufHash;
- //foreach(BufHash h, buffers.values()) {
- // foreach(Buffer *b, h.values()) {
- // delete b;
- // }
- //}
- //foreach(Buffer *buf, buffers.values()) delete buf;
+ QtUiSettings s;
+ s.setValue("MainWinSize", size());
+ s.setValue("MainWinPos", pos());
+ s.setValue("MainWinState", saveState());
}
-/* This is implemented in settingspages.cpp */
-/*
-void MainWin::setupSettingsDlg() {
-
-}
-*/
-
void MainWin::setupMenus() {
connect(ui.actionConnectCore, SIGNAL(triggered()), this, SLOT(showCoreConnectionDlg()));
connect(ui.actionDisconnectCore, SIGNAL(triggered()), Client::instance(), SLOT(disconnectFromCore()));
- connect(ui.actionNetworkList, SIGNAL(triggered()), this, SLOT(showServerList()));
- connect(ui.actionEditIdentities, SIGNAL(triggered()), serverListDlg, SLOT(editIdentities()));
+ 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.actionDisconnectNet, SIGNAL(triggered()), this, SLOT(disconnectFromNet()));
+ 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()));
}
void MainWin::setupViews() {
}
void MainWin::setupSettingsDlg() {
-
+ //Category: Appearance
+ settingsDlg->registerSettingsPage(new ColorSettingsPage(settingsDlg));
settingsDlg->registerSettingsPage(new FontsSettingsPage(settingsDlg));
+ //Category: Behaviour
+ settingsDlg->registerSettingsPage(new GeneralSettingsPage(settingsDlg));
+ //Category: General
settingsDlg->registerSettingsPage(new IdentitiesSettingsPage(settingsDlg));
-#ifdef SPUTDEV
settingsDlg->registerSettingsPage(new NetworksSettingsPage(settingsDlg));
+
+
+#ifdef SPUTDEV
connect(settingsDlg, SIGNAL(finished(int)), QApplication::instance(), SLOT(quit())); // FIXME
#endif
}
chatWidget->show();
dock->setWidget(chatWidget);
dock->show();
-
+
Buffer *buf = Client::monitorBuffer();
if(!buf)
return;
-
+
chatWidget->init(BufferId(0));
QList<ChatLine *> lines;
QList<AbstractUiMsg *> msgs = buf->contents();
ui.menuViews->addAction(dock->toggleViewAction());
}
+void MainWin::setupSystray() {
+ systray = new QSystemTrayIcon(this);
+ systray->setIcon(QIcon(":/icons/quassel-icon.png"));
+
+ QString toolTip("Left click to minimize the Quassel Client to tray");
+ systray->setToolTip(toolTip);
+
+ systrayMenu = new QMenu(this);
+ systrayMenu->addAction(ui.actionAboutQuassel);
+ systrayMenu->addSeparator();
+ systrayMenu->addAction(ui.actionConnectCore);
+ systrayMenu->addAction(ui.actionDisconnectCore);
+ systrayMenu->addSeparator();
+ systrayMenu->addAction(ui.actionQuit);
+
+ systray->setContextMenu(systrayMenu);
+
+ QtUiSettings s;
+ if(s.value("UseSystemTrayIcon").toBool()) {
+ systray->show();
+ }
+
+ #ifndef Q_WS_MAC
+ connect(systray, SIGNAL(activated( QSystemTrayIcon::ActivationReason )),
+ this, SLOT(systrayActivated( QSystemTrayIcon::ActivationReason )));
+ #endif
+
+}
+
+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()) {
+ toggleVisibility();
+ }
+ }
+ }
+}
+
void MainWin::connectedToCore() {
foreach(BufferInfo id, Client::allBufferInfos()) {
emit requestBacklog(id, 1000, -1);
ui.menuCore->setEnabled(true);
ui.actionConnectCore->setEnabled(false);
ui.actionDisconnectCore->setEnabled(true);
- ui.actionNetworkList->setEnabled(true);
+ //ui.actionNetworkList->setEnabled(true);
ui.bufferWidget->show();
statusBar()->showMessage(tr("Connected to core."));
}
ui.menuViews->setEnabled(false);
ui.menuCore->setEnabled(false);
ui.actionDisconnectCore->setEnabled(false);
- ui.actionNetworkList->setEnabled(false);
+ //ui.actionNetworkList->setEnabled(false);
ui.bufferWidget->hide();
ui.actionConnectCore->setEnabled(true);
nickListWidget->reset();
coreConnectDlg = new CoreConnectDlg(this, autoConnect);
connect(coreConnectDlg, SIGNAL(finished(int)), this, SLOT(coreConnectionDlgFinished(int)));
coreConnectDlg->setModal(true);
- //if(!autoConnect || !coreConnectDlg->willDoInternalAutoConnect())
- coreConnectDlg->show(); // avoid flicker and show dlg only if we do remote connect, which needs a progress bar
- //if(autoConnect) coreConnectDlg->doAutoConnect();
+ coreConnectDlg->show();
}
void MainWin::coreConnectionDlgFinished(int /*code*/) {
//exit(1);
}
-
-void MainWin::showServerList() {
-// if(!serverListDlg) {
-// serverListDlg = new ServerListDlg(this);
-// }
- serverListDlg->show();
- serverListDlg->raise();
-}
-
void MainWin::showSettingsDlg() {
settingsDlg->show();
}
debugConsole->show();
}
-void MainWin::closeEvent(QCloseEvent *event)
-{
- //if (userReallyWantsToQuit()) {
- UiSettings s;
- s.setValue("MainWinSize", size());
- s.setValue("MainWinPos", pos());
- s.setValue("MainWinState", saveState());
+void MainWin::showAboutDlg() {
+ AboutDlg dlg(this);
+ dlg.exec();
+}
+
+void MainWin::closeEvent(QCloseEvent *event) {
+ QtUiSettings s;
+ if(s.value("UseSystemTrayIcon").toBool() && s.value("MinimizeOnClose").toBool()) {
+ toggleVisibility();
+ event->ignore();
+ } else {
event->accept();
- //} else {
- //event->ignore();
- //}
+ }
}
void MainWin::systrayActivated( QSystemTrayIcon::ActivationReason activationReason) {
if (activationReason == QSystemTrayIcon::Trigger) {
- if (isHidden())
- show();
- else
+ toggleVisibility();
+ }
+}
+
+void MainWin::toggleVisibility() {
+ if(isHidden() || !isActiveWindow()) {
+ show();
+ if(isMinimized())
+ if (isMaximized())
+ showMaximized();
+ else
+ showNormal();
+
+ raise();
+ activateWindow();
+ } else {
+ if(systray->isSystemTrayAvailable ()) {
hide();
+ if(!systray->isVisible()) {
+ systray->show();
+ }
+ } else {
+ lower();
+ }
+ }
+}
+
+void MainWin::showNetworkDlg() {
+ SettingsPageDlg dlg(new NetworksSettingsPage(this), this);
+ dlg.exec();
+}
+
+void MainWin::clientNetworkCreated(NetworkId id) {
+ const Network *net = Client::network(id);
+ QAction *act = new QAction(net->networkName(), this);
+ act->setData(QVariant::fromValue<NetworkId>(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;
+ 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);
+}
+
+void MainWin::clientNetworkUpdated() {
+ const Network *net = qobject_cast<const Network *>(sender());
+ if(!net) return;
+ foreach(QAction *a, networkActions) {
+ if(a->data().value<NetworkId>() == 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;
+ }
+ }
+}
+
+void MainWin::clientNetworkRemoved(NetworkId id) {
+ QList<QAction *>::iterator actionIter = networkActions.begin();;
+ QAction *action;
+ while(actionIter != networkActions.end()) {
+ action = *actionIter;
+ if(action->data().value<NetworkId>() == id) {
+ action->deleteLater();
+ actionIter = networkActions.erase(actionIter);
+ } else
+ actionIter++;
}
}
-void MainWin::disconnectFromNet() {
- int i = QInputDialog::getInteger(this, tr("Disconnect from Network"), tr("Enter network id:"));
- emit disconnectFromNetwork(NetworkId(i));
+void MainWin::connectOrDisconnectFromNet() {
+ QAction *act = qobject_cast<QAction *>(sender());
+ if(!act) return;
+ const Network *net = Client::network(act->data().value<NetworkId>());
+ if(!net) return;
+ if(net->connectionState() == Network::Disconnected) net->requestConnect();
+ else net->requestDisconnect();
}