summaryrefslogtreecommitdiffstats
path: root/kkbswitch/kbswitchtrayicon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kkbswitch/kbswitchtrayicon.cpp')
-rw-r--r--kkbswitch/kbswitchtrayicon.cpp200
1 files changed, 200 insertions, 0 deletions
diff --git a/kkbswitch/kbswitchtrayicon.cpp b/kkbswitch/kbswitchtrayicon.cpp
new file mode 100644
index 0000000..4a51bfe
--- /dev/null
+++ b/kkbswitch/kbswitchtrayicon.cpp
@@ -0,0 +1,200 @@
+/***************************************************************************
+ kbswitchtrayicon.cpp - description
+ -------------------
+ begin : Wed Jul 4 2001
+ copyright : (C) 2001 by Leonid Zeitlin
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <kdeversion.h>
+
+#undef USE_BOLD_MENUITEM
+
+#include "kbswitchtrayicon.h"
+#include "xkeyboard.h"
+#ifdef USE_BOLD_MENUITEM
+ #include "boldmenuitem.h"
+#endif
+#include <kpopupmenu.h>
+#if KDE_VERSION_MAJOR >= 3
+ #include <kstandarddirs.h>
+#else
+ #include <kstddirs.h>
+#endif
+#include <klocale.h>
+#include <kstdaction.h>
+#include <kaction.h>
+#include <kaboutapplication.h>
+#if KDE_VERSION_MAJOR >= 3
+ #include <kapplication.h>
+#else
+ #include <kapp.h>
+#endif
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <kdeversion.h>
+#include <qtooltip.h>
+#include <qstyle.h>
+#include <qpainter.h>
+
+#ifdef USE_BOLD_MENUITEM
+static QColor getActiveTextColor(KPopupMenu *menu)
+{
+ int id = menu->insertItem("test text");
+ QMenuItem *item = menu->findItem(id);
+ QStyleOption styleopt = QStyleOption(item);
+ QPainter painter(menu);
+ QColorGroup &cg = menu->colorGroup();
+ KApplication::style().drawControl(QStyle::CE_PopupMenuItem, &painter, menu,
+ menu->contentsRect(), cg, QStyle::Style_Enabled | QStyle::Style_Active,
+ styleopt);
+ menu->removeItem(id);
+ return painter.pen().color();
+}
+#endif
+
+KBSwitchTrayIcon::KBSwitchTrayIcon(KBConfig *conf){
+ QPixmap pix;
+#if KDE_VERSION_MAJOR >= 3
+ KActionCollection *actions = new KActionCollection(this);
+ #define ACTION_PARENT actions
+#else
+ #define ACTION_PARENT this
+#endif
+
+ m_kbconf = conf;
+ //QObject::connect(conf, SIGNAL(changed()), this, SLOT(updateMenuIcons()));
+ KPopupMenu * menu = contextMenu();
+ addLayoutItems(menu, false);
+ QObject::connect(menu, SIGNAL(activated(int)), this, SLOT(slotMenuActivated(int)));
+
+ menu->insertSeparator();
+ KAction *pref = KStdAction::preferences(this, SIGNAL(preferencesSelected()), ACTION_PARENT);
+ pref->plug(menu);
+ KAction *help = KStdAction::help(this, SLOT(slotHelp()), ACTION_PARENT);
+ help->plug(menu);
+ KAction *about = KStdAction::aboutApp(this, SLOT(slotAbout()), ACTION_PARENT);
+ about->plug(menu);
+
+ /*QString path = locate("icon", "hicolor/16x16/apps/locale.png");
+ if (!path.isEmpty()) pix.load(path);*/
+ pix = kapp->iconLoader()->loadIcon("locale", KIcon::Small);
+ menu->changeTitle(menu->idAt(0), pix, i18n("Keyboard Switch"));
+ setAlignment(Qt::AlignHCenter | Qt::AlignCenter);
+}
+
+KBSwitchTrayIcon::~KBSwitchTrayIcon(){
+}
+
+/** No descriptions */
+void KBSwitchTrayIcon::slotMenuActivated(int id){
+ if (id >= 0 && id < m_kbconf->groupCount()) emit groupSelected(id);
+}
+
+/** No descriptions */
+void KBSwitchTrayIcon::setActiveGroup(int groupno){
+ int i;
+ KPopupMenu *menu = contextMenu();
+ for (i = 0; i < m_kbconf->groupCount(); i++)
+ menu->setItemChecked(i, false);
+ menu->setItemChecked(groupno, true);
+}
+
+/** No descriptions */
+void KBSwitchTrayIcon::setToggleGroups(int group1, int group2){
+ int i;
+ bool toggling;
+ KPopupMenu *menu = contextMenu();
+
+ for (i = 0; i < m_kbconf->groupCount(); i++) {
+ toggling = (i == group1 || i == group2);
+#ifdef USE_BOLD_MENUITEM
+ QMenuItem *item = menu->findItem(i);
+ BoldMenuItem *bolditem = dynamic_cast<BoldMenuItem*>(item->custom());
+ bolditem->setBold(toggling);
+#else
+ if (toggling)
+ menu->changeItem(i, m_kbconf->getGroup(i)->getName() + "*");
+ else menu->changeItem(i, m_kbconf->getGroup(i)->getName());
+#endif
+ }
+}
+
+/** No descriptions */
+void KBSwitchTrayIcon::mouseReleaseEvent(QMouseEvent *event){
+ if (event->button() == LeftButton) {
+ emit clicked();
+ }
+}
+
+/** No descriptions */
+void KBSwitchTrayIcon::slotAbout(){
+ KAboutApplication about;
+ about.exec();
+}
+
+/** No descriptions */
+void KBSwitchTrayIcon::updateMenuIcons(){
+ KPopupMenu *menu = contextMenu();
+ for (int i = 0; i < m_kbconf->groupCount(); i++) {
+ menu->changeItem(i, m_kbconf->getGroup(i)->getPixmap(), menu->text(i));
+ }
+}
+
+/** No descriptions */
+void KBSwitchTrayIcon::addLayoutItems(KPopupMenu *menu, bool clearOld) {
+ KBGroup *group;
+ int index;
+#ifdef USE_BOLD_MENUITEM
+ QColor active_text_color = getActiveTextColor(menu);
+#endif
+
+ if (clearOld)
+ for (int i = 0; i < XKeyboard::MaxNumKbdGroups; i++)
+ if ((index = menu->indexOf(i)) >= 0) menu->removeItemAt(index);
+
+ for (int i = 0; i < m_kbconf->groupCount(); i++) {
+ group = m_kbconf->getGroup(i);
+#ifdef USE_BOLD_MENUITEM
+ /* the work on BoldMenuItems suspended: see comments in boldmenuitem.h */
+ menu->insertItem(group->getPixmap(),
+ new BoldMenuItem(group->getName(), active_text_color, false), i);
+#else
+ menu->insertItem(group->getPixmap(), group->getName(), i, i + 1);
+#endif
+ }
+}
+
+/** No descriptions */
+void KBSwitchTrayIcon::reconfigure(){
+ addLayoutItems(contextMenu(), true);
+}
+
+/** Update the tray icon display for the given group */
+void KBSwitchTrayIcon::updateTrayIcon(int groupno){
+ const QPixmap& pix = m_kbconf->getGroup(groupno)->getPixmap();
+ setPixmap(pix);
+ setActiveGroup(groupno);
+ QToolTip::remove(this);
+ QToolTip::add(this, m_kbconf->getGroup(groupno)->getName());
+}
+
+/** Update menu and tray icons after configuration has changed */
+void KBSwitchTrayIcon::slotUpdateIcons(){
+ updateTrayIcon(XKeyboard::self()->getGroupNo());
+ updateMenuIcons();
+}
+
+/** Display help */
+void KBSwitchTrayIcon::slotHelp(){
+ kapp->invokeHelp();
+}