#include "stdafx.h"
#include "guiwindowscripts.h"
#include "util.h"
#include "lib/libPython/XBPython.h"
#include "GUIWindowScriptsInfo.h"
#define CONTROL_BTNVIEWASICONS 2
#define CONTROL_BTNSORTBY 3
#define CONTROL_BTNSORTASC 4
#define CONTROL_LIST 50
#define CONTROL_THUMBS 51
#define CONTROL_LABELFILES 12
CGUIWindowScripts::CGUIWindowScripts()
: CGUIMediaWindow(WINDOW_SCRIPTS, "MyScripts.xml")
{
m_bViewOutput = false;
m_scriptSize = 0;
}
CGUIWindowScripts::~CGUIWindowScripts()
{
}
bool CGUIWindowScripts::OnAction(const CAction &action)
{
if (action.wID == ACTION_SHOW_INFO)
{
OnInfo();
return true;
}
return CGUIMediaWindow::OnAction(action);
}
bool CGUIWindowScripts::OnMessage(CGUIMessage& message)
{
switch ( message.GetMessage() )
{
case GUI_MSG_WINDOW_INIT:
{
if (m_vecItems.m_strPath == "?")
m_vecItems.m_strPath = "Q:\\scripts"; //g_stSettings.m_szDefaultScripts;
return CGUIMediaWindow::OnMessage(message);
}
break;
}
return CGUIMediaWindow::OnMessage(message);
}
bool CGUIWindowScripts::Update(const CStdString &strDirectory)
{
// Look if baseclass can handle it
if (!CGUIMediaWindow::Update(strDirectory))
return false;
/* check if any python scripts are running. If true, place "(Running)" after the item.
* since stopping a script can take up to 10 seconds or more,we display 'stopping'
* after the filename for now.
*/
int iSize = g_pythonParser.ScriptsSize();
for (int i = 0; i < iSize; i++)
{
int id = g_pythonParser.GetPythonScriptId(i);
if (g_pythonParser.isRunning(id))
{
const char* filename = g_pythonParser.getFileName(id);
for (int i = 0; i < m_vecItems.Size(); i++)
{
CFileItem* pItem = m_vecItems[i];
if (pItem->m_strPath == filename)
{
char tstr[1024];
strcpy(tstr, pItem->GetLabel());
if (g_pythonParser.isStopping(id))
strcat(tstr, " (Stopping)");
else
strcat(tstr, " (Running)");
pItem->SetLabel(tstr);
}
}
}
}
return true;
}
void CGUIWindowScripts::OnPrepareFileItems(CFileItemList &items)
{
items.SetProgramThumbs();
}
bool CGUIWindowScripts::OnPlayMedia(int iItem)
{
CFileItem* pItem=m_vecItems[iItem];
CStdString strPath = pItem->m_strPath;
/* execute script...
* if script is already running do not run it again but stop it.
*/
int id = g_pythonParser.getScriptId(strPath);
if (id != -1)
{
/* if we are here we already know that this script is running.
* But we will check it again to be sure :)
*/
if (g_pythonParser.isRunning(id))
{
g_pythonParser.stopScript(id);
// update items
int selectedItem = m_viewControl.GetSelectedItem();
Update(m_vecItems.m_strPath);
m_viewControl.SetSelectedItem(selectedItem);
return true;
}
}
g_pythonParser.evalFile(strPath);
return true;
}
void CGUIWindowScripts::OnInfo()
{
CGUIWindowScriptsInfo* pDlgInfo = (CGUIWindowScriptsInfo*)m_gWindowManager.GetWindow(WINDOW_SCRIPTS_INFO);
if (pDlgInfo) pDlgInfo->DoModal();
}
void CGUIWindowScripts::Render()
{
// update control_list / control_thumbs if one or more scripts have stopped / started
if (g_pythonParser.ScriptsSize() != m_scriptSize)
{
int selectedItem = m_viewControl.GetSelectedItem();
Update(m_vecItems.m_strPath);
m_viewControl.SetSelectedItem(selectedItem);
m_scriptSize = g_pythonParser.ScriptsSize();
}
CGUIWindow::Render();
}
bool CGUIWindowScripts::GetDirectory(const CStdString &strDirectory, CFileItemList &items)
{
if (!CGUIMediaWindow::GetDirectory(strDirectory, items))
return false;
if (items.IsVirtualDirectoryRoot())
return true;
OnFinalizeFileItems(items);
}
void CGUIWindowScripts::OnFinalizeFileItems(CFileItemList &items)
{
// flatten any folders
for (int i = 0; i < items.Size(); i++)
{
CFileItem *item = items[i];
if (item->m_bIsFolder && !item->IsParentFolder())
{ // folder item - let's check for a default.xbe file, and flatten if we have one
CStdString defaultPY;
CUtil::AddFileToFolder(item->m_strPath, "default.py", defaultPY);
if (CFile::Exists(defaultPY))
{ // yes, format the item up
item->m_strPath = defaultPY;
item->m_bIsFolder = false;
//CStdString strDescription;
//CUtil::GetDirectoryName(defaultPY, strDescription);
//if (!strDescription.IsEmpty())
// item->SetLabel(strDescription);
}
}
}
}