1 /****************************************************************************************
2 * Copyright (c) 2008 Peter ZHOU <peterzhoulei@gmail.com> *
3 * *
4 * This program is free software; you can redistribute it and/or modify it under *
5 * the terms of the GNU General Public License as published by the Free Software *
6 * Foundation; either version 2 of the License, or (at your option) any later *
7 * version. *
8 * *
9 * This program is distributed in the hope that it will be useful, but WITHOUT ANY *
10 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A *
11 * PARTICULAR PURPOSE. See the GNU General Public License for more details. *
12 * *
13 * You should have received a copy of the GNU General Public License along with *
14 * this program. If not, see <http://www.gnu.org/licenses/>. *
15 ****************************************************************************************/
16
17 #include "AmarokWindowScript.h"
18
19 #include "ActionClasses.h"
20 #include "amarokconfig.h"
21 #include "core/support/Amarok.h"
22 #include "App.h"
23 #include "browsers/collectionbrowser/CollectionWidget.h"
24 #include "core/support/Debug.h"
25 #include "MainWindow.h"
26 #include "PaletteHandler.h"
27 #include "ScriptingDefines.h"
28
29 #include <QAction>
30 #include <KActionCollection>
31
32 #include <QClipboard>
33 #include <QToolTip>
34
35 using namespace AmarokScript;
36
37 class ToolTipEventFilter : public QObject
38 {
39 public:
40 static ToolTipEventFilter *instance();
41
42 private:
43 ToolTipEventFilter();
44 bool eventFilter( QObject *object, QEvent *event ) override;
45
46 static QPointer<ToolTipEventFilter> s_instance;
47 };
48
49 QPointer<ToolTipEventFilter> ToolTipEventFilter::s_instance;
50
51 ToolTipEventFilter*
instance()52 ToolTipEventFilter::instance()
53 {
54 if( !s_instance )
55 s_instance = new ToolTipEventFilter();
56 return s_instance.data();
57 }
58
ToolTipEventFilter()59 ToolTipEventFilter::ToolTipEventFilter()
60 : QObject( The::mainWindow() )
61 {}
62
63 bool
eventFilter(QObject * object,QEvent * event)64 ToolTipEventFilter::eventFilter( QObject *object, QEvent *event )
65 {
66 if( event->type() == QEvent::ToolTip )
67 QApplication::clipboard()->setText( object->objectName() );
68 return false;
69 }
70
71 // AmarokWindowScript
72
AmarokWindowScript(AmarokScriptEngine * scriptEngine)73 AmarokWindowScript::AmarokWindowScript( AmarokScriptEngine* scriptEngine )
74 : QObject( scriptEngine )
75 , m_toolsMenu( The::mainWindow()->ToolsMenu() )
76 , m_settingsMenu( The::mainWindow()->SettingsMenu() )
77 , m_scriptEngine( scriptEngine )
78 {
79 QJSValue windowObject = scriptEngine->newQObject( this );
80 scriptEngine->globalObject().property( QStringLiteral("Amarok") ).setProperty( QStringLiteral("Window"), windowObject );
81
82 windowObject.setProperty( QStringLiteral("ToolsMenu"), scriptEngine->newObject() );
83 windowObject.setProperty( QStringLiteral("SettingsMenu"), scriptEngine->newObject() );
84
85 connect( pApp, &App::prepareToQuit, this, &AmarokWindowScript::prepareToQuit );
86 }
87
88 void
addToolsMenu(QMenu * menu)89 AmarokWindowScript::addToolsMenu( QMenu *menu )
90 {
91 m_toolsMenu.data()->addMenu( menu );
92 }
93
94 void
addSettingsMenu(QMenu * menu)95 AmarokWindowScript::addSettingsMenu( QMenu *menu )
96 {
97 m_settingsMenu.data()->addMenu( menu );
98
99 }
100
101 bool
addToolsMenu(const QString & id,const QString & menuTitle,const QString & icon)102 AmarokWindowScript::addToolsMenu( const QString &id, const QString &menuTitle, const QString &icon )
103 {
104 return addMenuAction( m_toolsMenu, id, menuTitle, QStringLiteral("ToolsMenu"), icon );
105 }
106
107 void
addToolsSeparator()108 AmarokWindowScript::addToolsSeparator()
109 {
110 m_toolsMenu.data()->addSeparator();
111 }
112
113 bool
addSettingsMenu(const QString & id,const QString & actionName,const QString & icon)114 AmarokWindowScript::addSettingsMenu( const QString &id, const QString &actionName, const QString &icon )
115 {
116 return addMenuAction( m_settingsMenu, id, actionName, QStringLiteral("SettingsMenu"), icon );
117 }
118
119 bool
addCustomAction(const QString & menuName,const QString & id,const QString & actionName,const QString & icon)120 AmarokScript::AmarokWindowScript::addCustomAction(const QString &menuName, const QString &id, const QString &actionName, const QString &icon)
121 {
122 if( !m_customMenus.contains( menuName ) )
123 return false;
124
125 return addMenuAction( m_customMenus.value( menuName ), id, actionName, menuName, icon );
126 }
127
128 void
addSettingsSeparator()129 AmarokWindowScript::addSettingsSeparator()
130 {
131 m_settingsMenu->addSeparator();
132 }
133
134 bool
addMenuAction(QMenu * menu,const QString & id,const QString & actionName,const QString & menuProperty,const QString & icon)135 AmarokWindowScript::addMenuAction( QMenu *menu, const QString &id, const QString &actionName, const QString &menuProperty, const QString &icon )
136 {
137 KActionCollection* const ac = Amarok::actionCollection();
138 if( ac->action( id ) )
139 return false;
140
141 QAction *action = new QAction( QIcon::fromTheme( icon ), actionName, this );
142 ac->addAction( id, action );
143
144 // don't forget to read the shortcut settings from the config file so
145 // the shortcuts for the actions are updated
146 ac->readSettings();
147
148 // add the action to the given menu
149 menu->addAction( ac->action( id ) );
150
151 QJSValue newMenu = m_scriptEngine->newQObject( action );
152 m_scriptEngine->globalObject().property( QStringLiteral("Amarok") ).property( QStringLiteral("Window") ).property( menuProperty ).setProperty( id, newMenu );
153 return true;
154 }
155
156 void
showTrayIcon(bool show)157 AmarokWindowScript::showTrayIcon( bool show )
158 {
159 AmarokConfig::setShowTrayIcon( show );
160 pApp->applySettings();
161 }
162
163 QString
activeBrowserName()164 AmarokWindowScript::activeBrowserName()
165 {
166 return The::mainWindow()->activeBrowserName();
167 }
168
169 bool
isTrayIconShown()170 AmarokWindowScript::isTrayIconShown()
171 {
172 return AmarokConfig::showTrayIcon();
173 }
174
175 QMainWindow*
mainWindow()176 AmarokWindowScript::mainWindow()
177 {
178 return The::mainWindow();
179 }
180
181 QPalette
palette() const182 AmarokWindowScript::palette() const
183 {
184 return The::paletteHandler()->palette();
185 }
186
187 void
setPalette(const QPalette & palette)188 AmarokWindowScript::setPalette( const QPalette &palette )
189 {
190 The::paletteHandler()->setPalette( palette );
191 }
192
193 void
setStyleSheet(const QString & styleSheet)194 AmarokWindowScript::setStyleSheet( const QString &styleSheet )
195 {
196 The::mainWindow()->setStyleSheet( styleSheet );
197 }
198
199 QString
styleSheet() const200 AmarokWindowScript::styleSheet() const
201 {
202 return The::mainWindow()->styleSheet();
203 }
204
205 QFont
font() const206 AmarokWindowScript::font() const
207 {
208 return The::mainWindow()->font();
209 }
210
211 void
setFont(const QFont & font)212 AmarokWindowScript::setFont( const QFont &font )
213 {
214 The::mainWindow()->setFont( font );
215 The::mainWindow()->collectionBrowser()->update();
216 }
217
218 void
showToolTip()219 AmarokWindowScript::showToolTip()
220 {
221 foreach( QWidget *widget, The::mainWindow()->findChildren<QWidget*>() )
222 {
223 widget->setToolTip( widget->objectName() );
224 widget->installEventFilter( ToolTipEventFilter::instance() );
225 }
226 }
227