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