summaryrefslogtreecommitdiffstats
path: root/xbmc/events/windows/GUIWindowEventLog.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/events/windows/GUIWindowEventLog.cpp')
-rw-r--r--xbmc/events/windows/GUIWindowEventLog.cpp307
1 files changed, 307 insertions, 0 deletions
diff --git a/xbmc/events/windows/GUIWindowEventLog.cpp b/xbmc/events/windows/GUIWindowEventLog.cpp
new file mode 100644
index 0000000..01ec4bb
--- /dev/null
+++ b/xbmc/events/windows/GUIWindowEventLog.cpp
@@ -0,0 +1,307 @@
+/*
+ * Copyright (C) 2015-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "GUIWindowEventLog.h"
+
+#include "FileItem.h"
+#include "GUIUserMessages.h"
+#include "ServiceBroker.h"
+#include "URL.h"
+#include "events/EventLog.h"
+#include "filesystem/EventsDirectory.h"
+#include "guilib/GUIWindowManager.h"
+#include "guilib/LocalizeStrings.h"
+#include "guilib/WindowIDs.h"
+#include "input/Key.h"
+#include "settings/Settings.h"
+#include "settings/SettingsComponent.h"
+#include "utils/StringUtils.h"
+#include "view/ViewStateSettings.h"
+
+#define CONTROL_BUTTON_CLEAR 20
+#define CONTROL_BUTTON_LEVEL 21
+#define CONTROL_BUTTON_LEVEL_ONLY 22
+
+CGUIWindowEventLog::CGUIWindowEventLog()
+ : CGUIMediaWindow(WINDOW_EVENT_LOG, "EventLog.xml")
+{ }
+
+CGUIWindowEventLog::~CGUIWindowEventLog() = default;
+
+bool CGUIWindowEventLog::OnMessage(CGUIMessage& message)
+{
+ switch (message.GetMessage())
+ {
+ case GUI_MSG_CLICKED:
+ {
+ int iControl = message.GetSenderId();
+
+ // check if we should clear all items
+ if (iControl == CONTROL_BUTTON_CLEAR)
+ {
+ auto eventLog = CServiceBroker::GetEventLog();
+ if (eventLog)
+ eventLog->Clear(CViewStateSettings::GetInstance().GetEventLevel(),
+ CViewStateSettings::GetInstance().ShowHigherEventLevels());
+
+ // refresh the list
+ Refresh(true);
+ return true;
+ }
+
+ // check if we should change the level
+ if (iControl == CONTROL_BUTTON_LEVEL)
+ {
+ // update the event level
+ CViewStateSettings::GetInstance().CycleEventLevel();
+ CServiceBroker::GetSettingsComponent()->GetSettings()->Save();
+
+ // update the listing
+ Refresh();
+ return true;
+ }
+
+ // check if we should change the level
+ if (iControl == CONTROL_BUTTON_LEVEL_ONLY)
+ {
+ // update whether to show higher event levels
+ CViewStateSettings::GetInstance().ToggleShowHigherEventLevels();
+ CServiceBroker::GetSettingsComponent()->GetSettings()->Save();
+
+ // update the listing
+ Refresh();
+ return true;
+ }
+
+ // check if the user interacted with one of the events
+ if (m_viewControl.HasControl(iControl))
+ {
+ // get selected item
+ int itemIndex = m_viewControl.GetSelectedItem();
+ if (itemIndex < 0 || itemIndex >= m_vecItems->Size())
+ break;
+
+ CFileItemPtr item = m_vecItems->Get(itemIndex);
+ int actionId = message.GetParam1();
+
+ if (actionId == ACTION_DELETE_ITEM)
+ return OnDelete(item);
+ }
+
+ break;
+ }
+
+ case GUI_MSG_NOTIFY_ALL:
+ {
+ CFileItemPtr item = std::dynamic_pointer_cast<CFileItem>(message.GetItem());
+ if (item == nullptr)
+ break;
+
+ switch (message.GetParam1())
+ {
+ case GUI_MSG_EVENT_ADDED:
+ OnEventAdded(item);
+ return true;
+
+ case GUI_MSG_EVENT_REMOVED:
+ OnEventRemoved(item);
+ return true;
+
+ default:
+ break;
+ }
+ }
+
+ default:
+ break;
+ }
+
+ return CGUIMediaWindow::OnMessage(message);
+}
+
+bool CGUIWindowEventLog::OnSelect(int item)
+{
+ if (item < 0 || item >= m_vecItems->Size())
+ return false;
+
+ return OnSelect(m_vecItems->Get(item));
+}
+
+void CGUIWindowEventLog::GetContextButtons(int itemNumber, CContextButtons &buttons)
+{
+ if (itemNumber < 0 && itemNumber >= m_vecItems->Size())
+ return;
+
+ CFileItemPtr item = m_vecItems->Get(itemNumber);
+ if (item == nullptr)
+ return;
+
+ std::string eventIdentifier = item->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString();
+ if (eventIdentifier.empty())
+ return;
+
+ auto eventLog = CServiceBroker::GetEventLog();
+ if (!eventLog)
+ return;
+
+ EventPtr eventPtr = eventLog->Get(eventIdentifier);
+ if (eventPtr == nullptr)
+ return;
+
+ buttons.Add(CONTEXT_BUTTON_DELETE, g_localizeStrings.Get(1210));
+}
+
+bool CGUIWindowEventLog::OnContextButton(int itemNumber, CONTEXT_BUTTON button)
+{
+ if (itemNumber < 0 && itemNumber >= m_vecItems->Size())
+ return false;
+
+ CFileItemPtr item = m_vecItems->Get(itemNumber);
+ if (item == nullptr)
+ return false;
+
+ switch (button)
+ {
+ case CONTEXT_BUTTON_DELETE:
+ return OnDelete(item);
+
+ default:
+ break;
+ }
+
+ return CGUIMediaWindow::OnContextButton(itemNumber, button);
+}
+
+void CGUIWindowEventLog::UpdateButtons()
+{
+ // only enable the "clear" button if there is something to clear
+ CONTROL_ENABLE_ON_CONDITION(CONTROL_BUTTON_CLEAR, m_vecItems->GetObjectCount() > 0);
+
+ EventLevel eventLevel = CViewStateSettings::GetInstance().GetEventLevel();
+ // set the label of the "level" button
+ SET_CONTROL_LABEL(CONTROL_BUTTON_LEVEL,
+ StringUtils::Format(g_localizeStrings.Get(14119),
+ g_localizeStrings.Get(14115 + (int)eventLevel)));
+
+ // set the label, value and enabled state of the "level only" button
+ SET_CONTROL_LABEL(CONTROL_BUTTON_LEVEL_ONLY, 14120);
+ SET_CONTROL_SELECTED(GetID(), CONTROL_BUTTON_LEVEL_ONLY, CViewStateSettings::GetInstance().ShowHigherEventLevels());
+ CONTROL_ENABLE_ON_CONDITION(CONTROL_BUTTON_LEVEL_ONLY, eventLevel < EventLevel::Error);
+
+ CGUIMediaWindow::UpdateButtons();
+}
+
+bool CGUIWindowEventLog::GetDirectory(const std::string &strDirectory, CFileItemList &items)
+{
+ bool result = CGUIMediaWindow::GetDirectory(strDirectory, items);
+
+ EventLevel currentLevel = CViewStateSettings::GetInstance().GetEventLevel();
+ bool showHigherLevels = CViewStateSettings::GetInstance().ShowHigherEventLevels();
+
+ CFileItemList filteredItems(items.GetPath());
+ for (int i = 0; i < items.Size(); i++)
+ {
+ CFileItemPtr item = items.Get(i);
+ if (item->IsParentFolder())
+ {
+ filteredItems.Add(item);
+ continue;
+ }
+
+ if (!item->HasProperty(PROPERTY_EVENT_LEVEL))
+ continue;
+
+ EventLevel level = CEventLog::EventLevelFromString(item->GetProperty(PROPERTY_EVENT_LEVEL).asString());
+ if (level == currentLevel ||
+ (level > currentLevel && showHigherLevels))
+ filteredItems.Add(item);
+ }
+
+ items.ClearItems();
+ items.Append(filteredItems);
+
+ return result;
+}
+
+bool CGUIWindowEventLog::OnSelect(const CFileItemPtr& item)
+{
+ if (item == nullptr)
+ return false;
+
+ OnExecute(item);
+ return true;
+}
+
+bool CGUIWindowEventLog::OnDelete(const CFileItemPtr& item)
+{
+ if (item == nullptr)
+ return false;
+
+ std::string eventIdentifier = item->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString();
+ if (eventIdentifier.empty())
+ return false;
+
+ auto eventLog = CServiceBroker::GetEventLog();
+ if (!eventLog)
+ return false;
+
+ eventLog->Remove(eventIdentifier);
+ return true;
+}
+
+bool CGUIWindowEventLog::OnExecute(const CFileItemPtr& item)
+{
+ if (item == nullptr)
+ return false;
+
+ std::string eventIdentifier = item->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString();
+ if (eventIdentifier.empty())
+ return false;
+
+ auto eventLog = CServiceBroker::GetEventLog();
+ if (!eventLog)
+ return false;
+
+ const EventPtr eventPtr = eventLog->Get(eventIdentifier);
+ if (eventPtr == nullptr)
+ return false;
+
+ if (!eventPtr->CanExecute())
+ return true;
+
+ return eventPtr->Execute();
+}
+
+void CGUIWindowEventLog::OnEventAdded(const CFileItemPtr& item)
+{
+ if (!IsActive())
+ return;
+
+ Refresh(true);
+}
+
+void CGUIWindowEventLog::OnEventRemoved(const CFileItemPtr& item)
+{
+ if (!IsActive())
+ return;
+
+ int selectedItemIndex = -1;
+ if (item != nullptr)
+ {
+ selectedItemIndex = m_viewControl.GetSelectedItem();
+ // only update the selected item index when the deleted item is focused
+ if (m_vecItems->Get(selectedItemIndex)->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString() != item->GetProperty(PROPERTY_EVENT_IDENTIFIER).asString())
+ selectedItemIndex = -1;
+ }
+
+ Refresh(true);
+
+ // update the selected item
+ if (selectedItemIndex >= 0)
+ m_viewControl.SetSelectedItem(selectedItemIndex);
+}