You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tastymenu/src/tastymenu.cpp

494 lines
15 KiB

/***************************************************************************
* Copyright (C) 2006 by Marco Martin *
* notmart@gmail.com *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the Lesser GNU General Public *
* License as published by the Free Software Foundation; *
* either version 2 of the License, or (at your option) *
* 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., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <tdeglobal.h>
#include <tdelocale.h>
#include <tdeconfig.h>
#include <tdeapplication.h>
#include <tdemessagebox.h>
#include <tdeconfigdialog.h>
#include <tdeaboutdata.h>
#include <tdeaboutapplication.h>
#include <tdepopupmenu.h>
#include <kkeydialog.h>
#include <kuser.h>
#include <kstandarddirs.h>
#include <kdebug.h>
#include <tqstyle.h>
#include "tastymenu.h"
#include "appearance.h"
#include "behaviour.h"
TastyMenu::TastyMenu(const TQString& configFile, Type type, int actions, TQWidget *parent, const char *name)
: KPanelApplet(configFile, type, actions, parent, name), numNewApplications(0)
{
// Get the current application configuration handle
kConfig = sharedConfig();
prefSkel = new Prefs(kConfig);
prefSkel->readConfig();
kickerConf = TDEGlobal::config();
kickerConf->setGroup("buttons");
_showBigToolTip = kickerConf->readBoolEntry("EnableIconZoom", true);
button = new TastyButton(this);
menuHandler = new MenuHandler(this, prefSkel, "MenuHandler",
prefSkel->isNormalWindow() ?
TQt::WType_Dialog :
TQt::WType_Popup|TQt::WNoAutoErase);
connect (button, SIGNAL (pressed()), this, SLOT (clickSlot ()));
connect (menuHandler, SIGNAL(hidden()), this, SLOT(setButtonUp()));
_menuButtonLabel = prefSkel->menuButtonLabel();
if(_menuButtonLabel.isEmpty())
button -> setTextLabel(i18n("Menu"), false);
else
button -> setTextLabel(_menuButtonLabel, false);
button -> setUsesTextLabel(prefSkel->menuButtonLabelType()
!= Prefs::EnumMenuButtonLabelType::MenuButtonNone);
button -> setTextPosition(TQToolButton::BesideIcon);
menuTip = new TastyToolTip(button);
_toolTipTitle = prefSkel->toolTipTitle();
if( !_toolTipTitle.isEmpty() )
menuTip->setTitle(_toolTipTitle);
if( height() >= TDEIcon::SizeMedium )
button->setUsesBigPixmap(true);
else
button->setUsesBigPixmap(false);
iconLoader = TDEGlobal::iconLoader();
loadMenuButtonIcon();
button->setAutoRaise(true);
_newAppsNotification = prefSkel->newAppsNotification();
if( _newAppsNotification )
{
setNewApplicationsMessage(prefSkel->newInstalledApps().count());
connect( menuHandler, SIGNAL(newApplications(int)),
this, SLOT(setNewApplicationsMessage(int)));
}
setGlobalAccel( prefSkel->overrideAltF1());
connect( menuHandler, SIGNAL(kickerConfChanged()),
this, SLOT(updateConfiguration()) );
}
TastyMenu::~TastyMenu()
{
//delete prefSkel;
TDEGlobal::locale()->removeCatalogue("tastymenu");
}
void TastyMenu::loadMenuButtonIcon()
{
_menuButtonIcon = prefSkel->menuButtonIcon();
//the tooltip has the same icon as the button
menuTip->loadIcon( _menuButtonIcon );
if( prefSkel->menuButtonIconType()
== Prefs::EnumMenuButtonIconType::IconNone )
{
button->setIconSet(TQIconSet());
return;
}
if( position() == pTop || position() == pBottom )
_iconsize = height();
else if(position() == pLeft || position() == pRight)
_iconsize = width();
TQPixmap btnPixmap(iconLoader->loadIcon(_menuButtonIcon, TDEIcon::Panel, _iconsize));
if( !btnPixmap.isNull() )
button->setIconSet(btnPixmap);
else
{
kdDebug() << "Failed to load custom icon" << endl;
button->setIconSet(iconLoader->loadIcon("kmenu", TDEIcon::Panel, height()));
}
}
TQPoint TastyMenu::menupos(TQWidget *widget)
{
//now should look decent on all positions
switch( position() )
{
case pLeft:
{
return TQPoint( this->mapToGlobal( this->geometry().topRight() ));
break;
}
case pRight:
{
TQPoint buttonCoord = this->mapToGlobal(this->geometry().topLeft());
return TQPoint( buttonCoord.x()-widget->width(), buttonCoord.y() );
break;
}
case pTop:
{
return TQPoint( this->mapToGlobal( this->geometry().bottomLeft() ));
break;
}
default: //pBottom or floating
{
TQPoint buttonCoord = this->mapToGlobal(this->geometry().topLeft());
return TQPoint( buttonCoord.x(), buttonCoord.y()-widget->height() );
break;
}
}
}
void TastyMenu::clickSlot()
{
menuTip->hideTip();
menuHandler->popup(menupos(menuHandler));
//TQTimer::singleShot( 10000, this, SLOT(setButtonUp()) );
}
void TastyMenu::about()
{
TDEAboutData data("tastymenu",
I18N_NOOP("Tasty Menu"),
"1.0.6",
I18N_NOOP("TMenu replacement"),
TDEAboutData::License_LGPL_V2,
"(c) 2006-2007, Marco Martin",0,0,"mart@notmart.org");
data.addAuthor("Marco Martin",
I18N_NOOP("Maintainer"),
"mart@notmart.org",
"http://www.notmart.org");
data.setTranslator(I18N_NOOP("_: NAME OF TRANSLATORS\\nYour names")
,I18N_NOOP("_: EMAIL OF TRANSLATORS\\nYour emails"));
data.addCredit("Yurkovsky Andrey",
I18N_NOOP("For the Russian translation"),
"anyr@tut.by");
data.addCredit("Jannick Kuhr",
I18N_NOOP("For the German translation"),
"jannick.kuhr@kdemail.net");
data.addCredit("Jesús S Fernández Prieto (xgoan)",
I18N_NOOP("For the Spanish translation"),
"jesus@infodps.com");
data.addCredit("Motsyo Vitaliy",
I18N_NOOP("For the Ukrainian translation"),
"vitalikmotsyo@gmail.com");
data.addCredit("Laurent Hilsz",
I18N_NOOP("For the French translation"),
"laurent.hilsz@gmail.com");
data.addCredit("Tommi Nieminen",
I18N_NOOP("For the Finnish translation"),
"translator@legisign.org");
data.addCredit("Matija Šuklje",
I18N_NOOP("For the Slovenian translation"),
"matija.suklje@rutka.net");
data.addCredit("Tomasz Argasiński",
I18N_NOOP("For the Polish translation"),
"targasinski@o2.pl");
data.addCredit("Ewerton de A. Dutra"
I18N_NOOP("For the Polish translation"),
"ea.dutra@gmail.com");
data.addCredit("Oswald Buddenhagen and Stephan Kulow",
I18N_NOOP("For the Switch user code from TDM"),
"ossi@kde.org and coolo@kde.org");
data.addCredit("The whole KBFX team",
I18N_NOOP("For some inspirations here and there."),
"http://www.kbfx.org");
data.addCredit("Seb Ruiz",
I18N_NOOP("For some code taken from Amarok's statistics list view"),
"me@sebruiz.net");
TDEIconLoader *iconLoader = TDEGlobal::iconLoader();
data.setProgramLogo(iconLoader->loadIcon("kmenu", TDEIcon::Panel).convertToImage());
TDEAboutApplication dialog(&data);
dialog.exec();
}
void TastyMenu::help()
{
TDEApplication::tdeinitExec("khelpcenter", "help:/tastymenu");
}
void TastyMenu::preferences()
{
if(TDEConfigDialog::showDialog("settings"))
return;
Appearance *appearanceDialog = new Appearance(0, "appearance" );
Behaviour *behaviourDialog = new Behaviour(0, "behaviour" );
TDEConfigDialog *dialog = new TDEConfigDialog(this, "settings", prefSkel,
KDialogBase::Tabbed,
TDEConfigDialog::Default|
TDEConfigDialog::Ok|
TDEConfigDialog::Apply|
TDEConfigDialog::Cancel );
dialog->addPage(appearanceDialog, i18n("Appearance"), "appearance" );
dialog->addPage(behaviourDialog, i18n("Behaviour"), "behaviour" );
connect( dialog, SIGNAL(settingsChanged()),
this, SLOT(updateConfiguration()) );
dialog->show();
}
void TastyMenu::setGlobalAccel( bool global )
{
globalAccel = new TDEGlobalAccel(this);
globalAccel->insert("Toggle Tasty Menu", i18n("Toggle Tasty Menu"),
i18n("Toggle Tasty Menu"),
0, 0, this, SLOT(clickSlot()));
globalAccel->readSettings();
globalAccel->updateConnections();
//deactivate or reactivate the global alt+f1 shotcut for kmenu
if( global )
{
if( !kickerConf )
kickerConf = TDEGlobal::config();
kickerConf->setGroup("Global Shortcuts");
TQString kmenuShortcut = kickerConf->readEntry("Popup Launch Menu", "default(Alt+F1)");
if( kmenuShortcut=="none" )
return;
TQString tastyMenuShortcut = kickerConf->readEntry("Toggle Tasty Menu", "");
TDEShortcut shortCutKey(tastyMenuShortcut);
kickerConf->writeEntry("Popup Launch Menu", "none");
kickerConf->writeEntry("Toggle Tasty Menu", kmenuShortcut);
kickerConf->sync();
}
else
{
if( !kickerConf )
kickerConf = TDEGlobal::config();
kickerConf->setGroup("Global Shortcuts");
kickerConf->deleteEntry("Popup Launch Menu");
kickerConf->sync();
}
}
void TastyMenu::updateConfiguration()
{
kickerConf->setGroup("buttons");
_showBigToolTip = kickerConf->readBoolEntry("EnableIconZoom", true);
menuHandler->updateConfig();
setGlobalAccel(prefSkel->overrideAltF1());
_menuButtonLabel = prefSkel->menuButtonLabel();
if(_menuButtonLabel.isEmpty())
button -> setTextLabel(i18n("Menu"), false);
else
button -> setTextLabel(_menuButtonLabel, false);
button -> setUsesTextLabel(prefSkel->menuButtonLabelType()
!= Prefs::EnumMenuButtonLabelType::MenuButtonNone);
loadMenuButtonIcon();
_newAppsNotification = prefSkel->newAppsNotification();
_toolTipTitle = prefSkel->toolTipTitle();
if( !_toolTipTitle.isEmpty() )
menuTip->setTitle(_toolTipTitle);
}
void TastyMenu::setNewApplicationsMessage( int number )
{
if( number <= 0 )
{
menuTip ->setMessage("");
}
else
menuTip ->setMessage(i18n("There is one new installed application",
"There are %n new installed applications", number));
/*else if( number == 1)
menuTip ->setMessage(i18n("There is one new installed application"));
else
menuTip ->setMessage(i18n("There are")+" " + TQString().setNum(number) +" "+ i18n("new installed applications"));*/
if( _showBigToolTip && number > numNewApplications )
menuTip->notify( menupos( menuTip ) );
numNewApplications = number;
}
int TastyMenu::widthForHeight(int height) const
{
int buttonWidth = width();
if( position() == pTop || position() == pBottom )
{
button -> setTextPosition(TQToolButton::BesideIcon);
if( prefSkel->menuButtonLabelType()
!= Prefs::EnumMenuButtonLabelType::MenuButtonNone )
return ((button->fontMetrics()).width(button->textLabel())) + _iconsize + 10;
else
return height;
}
else
return buttonWidth;
}
int TastyMenu::heightForWidth(int width) const
{
int buttonHeight = height();
if( position() == pLeft || position() == pRight )
{
if( prefSkel->menuButtonLabelType()
!= Prefs::EnumMenuButtonLabelType::MenuButtonNone )
{
button -> setTextPosition(TQToolButton::BelowIcon);
return ((button->fontMetrics()).height()) + _iconsize + 10;
}
else
return width;
}
else
return buttonHeight;
}
void TastyMenu::resizeEvent(TQResizeEvent *e)
{
int newHeight = e->size().height();
button->setFixedHeight(newHeight);
button->setFixedWidth(e->size().width());
if( newHeight >= TDEIcon::SizeMedium )
button->setUsesBigPixmap(true);
else
button->setUsesBigPixmap(false);
loadMenuButtonIcon();
}
void TastyMenu::mousePressEvent(TQMouseEvent *e)
{
menuTip->hideTip();
if(e->button()==RightButton)
{
TDEPopupMenu menu(this);
menu.insertTitle("Tasty Menu");
menu.insertItem(SmallIcon("kmenu"), i18n("&About"), 1);
menu.insertItem(SmallIcon("help"), i18n("&Help"), 2);
menu.insertItem(SmallIcon("kmenuedit"), i18n("&Edit Menu"), 3);
if( _newAppsNotification )
menu.insertItem(SmallIcon("locationbar_erase"), i18n("&Clear recently installed applications list"), 4);
menu.insertSeparator();
menu.insertItem(SmallIcon("configure_shortcuts"), i18n("&Configure Global Shortcuts..."), 5);
menu.insertItem(SmallIcon("configure"), i18n("&Configure..."), 6);
int choice = menu.exec(this->mapToGlobal(e->pos()));
switch( choice )
{
case 1:
about();
break;
case 2:
help();
break;
case 3:
KRun::runCommand ("kmenuedit");
break;
case 4:
menuHandler->clearNewInstalledApplications();
setNewApplicationsMessage(0);
menuHandler->slotUpdateApplications();
break;
case 5:
{
kickerConf->sync();
KKeyDialog::configure(globalAccel);
globalAccel->writeSettings(kickerConf);
globalAccel->updateConnections();
kickerConf->sync();
break;
}
case 6:
preferences();
break;
default:
break;
}
}
}
void TastyMenu::enterEvent( TQEvent * e )
{
e=e;
if( _showBigToolTip && !menuHandler->isVisible() )
menuTip->showTip(menupos(menuTip));
KPanelApplet::enterEvent(e);
}
void TastyMenu::leaveEvent( TQEvent * e )
{
e=e;
menuTip->hideTip();
KPanelApplet::leaveEvent(e);
}
extern "C"
{
KPanelApplet* init( TQWidget *parent, const TQString& configFile)
{
TDEGlobal::locale()->insertCatalogue("tastymenu");
return new TastyMenu(configFile, KPanelApplet::Normal,
KPanelApplet::About | KPanelApplet::Help | KPanelApplet::Preferences,
parent, "tastymenu");
}
}
#include "tastymenu.moc"