diff options
Diffstat (limited to 'src/kvirc/ui/kvi_menubar.cpp')
-rw-r--r-- | src/kvirc/ui/kvi_menubar.cpp | 415 |
1 files changed, 415 insertions, 0 deletions
diff --git a/src/kvirc/ui/kvi_menubar.cpp b/src/kvirc/ui/kvi_menubar.cpp new file mode 100644 index 0000000..a382f73 --- /dev/null +++ b/src/kvirc/ui/kvi_menubar.cpp @@ -0,0 +1,415 @@ +//============================================================================= +// +// File : kvi_menubar.cpp +// Creation date : Wen Jun 21 2000 13:12:11 by Szymon Stefanek +// +// This file is part of the KVirc irc client distribution +// Copyright (C) 2000-2005 Szymon Stefanek (pragma at kvirc dot net) +// +// This program is FREE software. You can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your opinion) any later version. +// +// This program is distributed in the HOPE that it will be USEFUL, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +// See the GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, write to the Free Software Foundation, +// Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +// +//============================================================================= + +#define __KVIRC__ +#include "kvi_menubar.h" +#include "kvi_app.h" +#include "kvi_locale.h" +#include "kvi_frame.h" +#include "kvi_mdimanager.h" +#include "kvi_iconmanager.h" +#include "kvi_internalcmd.h" +#include "kvi_settings.h" +#include "kvi_ircurl.h" +#include "kvi_console.h" +#include "kvi_kvs_popupmenu.h" +#include "kvi_malloc.h" +#include "kvi_moduleextension.h" +#include "kvi_actionmanager.h" +#include "kvi_coreactionnames.h" +#include "kvi_kvs_script.h" + +#include "kvi_tal_popupmenu.h" + +KviMenuBar::KviMenuBar(KviFrame * par,const char * name) + : KviTalMenuBar(par,name) +{ + m_pFrm = par; + + m_iNumDefaultItems = 0; + m_pDefaultItemId = 0; + + KviTalPopupMenu * pop = new KviTalPopupMenu(this,"KVIrc"); + connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupMainPopup())); +#ifndef Q_OS_MACX + addDefaultItem("&KVIrc",pop); +#else + // Qt/Mac creates already a "KVirc" menu item on its own, and we don't like double entries ;-) + addDefaultItem("&IRC",pop); +#endif //Q_OS_MACX + m_pRecentServersPopup = new KviTalPopupMenu(this,"recentservers"); + connect(m_pRecentServersPopup,SIGNAL(aboutToShow()),this,SLOT(setupRecentServersPopup())); + connect(m_pRecentServersPopup,SIGNAL(activated(int)),this,SLOT(newConnectionToServer(int))); + + m_pScriptItemList = 0; + + pop = new KviTalPopupMenu(this,"scripting"); + connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupScriptingPopup())); + addDefaultItem(__tr2qs("Scri&pting"),pop); + + pop = new KviTalPopupMenu(this,"tools"); + connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupToolsPopup())); + connect(pop,SIGNAL(activated(int)),this,SLOT(toolsPopupSelected(int))); + addDefaultItem(__tr2qs("&Tools"),pop); + + m_pToolbarsPopup = new KviTalPopupMenu(this,"toolbars"); + connect(m_pToolbarsPopup,SIGNAL(aboutToShow()),this,SLOT(setupToolbarsPopup())); + + pop = new KviTalPopupMenu(this,"settings"); + connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupSettingsPopup())); + addDefaultItem(__tr2qs("&Settings"),pop); + + addDefaultItem(__tr2qs("&Window"),par->mdiManager()->windowPopup()); + + pop = new KviTalPopupMenu(this,"help"); + connect(pop,SIGNAL(aboutToShow()),this,SLOT(setupHelpPopup())); + addDefaultItem(__tr2qs("&Help"),pop); +} + +KviMenuBar::~KviMenuBar() +{ + if(m_pScriptItemList)delete m_pScriptItemList; + if(m_pDefaultItemId)kvi_free(m_pDefaultItemId); +} + +void KviMenuBar::showEvent(QShowEvent *e) +{ +#ifdef COMPILE_USE_QT4 + debug("menubar show"); + // force a re-layout of the menubar in Qt4 (see the note in enterSDIMode()) + // by resetting the corner widget + m_pFrm->mdiManager()->relayoutMenuButtons(); +#endif +} + +void KviMenuBar::addDefaultItem(const QString &text,KviTalPopupMenu * pop) +{ + m_iNumDefaultItems++; + m_pDefaultItemId = (int *)kvi_realloc((void *)m_pDefaultItemId,sizeof(int) * m_iNumDefaultItems); + m_pDefaultItemId[m_iNumDefaultItems - 1] = insertItem(text,pop); +} + +void KviMenuBar::setupHelpPopup() +{ + KviTalPopupMenu * help = (KviTalPopupMenu *)sender(); + help->clear(); + + // FIXME: Convert these to actions! + int id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_HELP)),__tr2qs("&Help Browser (Panel)"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_HELP_NEWSTATICWINDOW); + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MDIHELP)),__tr2qs("Help Browser (&Window)"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_HELP_NEWMDIWINDOW); + help->insertSeparator(); + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_IDEA)),__tr2qs("&Tip of the Day"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_TIP_OPEN); + help->insertSeparator(); + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_KVIRC)),__tr2qs("About &KVIrc"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_ABOUT_ABOUTKVIRC); + help->insertSeparator(); + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_HOMEPAGE)),__tr2qs("KVIrc Home&page"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_KVIRC_HOMEPAGE); + if(kvi_strEqualCIN(KviLocale::localeName(),"ru",2)) + { + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_HOMEPAGE)),__tr2qs("KVIrc Russian Home&page"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_KVIRC_HOMEPAGE_RU); + } + if(kvi_strEqualCIN(KviLocale::localeName(),"fr",2)) + { + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_HOMEPAGE)),__tr2qs("KVIrc French Home&page"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_KVIRC_HOMEPAGE_FR); + } + help->insertSeparator(); + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_MESSAGE)),__tr2qs("Subscribe to the Mailing List"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_MAILINGLIST); + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_BOMB)),__tr2qs("Report a Bug / Propose Improvements"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_BUGTRACK); + help->insertSeparator(); + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc International Channel on Freenode"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_ON_FREENODE); + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc International Channel on IRCNet"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_ON_IRCNET); + if(kvi_strEqualCIN(KviLocale::localeName(),"it",2)) + { + // join #kvirc.net on azzurra + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc Italian Channel on AzzurraNet"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_IT_ON_AZZURRA); + } + if(kvi_strEqualCIN(KviLocale::localeName(),"fr",2)) + { + // join #kvirc-fr on freenode + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc French Channel on Freenode"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_FR_ON_FREENODE); + // join #kvirc on europnet + id = help->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_CHANNEL)),__tr2qs("Join KVIrc French Channel on EuropNet"),m_pFrm,SLOT(executeInternalCommand(int))); + help->setItemParameter(id,KVI_INTERNALCOMMAND_OPENURL_KVIRC_FR_ON_EUROPNET); + } + // add your localized #kvirc channels here... +} + +void KviMenuBar::setupSettingsPopup() +{ + // FIXME: Move everything to actions! + + KviTalPopupMenu * opt = (KviTalPopupMenu *)sender(); + opt->clear(); + + opt->insertItem(__tr2qs("Toolbars"),m_pToolbarsPopup); + + int id = opt->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_STATUSBAR)),__tr2qs("Show StatusBar"),m_pFrm,SLOT(toggleStatusBar())); + opt->setItemChecked(id,m_pFrm->mainStatusBar()); + + + opt->insertSeparator(); + // FIXME: #warning "Toggle these items on the fly ?" + ACTION_POPUP_ITEM(KVI_COREACTION_GENERALOPTIONS,opt) + ACTION_POPUP_ITEM(KVI_COREACTION_THEMEOPTIONS,opt) + ACTION_POPUP_ITEM(KVI_COREACTION_MANAGETHEMES,opt) + ACTION_POPUP_ITEM(KVI_COREACTION_MANAGEADDONS,opt) + ACTION_POPUP_ITEM(KVI_COREACTION_SERVEROPTIONS,opt) + ACTION_POPUP_ITEM(KVI_COREACTION_TOOLBAREDITOR,opt) + ACTION_POPUP_ITEM(KVI_COREACTION_EDITREGUSERS,opt) + + opt->insertSeparator(); + opt->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_FLOPPY)),__tr2qs("&Save Configuration"),g_pApp,SLOT(saveConfiguration())); +} + +void KviMenuBar::setupScriptingPopup() +{ + KviTalPopupMenu * script = (KviTalPopupMenu *)sender(); + script->clear(); + + ACTION_POPUP_ITEM(KVI_COREACTION_ACTIONEDITOR,script) + ACTION_POPUP_ITEM(KVI_COREACTION_ALIASEDITOR,script) + ACTION_POPUP_ITEM(KVI_COREACTION_EVENTEDITOR,script) + ACTION_POPUP_ITEM(KVI_COREACTION_POPUPEDITOR,script) + ACTION_POPUP_ITEM(KVI_COREACTION_RAWEDITOR,script) + script->insertSeparator(); + ACTION_POPUP_ITEM(KVI_COREACTION_CODETESTER,script) + script->insertSeparator(); + ACTION_POPUP_ITEM(KVI_COREACTION_EXECUTEKVS,script) + + script->insertSeparator(); + script->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TEXTEXCLAMATIVE)),__tr2qs("Restore &Default Script"),g_pApp,SLOT(restoreDefaultScript())); +} + +void KviMenuBar::setupMainPopup() +{ + KviTalPopupMenu * main = (KviTalPopupMenu *)sender(); + main->clear(); + + ACTION_POPUP_ITEM(KVI_COREACTION_NEWIRCCONTEXT,main) + if(m_pFrm->activeContext()) + if(m_pFrm->activeContext()->state()==KviIrcContext::Connected) + { + int id = main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_QUIT)),__tr2qs("Disconnect"),m_pFrm,SLOT(executeInternalCommand(int))); + main->setItemParameter(id,KVI_INTERNALCOMMAND_QUIT); + } + main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_WORLD)),__tr2qs("New &Connection To"),m_pRecentServersPopup); + + main->insertSeparator(); + + if(m_pFrm->dockExtension()) + { + int id = main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DOCKWIDGET)),__tr2qs("Hide &Dock Icon"),m_pFrm,SLOT(executeInternalCommand(int))); + main->setItemParameter(id,KVI_INTERNALCOMMAND_DOCKWIDGET_HIDE); + } else { + int id = main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_DOCKWIDGET)),__tr2qs("Show &Dock Icon"),m_pFrm,SLOT(executeInternalCommand(int))); + main->setItemParameter(id,KVI_INTERNALCOMMAND_DOCKWIDGET_SHOW); + } + +// Qt/Mac creates a Quit item on its own +#ifndef Q_OS_MACX + main->insertSeparator(); + + main->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_QUITAPP)),__tr2qs("&Quit"),g_pApp,SLOT(quit())); +#endif //Q_OS_MACX +} + + +void KviMenuBar::setupRecentServersPopup() +{ + KviTalPopupMenu * m = (KviTalPopupMenu *)sender(); + g_pApp->fillRecentServersPopup(m); + m->insertSeparator(); + m->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_SERVER)),__tr2qs("&Other...")); +} + +void KviMenuBar::newConnectionToServer(int id) +{ + QString text = m_pRecentServersPopup->text(id); + if(!text.isEmpty()) + { + // the gentoo qt 3.3.4-r2 is broken + // since it adds random & characters to the popup texts... + if(text == __tr2qs("&Other...")) + { + KviKvsScript::run("options.edit KviServerOptionsWidget",m_pFrm->firstConsole()); + } else { + text.replace(QString("&"),QString("")); + KviStr szCommand; + if(KviIrcUrl::parse(text.utf8().data(),szCommand,KVI_IRCURL_CONTEXT_NEW)) + KviKvsScript::run(szCommand.ptr(),m_pFrm->firstConsole()); + } + } +} + +void KviMenuBar::setupToolsPopup() +{ + KviTalPopupMenu * m = (KviTalPopupMenu *)sender(); + if(!m)return; + + m->clear(); + + KviModuleExtensionDescriptorList * l = g_pModuleExtensionManager->getExtensionList("tool"); + if(l) + { + for(KviModuleExtensionDescriptor * d = l->first();d;d = l->next()) + { + int id; + if(d->icon())id = m->insertItem(*(d->icon()),d->visibleName()); + else id = m->insertItem(d->visibleName()); + //m->setItemChecked(id,(m_pFrm->moduleExtensionToolBar(d->id()))); + m->setItemParameter(id,d->id()); + } + } + m->insertSeparator(); + ACTION_POPUP_ITEM(KVI_COREACTION_SOCKETSPY,m) + ACTION_POPUP_ITEM(KVI_COREACTION_NETWORKLINKS,m) + ACTION_POPUP_ITEM(KVI_COREACTION_CHANNELLIST,m) + m->insertSeparator(); + + ACTION_POPUP_ITEM(KVI_COREACTION_SCREENSHOT,m) + + // moved the old tools here + m->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_ICONMANAGER)),__tr2qs("Show &Icon Table"),g_pIconManager,SLOT(showIconWidget())); +#ifdef COMPILE_KDE_SUPPORT + int id; + id = m->insertItem(*(g_pIconManager->getSmallIcon(KVI_SMALLICON_TERMINAL)),__tr2qs("Open &Terminal"),m_pFrm,SLOT(executeInternalCommand(int))); + m->setItemParameter(id,KVI_INTERNALCOMMAND_TERM_OPEN); +#endif + + + KviPointerList<KviAction> list; + KviActionManager::instance()->listActionsByCategory("tools",&list); + if(!list.isEmpty()) + { + m->insertSeparator(); + for(KviAction * ac = list.first();ac;ac = list.next()) + ac->addToPopupMenu(m); + } +} + +void KviMenuBar::toolsPopupSelected(int id) +{ + KviTalPopupMenu * m = (KviTalPopupMenu *)sender(); + if(!m)return; + int idext = m->itemParameter(id); + g_pModuleExtensionManager->allocateExtension("tool",idext,m_pFrm->firstConsole()); +} + + +void KviMenuBar::setupToolbarsPopup() +{ + m_pFrm->fillToolBarsPopup(m_pToolbarsPopup); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Script items +// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +int KviMenuBar::getDefaultItemRealIndex(int iDefaultIndex) +{ + if(iDefaultIndex < 0)iDefaultIndex = 0; + if(iDefaultIndex >= m_iNumDefaultItems) + return indexOf(m_pDefaultItemId[m_iNumDefaultItems - 1]) + 1; + return indexOf(m_pDefaultItemId[iDefaultIndex]); +} + +KviScriptMenuBarItem * KviMenuBar::findMenu(const QString &text) +{ + if(!m_pScriptItemList)return 0; + for(KviScriptMenuBarItem * i = m_pScriptItemList->first();i;i = m_pScriptItemList->next()) + { + if(KviQString::equalCI(i->szText,text))return i; + } + return 0; +} + +KviScriptMenuBarItem * KviMenuBar::findMenu(KviKvsPopupMenu * p) +{ + if(!m_pScriptItemList)return 0; + for(KviScriptMenuBarItem * i = m_pScriptItemList->first();i;i = m_pScriptItemList->next()) + { + if(i->pPopup == p)return i; + } + return 0; +} + +bool KviMenuBar::removeMenu(const QString &text) +{ + KviScriptMenuBarItem * i = findMenu(text); + if(i) + { + disconnect(i->pPopup,SIGNAL(destroyed()),this,SLOT(menuDestroyed())); + removeItem(i->id); + m_pScriptItemList->removeRef(i); + return true; + } + return false; +} + +void KviMenuBar::menuDestroyed() +{ + KviScriptMenuBarItem * i = findMenu(((KviKvsPopupMenu *)sender())); + if(i) + { + removeItem(i->id); + m_pScriptItemList->removeRef(i); + } +} + +void KviMenuBar::addMenu(const QString &text,KviKvsPopupMenu * p,int index) +{ + if(!m_pScriptItemList) + { + m_pScriptItemList = new KviPointerList<KviScriptMenuBarItem>; + m_pScriptItemList->setAutoDelete(true); + }/* else { + removeMenu(text); + }*/ + KviScriptMenuBarItem * it = new KviScriptMenuBarItem; + it->szText = text; + it->szPopupName = p->name(); + it->pPopup = p; + it->id = insertItem(text,p,-1,index); + connect(p,SIGNAL(destroyed()),this,SLOT(menuDestroyed())); + m_pScriptItemList->append(it); +} + +#include "kvi_menubar.moc" |