summaryrefslogtreecommitdiffstats
path: root/xbmc/dialogs/GUIDialogExtendedProgressBar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/dialogs/GUIDialogExtendedProgressBar.cpp')
-rw-r--r--xbmc/dialogs/GUIDialogExtendedProgressBar.cpp155
1 files changed, 155 insertions, 0 deletions
diff --git a/xbmc/dialogs/GUIDialogExtendedProgressBar.cpp b/xbmc/dialogs/GUIDialogExtendedProgressBar.cpp
new file mode 100644
index 0000000..9fc1c02
--- /dev/null
+++ b/xbmc/dialogs/GUIDialogExtendedProgressBar.cpp
@@ -0,0 +1,155 @@
+/*
+ * Copyright (C) 2012-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 "GUIDialogExtendedProgressBar.h"
+
+#include "guilib/GUIMessage.h"
+#include "guilib/GUIProgressControl.h"
+#include "utils/TimeUtils.h"
+
+#include <cmath>
+#include <mutex>
+
+#define CONTROL_LABELHEADER 30
+#define CONTROL_LABELTITLE 31
+#define CONTROL_PROGRESS 32
+
+#define ITEM_SWITCH_TIME_MS 2000
+
+std::string CGUIDialogProgressBarHandle::Text(void) const
+{
+ std::unique_lock<CCriticalSection> lock(m_critSection);
+ std::string retVal(m_strText);
+ return retVal;
+}
+
+void CGUIDialogProgressBarHandle::SetText(const std::string &strText)
+{
+ std::unique_lock<CCriticalSection> lock(m_critSection);
+ m_strText = strText;
+}
+
+void CGUIDialogProgressBarHandle::SetTitle(const std::string &strTitle)
+{
+ std::unique_lock<CCriticalSection> lock(m_critSection);
+ m_strTitle = strTitle;
+}
+
+void CGUIDialogProgressBarHandle::SetProgress(int currentItem, int itemCount)
+{
+ float fPercentage = (currentItem*100.0f)/itemCount;
+ if (!std::isnan(fPercentage))
+ m_fPercentage = std::min(100.0f, fPercentage);
+}
+
+CGUIDialogExtendedProgressBar::CGUIDialogExtendedProgressBar(void)
+ : CGUIDialog(WINDOW_DIALOG_EXT_PROGRESS, "DialogExtendedProgressBar.xml", DialogModalityType::MODELESS)
+{
+ m_loadType = LOAD_ON_GUI_INIT;
+ m_iLastSwitchTime = 0;
+ m_iCurrentItem = 0;
+}
+
+CGUIDialogProgressBarHandle *CGUIDialogExtendedProgressBar::GetHandle(const std::string &strTitle)
+{
+ CGUIDialogProgressBarHandle *handle = new CGUIDialogProgressBarHandle(strTitle);
+ {
+ std::unique_lock<CCriticalSection> lock(m_critSection);
+ m_handles.push_back(handle);
+ }
+
+ Open();
+
+ return handle;
+}
+
+bool CGUIDialogExtendedProgressBar::OnMessage(CGUIMessage& message)
+{
+ switch (message.GetMessage())
+ {
+ case GUI_MSG_WINDOW_INIT:
+ {
+ m_iLastSwitchTime = CTimeUtils::GetFrameTime();
+ m_iCurrentItem = 0;
+ CGUIDialog::OnMessage(message);
+
+ UpdateState(0);
+ return true;
+ }
+ break;
+ }
+
+ return CGUIDialog::OnMessage(message);
+}
+
+void CGUIDialogExtendedProgressBar::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
+{
+ if (m_active)
+ UpdateState(currentTime);
+
+ CGUIDialog::Process(currentTime, dirtyregions);
+}
+
+void CGUIDialogExtendedProgressBar::UpdateState(unsigned int currentTime)
+{
+ std::string strHeader;
+ std::string strTitle;
+ float fProgress(-1.0f);
+
+ {
+ std::unique_lock<CCriticalSection> lock(m_critSection);
+
+ // delete finished items
+ for (int iPtr = m_handles.size() - 1; iPtr >= 0; iPtr--)
+ {
+ if (m_handles.at(iPtr)->IsFinished())
+ {
+ delete m_handles.at(iPtr);
+ m_handles.erase(m_handles.begin() + iPtr);
+ }
+ }
+
+ if (!m_handles.size())
+ {
+ Close(false, 0, true, false);
+ return;
+ }
+
+ // ensure the current item is in our range
+ if (m_iCurrentItem >= m_handles.size())
+ m_iCurrentItem = m_handles.size() - 1;
+
+ // update the current item ptr
+ if (currentTime > m_iLastSwitchTime &&
+ currentTime - m_iLastSwitchTime >= ITEM_SWITCH_TIME_MS)
+ {
+ m_iLastSwitchTime = currentTime;
+
+ // select next item
+ if (++m_iCurrentItem > m_handles.size() - 1)
+ m_iCurrentItem = 0;
+ }
+
+ CGUIDialogProgressBarHandle *handle = m_handles.at(m_iCurrentItem);
+ if (handle)
+ {
+ strTitle = handle->Text();
+ strHeader = handle->Title();
+ fProgress = handle->Percentage();
+ }
+ }
+
+ SET_CONTROL_LABEL(CONTROL_LABELHEADER, strHeader);
+ SET_CONTROL_LABEL(CONTROL_LABELTITLE, strTitle);
+
+ if (fProgress > -1.0f)
+ {
+ SET_CONTROL_VISIBLE(CONTROL_PROGRESS);
+ CONTROL_SELECT_ITEM(CONTROL_PROGRESS, (unsigned int)fProgress);
+ }
+}