37 #include <kgenericfactory.h>
38 #include <kaboutdata.h>
39 #include <kmessagebox.h>
41 #include <QtDBus/QDBusInterface>
43 K_PLUGIN_FACTORY( KCMLircFactory, registerPlugin<KCMRemoteControl>();)
44 K_EXPORT_PLUGIN( KCMLircFactory(
"kcm_remotecontrol" ) )
47 KCModule(KCMLircFactory::componentData(), parent, args)
51 ki18n(
"The KDE Remote Control System"), KAboutData::License_GPL_V2,
52 ki18n(
"2010 Michael Zanetti, 2010 Frank Scheffold"),
53 ki18n(
"Use this to configure KDE's remote control system in order to control any KDE application with your remote control."),
54 "http://utils.kde.org/projects/kremotecontrol"));
55 setQuickHelp(i18n(
"<h1>Remote Controls</h1><p>This module allows you to configure bindings between your remote controls and KDE applications. Simply select your remote control and click Add next to the Actions/Buttons list to create new action for button presses.</p>"));
57 KGlobal::locale()->insertCatalog( QLatin1String(
"libkremotecontrol" ));
59 QHBoxLayout *layout =
new QHBoxLayout(
this);
62 layout->addWidget(widget);
65 ui.pbAddMode->setIcon(KIcon( QLatin1String(
"list-add" )));
66 connect(ui.pbAddMode, SIGNAL(clicked(
bool)), SLOT(addMode()));
68 ui.pbRemoveMode->setIcon(KIcon( QLatin1String(
"list-remove" )));
69 connect(ui.pbRemoveMode, SIGNAL(clicked(
bool)), SLOT(removeMode()));
71 ui.pbAddAction->setIcon(KIcon( QLatin1String(
"list-add" )));
72 connect(ui.pbAddAction, SIGNAL(clicked(
bool)), SLOT(addAction()));
74 ui.pbRemoveAction->setIcon(KIcon( QLatin1String(
"list-remove" )));
75 connect(ui.pbRemoveAction, SIGNAL(clicked(
bool)), SLOT(removeAction()));
77 ui.pbEditMode->setIcon(KIcon( QLatin1String(
"configure" )));
78 connect(ui.pbEditMode, SIGNAL(clicked(
bool)), SLOT(editMode()));
80 ui.pbEditAction->setIcon(KIcon( QLatin1String(
"configure" )));
81 connect(ui.pbEditAction, SIGNAL(clicked(
bool)), SLOT(editAction()));
83 ui.pbMoveModeUp->setIcon(KIcon( QLatin1String(
"arrow-up" )));
84 connect(ui.pbMoveModeUp, SIGNAL(clicked(
bool)), SLOT(moveModeUp()));
86 ui.pbMoveModeDown->setIcon(KIcon( QLatin1String(
"arrow-down" )));
87 connect(ui.pbMoveModeDown, SIGNAL(clicked(
bool)), SLOT(moveModeDown()));
89 ui.pbMoveActionUp->setIcon(KIcon( QLatin1String(
"arrow-up" )));
90 connect(ui.pbMoveActionUp, SIGNAL(clicked(
bool)), SLOT(moveActionUp()));
92 ui.pbMoveActionDown->setIcon(KIcon( QLatin1String(
"arrow-down" )));
93 connect(ui.pbMoveActionDown, SIGNAL(clicked(
bool)), SLOT(moveActionDown()));
95 ui.pbCopyAction->setIcon(KIcon( QLatin1String(
"edit-copy" )));
96 connect(ui.pbCopyAction, SIGNAL(clicked(
bool)), SLOT(copyAction()));
98 ui.pbAutoPopulate->setIcon(KIcon( QLatin1String(
"tools-wizard" )));
99 connect(ui.pbAutoPopulate, SIGNAL(clicked(
bool)), SLOT(autoPopulate()));
102 m_remoteModel =
new RemoteModel(m_remoteList, ui.tvRemotes);
103 ui.tvRemotes->setModel(m_remoteModel);
104 connect(ui.tvRemotes->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(modeSelectionChanged(QItemSelection)));
105 connect(ui.tvRemotes, SIGNAL(doubleClicked(QModelIndex)), SLOT(editMode()));
107 connect(m_remoteModel, SIGNAL(modeChanged(
Mode*)), SLOT(actionDropped(
Mode*)), Qt::QueuedConnection);
111 ui.tvActions->setModel(m_actionModel);
112 connect(ui.tvActions->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(actionSelectionChanged(QItemSelection)));
113 connect(ui.tvActions, SIGNAL(doubleClicked(QModelIndex)), SLOT(editAction()));
116 connect(ui.cbTrayIcon, SIGNAL(clicked(
bool)), SLOT(changed()));
123 foreach(
Remote *remote, m_remoteList){
128 void KCMRemoteControl::addAction() {
129 Remote *remote = m_remoteModel->
remote(ui.tvRemotes->currentIndex());
134 Mode *mode = m_remoteModel->
mode(ui.tvRemotes->currentIndex());
141 void KCMRemoteControl::removeAction() {
142 Mode *mode = m_remoteModel->
mode(ui.tvRemotes->selectionModel()->currentIndex());
143 Action *action = m_actionModel->
action(ui.tvActions->selectionModel()->currentIndex());
150 void KCMRemoteControl::editAction() {
151 Action *action = m_actionModel->
action(ui.tvActions->selectionModel()->currentIndex());
152 Remote *remote = m_remoteModel->
remote(ui.tvRemotes->selectionModel()->currentIndex());
153 Mode *mode = m_remoteModel->
mode(ui.tvRemotes->selectionModel()->currentIndex());
156 if(editActioncontainer->exec()) {
160 delete editActioncontainer;
163 void KCMRemoteControl::copyAction() {
164 Action *action = m_actionModel->
action(ui.tvActions->selectionModel()->currentIndex());
165 Mode *mode = m_remoteModel->
mode(ui.tvRemotes->selectionModel()->currentIndex());
169 ui.tvActions->selectionModel()->setCurrentIndex(m_actionModel->
find(newAction), QItemSelectionModel::Rows | QItemSelectionModel::SelectCurrent);
174 void KCMRemoteControl::moveActionUp() {
175 Mode *mode = m_remoteModel->
mode(ui.tvRemotes->selectionModel()->currentIndex());
176 Action *action = m_actionModel->
action(ui.tvActions->selectionModel()->currentIndex());
182 void KCMRemoteControl::moveActionDown() {
183 Mode *mode = m_remoteModel->
mode(ui.tvRemotes->selectionModel()->currentIndex());
184 Action *action = m_actionModel->
action(ui.tvActions->selectionModel()->currentIndex());
190 void KCMRemoteControl::autoPopulate() {
191 Mode *mode = m_remoteModel->
mode(ui.tvRemotes->selectionModel()->currentIndex());
192 Remote *remote = m_remoteModel->
remote(ui.tvRemotes->selectionModel()->currentIndex());
193 QPointer<SelectProfile> autoPopulateDialog =
new SelectProfile(remote,
this);
194 if(autoPopulateDialog->exec()){
203 delete autoPopulateDialog;
209 void KCMRemoteControl::addMode() {
210 Remote *remote = m_remoteModel->
remote(ui.tvRemotes->selectionModel()->currentIndex());
211 kDebug() <<
"current selected remote:" << remote;
213 QPointer<ModeDialog> modeDialog =
new ModeDialog(remote);
214 if(modeDialog->exec()){
215 m_remoteModel->
refresh(m_remoteList);
217 kDebug() <<
"Created Mode" << mode->
name();
225 void KCMRemoteControl::editMode() {
226 Remote *remote = m_remoteModel->
remote(ui.tvRemotes->selectionModel()->currentIndex());
227 Mode *mode = m_remoteModel->
mode(ui.tvRemotes->selectionModel()->currentIndex());
228 kDebug() <<
"current selected remote:" << remote <<
"and mode:" << mode;
230 QPointer<ModeDialog> modeDialog =
new ModeDialog(remote, mode);
231 if(modeDialog->exec()){
232 m_remoteModel->
refresh(m_remoteList);
239 void KCMRemoteControl::removeMode() {
240 QModelIndex currentIndex = ui.tvRemotes->selectionModel()->currentIndex();
242 Mode *mode = m_remoteModel->
mode(currentIndex);
243 if(remote && remote->
allModes().contains(mode)){
246 if(KMessageBox::questionYesNo(
this, i18n(
"Are you sure you want to remove this remote and all of its modes and actions?"), i18n(
"Remove remote")) == KMessageBox::Yes) {
247 m_remoteList.remove(m_remoteList.indexOf(remote));
248 m_remoteModel->clear();
249 m_actionModel->clear();
251 addUnconfiguredRemotes();
256 if((mode->
actions().count() > 0) &&
257 (KMessageBox::questionYesNo(
this, i18n(
"Are you sure you want to remove this mode and all contained actions?"), i18n(
"Remove mode")) != KMessageBox::Yes)) {
262 ui.tvRemotes->selectionModel()->setCurrentIndex(m_remoteModel->
find(remote->
masterMode()), QItemSelectionModel::Rows | QItemSelectionModel::SelectCurrent);
267 void KCMRemoteControl::moveModeUp() {
268 QModelIndex currentIndex = ui.tvRemotes->selectionModel()->currentIndex();
270 Mode *mode = m_remoteModel->
mode(currentIndex);
276 void KCMRemoteControl::moveModeDown() {
277 QModelIndex currentIndex = ui.tvRemotes->selectionModel()->currentIndex();
279 Mode *mode = m_remoteModel->
mode(currentIndex);
285 void KCMRemoteControl::updateModes() {
286 Mode *mode = m_remoteModel->
mode(ui.tvRemotes->selectionModel()->currentIndex());
287 m_remoteModel->
refresh(m_remoteList);
288 ui.tvRemotes->expandAll();
289 ui.tvRemotes->resizeColumnToContents(0);
291 ui.tvRemotes->selectionModel()->setCurrentIndex(m_remoteModel->
find(mode), QItemSelectionModel::Rows | QItemSelectionModel::SelectCurrent);
293 modeSelectionChanged(ui.tvRemotes->selectionModel()->selection());
295 if(!m_remoteList.isEmpty()){
296 ui.lNoRemotesWarning->setMaximumSize(0,0);
297 ui.tvRemotes->setEnabled(
true);
298 ui.tvActions->setEnabled(
true);
299 ui.lRemotes->setEnabled(
true);
301 ui.lNoRemotesWarning->setMaximumSize(32767, 32767);
302 ui.tvRemotes->setEnabled(
false);
303 ui.tvActions->setEnabled(
false);
304 ui.lRemotes->setEnabled(
false);
308 void KCMRemoteControl::updateActions(
Mode *mode) {
309 Action *oldAction = m_actionModel->
action(ui.tvActions->selectionModel()->currentIndex());
311 ui.tvActions->resizeColumnToContents(0);
313 ui.tvActions->selectionModel()->setCurrentIndex(m_actionModel->
find(oldAction), QItemSelectionModel::Rows | QItemSelectionModel::SelectCurrent);
315 actionSelectionChanged(ui.tvActions->selectionModel()->selection());
318 void KCMRemoteControl::modeSelectionChanged(
const QItemSelection& selection) {
319 const QModelIndexList indexes = selection.indexes();
321 if(!indexes.isEmpty()) {
322 index = indexes.at(0);
327 ui.pbAddMode->setEnabled(selectedRemoteAvailable);
328 ui.pbEditMode->setEnabled(selectedRemoteAvailable);
329 ui.pbAddAction->setEnabled(selectedRemoteAvailable);
330 ui.pbAutoPopulate->setEnabled(selectedRemoteAvailable);
336 ui.pbRemoveMode->setEnabled(
true);
338 ui.pbRemoveMode->setEnabled(
false);
342 ui.pbAddMode->setEnabled(
false);
343 ui.pbEditMode->setEnabled(
false);
344 ui.pbAddAction->setEnabled(
false);
345 ui.pbAutoPopulate->setEnabled(
false);
346 ui.pbRemoveMode->setEnabled(
false);
349 Mode *mode = m_remoteModel->
mode(index);
354 ui.lActions->setText(i18n(
"Configured actions for %1:", remote->
name()));
356 ui.lActions->setText(i18n(
"Configured actions for %1 in mode %2:", remote->
name(), mode->
name()));
359 if(remote->
allModes().indexOf(mode) > 1){
360 ui.pbMoveModeUp->setEnabled(
true);
362 ui.pbMoveModeUp->setEnabled(
false);
366 ui.pbMoveModeDown->setEnabled(
true);
368 ui.pbMoveModeDown->setEnabled(
false);
375 void KCMRemoteControl::actionSelectionChanged(
const QItemSelection& selection) {
376 const QModelIndexList indexes = selection.indexes();
378 if(!indexes.isEmpty()) {
379 index = indexes.at(0);
383 bool selectedRemoteAvailable = m_remoteModel->
remote(ui.tvRemotes->selectionModel()->currentIndex())->isAvailable();
384 ui.pbRemoveAction->setEnabled(selectedRemoteAvailable);
385 ui.pbEditAction->setEnabled(selectedRemoteAvailable);
386 ui.pbCopyAction->setEnabled(selectedRemoteAvailable);
388 ui.pbMoveActionUp->setEnabled(
true);
390 ui.pbMoveActionUp->setEnabled(
false);
392 if(index.row() < (m_actionModel->rowCount() - 1)){
393 ui.pbMoveActionDown->setEnabled(
true);
395 ui.pbMoveActionDown->setEnabled(
false);
398 ui.pbRemoveAction->setEnabled(
false);
399 ui.pbEditAction->setEnabled(
false);
400 ui.pbCopyAction->setEnabled(
false);
401 ui.pbMoveActionUp->setEnabled(
false);
402 ui.pbMoveActionDown->setEnabled(
false);
406 void KCMRemoteControl::addUnconfiguredRemotes() {
409 if(!m_remoteList.
contains(remoteName)){
411 m_remoteList.append(remote);
420 addUnconfiguredRemotes();
428 if(!m_remoteList.isEmpty()){
429 kDebug() <<
"remotes found... checking for kded module";
431 kDebug() <<
"kded module not running";
433 KMessageBox::error(
this, i18n(
"The remote control daemon failed to load. Your remote controls will not work."), i18n(
"Failed to load daemon"));
438 KConfig config(QLatin1String(
"kremotecontrolrc" ));
439 KConfigGroup globalGroup = KConfigGroup(&config,
"Global");
440 ui.cbTrayIcon->setChecked(globalGroup.readEntry(
"ShowTrayIcon",
true));
444 m_remoteList.
saveToConfig(QLatin1String(
"kremotecontrolrc" ));
446 KConfig config(QLatin1String(
"kremotecontrolrc" ));
447 KConfigGroup globalGroup = KConfigGroup(&config,
"Global");
448 globalGroup.writeEntry(
"ShowTrayIcon", ui.cbTrayIcon->isChecked());
454 if(m_remoteList.isEmpty()){
461 void KCMRemoteControl::actionDropped(
Mode* mode) {
462 ui.tvRemotes->selectionModel()->setCurrentIndex(m_remoteModel->
find(mode), QItemSelectionModel::Rows | QItemSelectionModel::SelectCurrent);
467 #include "kcmremotecontrol.moc"
Action * action(const QModelIndex &index) const
Action * createAction(const QString &remote)
QVector< Action * > actions() const
Remote * remote(const QModelIndex &index) const
ProfileActionTemplate actionTemplateByButton(const QString &buttonName) const
static QStringList allRemoteNames()
Get the Names of the available remotes in the system.
void removeMode(Mode *mode)
Remove the given Mode from this Remote and delete it.
void moveActionUp(Action *action)
static DBusInterface * getInstance()
void removeAction(Action *action)
Remove the given action from this mode and delete it.
void moveActionDown(Action *action)
bool contains(const QString &remoteName) const
void refresh(const RemoteList &remoteList)
virtual Action * clone() const =0
void reloadRemoteControlDaemon()
QVector< Mode * > allModes() const
void saveToConfig(const QString &configName)
Mode * mode(const QModelIndex &index) const
void loadFromConfig(const QString &configName)
bool isKdedModuleRunning()
KREMOTECONTROL_EXPORT Notifier * notifier()
QString buttonName() const
QModelIndex find(Mode *mode) const
QModelIndex find(Action *action) const
void addAction(Action *action)
Add the given Action to the Mode.
void moveModeUp(Mode *mode)
Mode * masterMode() const
bool unloadKdedModule()
Unloads the kremotecontrol kded module and sets autoLoading to false.
Profile * profile(const QString &profileId)
ProfileAction * createAction(const RemoteControlButton &button) const
#define KREMOTECONTROL_VERSION_STRING
void moveModeDown(Mode *mode)