void IconSaveBrowser::Update(GuiTrigger * t)
{
	if(state == STATE_DISABLED || !t || !triggerupdate)
		return;

	if(!browser->GetSaveListCount())
	{
		for(int i = 0; i < (int)Buttons.size() && listChanged; i++)
			SetButton(i, "", false, 0, 0);
		
		listChanged = false;
		return;
	}
	
	if (oldSelectedItem != selectedItem)
	{
		SelectTimer.reset();
		oldSelectedItem = selectedItem;
	}
	
	scrollbar->Update(t);

	if(scrollbar->ListChanged())
	{
		selectedItem = scrollbar->GetSelectedItem();
		browser->SetPageIndex(scrollbar->GetSelectedIndex());
		listChanged = true;
	}

	if(browser)
		browser->UpdateMarker(t);

	if(t->Right())
	{
		if(browser->GetPageIndex() + selectedItem + 1 < browser->GetSaveListCount())
		{
			if(selectedItem == PageSize-1)
			{
				// move list down by 1
				browser->SetPageIndex(browser->GetPageIndex()+RowSize);
				Buttons[selectedItem]->ResetState();
				selectedItem = PageSize-RowSize;
				Buttons[selectedItem]->SetState(STATE_SELECTED, t->chan);
				listChanged = true;
			}
			else if(Buttons[selectedItem+1]->IsVisible())
			{
				Buttons[selectedItem]->ResetState();
				Buttons[++selectedItem]->SetState(STATE_SELECTED, t->chan);
			}
		}
	}
	else if(t->Left())
	{
		if(selectedItem == 0 &&	 browser->GetPageIndex() + selectedItem > 0)
		{
			// move list up by 1
			browser->SetPageIndex(browser->GetPageIndex()-RowSize);
			Buttons[selectedItem]->ResetState();
			selectedItem = RowSize-1;
			Buttons[selectedItem]->SetState(STATE_SELECTED, t->chan);
			listChanged = true;
		}
		else if(selectedItem > 0)
		{
			Buttons[selectedItem]->ResetState();
			Buttons[--selectedItem]->SetState(STATE_SELECTED, t->chan);
		}
	}
	else if(t->Up())
	{
		if(browser->GetPageIndex() + selectedItem - RowSize >= 0)
		{
			Buttons[selectedItem]->ResetState();
			selectedItem = selectedItem-RowSize;
			if(selectedItem < 0)
			{
				// move list up by 1
				browser->SetPageIndex(browser->GetPageIndex()-RowSize);
				selectedItem = selectedItem+RowSize;
				oldSelectedItem = -1;
			}
			Buttons[selectedItem]->SetState(STATE_SELECTED, t->chan);
			listChanged = true;
		}
	}
	else if(t->Down())
	{
		int i = RowSize;
		while(browser->GetPageIndex()+selectedItem+RowSize >= browser->GetSaveListCount() &&
			  i > 0 && selectedItem > 0 && RowSize < browser->GetSaveListCount())
		{
			--i;
			--selectedItem;
		}
		if(browser->GetPageIndex() + selectedItem + RowSize < browser->GetSaveListCount())
		{
			Buttons[selectedItem]->ResetState();
			selectedItem = selectedItem+RowSize;
			if(selectedItem >= PageSize)
			{
				// move list down by 1
				browser->SetPageIndex(browser->GetPageIndex()+RowSize);
				selectedItem = selectedItem-RowSize;
				oldSelectedItem = -1;
			}
			Buttons[selectedItem]->SetState(STATE_SELECTED, t->chan);
			listChanged = true;
		}
	}

	//endNavigation:
	if(numEntries != browser->GetSaveListCount())
	{
		numEntries = browser->GetSaveListCount();
		scrollbar->SetEntrieCount(numEntries);
		listChanged = true;
	}

	u16 x = 12, y = 0;

	for(int i = 0; i < PageSize; i++)
	{
		while(listChanged && browser->IsGettingList())
			usleep(100);
		
		if(listChanged)
		{
			if(browser->GetPageIndex()+i < browser->GetSaveListCount())
			{
				std::string name = browser->GetItemSaveName(browser->GetPageIndex()+i);
				
				SetButton(i, name, true, x, y);
			}
			else
			{
				SetButton(i, "", false, 0, 0);
			}
			x += 90;
			if(x >= (u32) width-80)
			{
				x = 12;
				y += 90;
			}
		}

		if(i != selectedItem && Buttons[i]->GetState() == STATE_SELECTED)
			Buttons[i]->ResetState();
		else if(i == selectedItem && Buttons[i]->GetState() == STATE_DEFAULT)
			Buttons[selectedItem]->SetState(STATE_SELECTED, t->chan);

		int currChan = t->chan;

		if(t->wpad.ir.valid && !Buttons[i]->IsInside(t->wpad.ir.x, t->wpad.ir.y))
			t->chan = -1;

		Buttons[i]->Update(t);
		t->chan = currChan;

		if(Buttons[i]->GetState() == STATE_CLICKED)
		{
			browser->SetSelectedIndex(browser->GetPageIndex() + i);
			state = STATE_CLICKED;
		}
		
		if(Buttons[i]->GetState() == STATE_SELECTED)
		{
			selectedItem = i;
			browser->SetSelectedIndex(browser->GetPageIndex() + i);
			Tooltip[i]->SetState(STATE_DEFAULT);
		}
		else
		{
			Tooltip[i]->SetState(STATE_DISABLED);
		}

		ItemMarker * IMarker = browser->GetItemMarker();
		int itemCount = IMarker->GetItemcount();

		for(int n = 0; n < itemCount; n++)
		{
			if(browser->GetPageIndex() + i == IMarker->GetItemIndex(n))
			{
				Buttons[i]->SetState(STATE_SELECTED);
			}
		}
	}

	scrollbar->SetPageSize(PageSize);
	scrollbar->SetRowSize(RowSize);
	scrollbar->SetSelectedItem(selectedItem);
	scrollbar->SetSelectedIndex(browser->GetPageIndex());

	listChanged = false;
}
Пример #2
0
void Explorer::ProcessArcChoice(int choice, const char * destCandidat)
{
	ArchiveBrowser * browser = (ArchiveBrowser *) curBrowser;
	if(!browser)
		return;

	if(choice == ArcPasteItems)
	{
		int ret = WindowPrompt(tr("Paste the item(s) into this directory?"), Clipboard::Instance()->GetItemName(Clipboard::Instance()->GetItemcount()-1), tr("Yes"), tr("Cancel"));
		if(ret <= 0)
			return;

		PackTask *task = new PackTask(Clipboard::Instance(), browser->GetCurrentPath(), browser->GetArchive(), Settings.CompressionLevel);
		task->TaskEnd.connect(this, &Explorer::OnFinishedTask);
		this->explorerTasks++;
		Taskbar::Instance()->AddTask(task);
		ThreadedTaskHandler::Instance()->AddTask(task);

		Clipboard::Instance()->Reset();
	}

	else if(choice == ArcExtractFile)
	{
		int ret = WindowPrompt(tr("Extract the selected item(s)?"), browser->GetCurrentName(), tr("Yes"), tr("Cancel"));
		if(ret <= 0)
			return;

		char dest[MAXPATHLEN];
		snprintf(dest, sizeof(dest), "%s", destCandidat);

		int result = OnScreenKeyboard(dest, sizeof(dest));
		if(result)
		{
			//append selected Item
			browser->MarkCurrentItem();
			//Get ItemMarker
			ItemMarker * IMarker = browser->GetItemMarker();
			//switch between browser index and archive file index
			for(int i = 0; i < IMarker->GetItemcount(); i++)
				IMarker->GetItem(i)->itemindex = browser->GetItemStructure(IMarker->GetItem(i)->itemindex)->fileindex;

			UnpackTask *task = new UnpackTask(IMarker, dest, browser->GetArchive(), false);
			task->TaskEnd.connect(this, &Explorer::OnFinishedTask);
			this->explorerTasks++;
			Taskbar::Instance()->AddTask(task);
			ThreadedTaskHandler::Instance()->AddTask(task);

			IMarker->Reset();
		}
	}
	else if(choice == ArcExtractAll)
	{
		int ret = WindowPrompt(tr("Extract full archive?"), 0, tr("Yes"), tr("Cancel"));
		if(ret <= 0)
			return;

		char dest[MAXPATHLEN];
		snprintf(dest, sizeof(dest), "%s", destCandidat);
		if(dest[strlen(dest)-1] != '/')
			strcat(dest, "/");

		strncat(dest, browser->GetArchiveName(), sizeof(dest));

		char * ext = strrchr(dest, '.');
		if(ext)
			ext[0] = 0;
		strcat(dest, "/");

		int result = OnScreenKeyboard(dest, sizeof(dest));
		if(result)
		{
			UnpackTask *task = new UnpackTask(browser->GetItemMarker(), dest, browser->GetArchive(), true);
			task->TaskEnd.connect(this, &Explorer::OnFinishedTask);
			this->explorerTasks++;
			Taskbar::Instance()->AddTask(task);
			ThreadedTaskHandler::Instance()->AddTask(task);

			browser->GetItemMarker()->Reset();
		}
	}
	else if(choice == ArcProperties)
	{
		browser->MarkCurrentItem();
		ItemMarker * Marker = browser->GetItemMarker();

		ArchiveProperties * Prompt = new ArchiveProperties(browser->GetArchive(), Marker);
		Prompt->SetAlignment(ALIGN_CENTER | ALIGN_MIDDLE);
		Prompt->DimBackground(true);
		Application::Instance()->SetUpdateOnly(Prompt);
		Application::Instance()->Append(Prompt);

		Marker->Reset();
	}
}
void ListEmuBrowser::Update(GuiTrigger * t)
{
	if(state == STATE_DISABLED || !t || !triggerupdate)
		return;

	if(!browser->GetEmuListCount())
	{
		for(int i = 0; i < (int)saveBtn.size() && listChanged; i++)
			SetButton(i, "", false);
		
		if(infosWindow)
			infosWindow->SetVisible(false);
		listChanged = false;
		return;
	}
	
	if(infosWindow && !infosWindow->IsVisible())
		infosWindow->SetVisible(true);
	
	scrollbar->Update(t);

	if(scrollbar->ListChanged())
	{
		selectedItem = scrollbar->GetSelectedItem();
		browser->SetPageIndex(scrollbar->GetSelectedIndex());
		listChanged = true;
	}

	if(browser)
		browser->UpdateMarker(t);
	
	SetSelectedInfos();

	if(t->Right())
	{
		if(browser->GetPageIndex() < browser->GetEmuListCount() && browser->GetEmuListCount() > PAGESIZE)
		{
			int pageIndex = browser->GetPageIndex() + PAGESIZE;
			if(pageIndex+PAGESIZE >= browser->GetEmuListCount())
				pageIndex = browser->GetEmuListCount()-PAGESIZE;
			browser->SetPageIndex(pageIndex);
			listChanged = true;
		}
	}
	else if(t->Left())
	{
		if(browser->GetPageIndex() > 0)
		{
			int pageIndex = browser->GetPageIndex() - PAGESIZE;
			if(pageIndex < 0)
				pageIndex = 0;
			browser->SetPageIndex(pageIndex);
			listChanged = true;
		}
	}
	else if(t->Down())
	{
		if(browser->GetPageIndex() + selectedItem + 1 < browser->GetEmuListCount())
		{
			if(selectedItem == (int) saveBtn.size()-1)
			{
				//! move list down by 1
				browser->SetPageIndex(browser->GetPageIndex()+1);
				listChanged = true;
			}
			else if((int) saveBtn.size() > selectedItem+1 && saveBtn[selectedItem+1]->IsVisible())
			{
				saveBtn[selectedItem]->ResetState();
				saveBtn[++selectedItem]->SetState(STATE_SELECTED, t->chan);
			}
		}
	}
	else if(t->Up())
	{
		if(selectedItem == 0 &&	 browser->GetPageIndex() + selectedItem > 0)
		{
			//! move list up by 1
			browser->SetPageIndex(browser->GetPageIndex()-1);
			listChanged = true;
		}
		else if((int) saveBtn.size() > selectedItem && selectedItem > 0)
		{
			saveBtn[selectedItem]->ResetState();
			saveBtn[--selectedItem]->SetState(STATE_SELECTED, t->chan);
		}
	}

	if(numEntries != browser->GetEmuListCount())
	{
		numEntries = browser->GetEmuListCount();
		scrollbar->SetEntrieCount(numEntries);
		listChanged = true;
	}

	for(int i = 0; i < PAGESIZE; i++)
	{
		while(listChanged && browser->IsGettingList())
			usleep(100);
		
		if(listChanged)
		{
			if(browser->GetPageIndex()+i < browser->GetEmuListCount())
			{
				std::string  name = browser->GetItemEmuName(browser->GetPageIndex()+i);
				
				SetButton(i, name, true);
			}
			else
				SetButton(i, "", false);
		}
		
		if(i != selectedItem && saveBtn[i]->GetState() == STATE_SELECTED)
			saveBtn[i]->ResetState();
		else if(i == selectedItem && saveBtn[i]->GetState() == STATE_DEFAULT)
			saveBtn[selectedItem]->SetState(STATE_SELECTED, -1);
		
		int currChan = t->chan;
		
		if(t->wpad.ir.valid && !saveBtn[i]->IsInside(t->wpad.ir.x, t->wpad.ir.y))
			t->chan = -1;
		
		saveBtn[i]->Update(t);
		t->chan = currChan;
		
		if(saveBtn[i]->GetState() == STATE_SELECTED)
		{
			selectedItem = i;
			browser->SetSelectedIndex(browser->GetPageIndex() + i);
		}
		
		if (saveBtn[i]->GetState() == STATE_CLICKED)
			state = STATE_CLICKED;
		
		ItemMarker * IMarker = browser->GetItemMarker();
		int itemCount = IMarker->GetItemcount();
		
		for(int n = 0; n < itemCount; n++)
		{
			if(browser->GetPageIndex() + i == IMarker->GetItemIndex(n))
				saveBtn[i]->SetState(STATE_SELECTED);
		}
	}

	scrollbar->SetPageSize(PAGESIZE);
	scrollbar->SetRowSize(0);
	scrollbar->SetSelectedItem(selectedItem);
	scrollbar->SetSelectedIndex(browser->GetPageIndex());

	listChanged = false;
}
Пример #4
0
void Explorer::ProcessChoice(int choice)
{
	FileBrowser * browser = (FileBrowser *) curBrowser;
	if(!browser)
		return;

	else if(browser->GetCurrentFilename() && strcmp(browser->GetCurrentFilename(),"..") != 0)
	{
		if(choice == CUT)
		{
			choice = WindowPrompt(browser->GetCurrentFilename(), tr("Cut current marked item(s)?"), tr("Yes"), tr("Cancel"));
			if(choice == 1)
			{
				Clipboard::Instance()->Reset();
				//append selected Item
				browser->MarkCurrentItem();
				//Get ItemMarker
				ItemMarker * IMarker = browser->GetItemMarker();

				for(int i = 0; i < IMarker->GetItemcount(); i++)
					Clipboard::Instance()->AddItem(IMarker->GetItem(i));

				IMarker->Reset();
				Clipboard::Instance()->Operation = OP_MOVE;
			}
		}

		else if(choice == COPY)
		{
			choice = WindowPrompt(browser->GetCurrentFilename(), tr("Copy current marked item(s)?"), tr("Yes"), tr("Cancel"));
			if(choice == 1)
			{
				Clipboard::Instance()->Reset();
				//append selected Item
				browser->MarkCurrentItem();
				//Get ItemMarker
				ItemMarker * IMarker = browser->GetItemMarker();

				for(int i = 0; i < IMarker->GetItemcount(); i++)
					Clipboard::Instance()->AddItem(IMarker->GetItem(i));

				IMarker->Reset();
				Clipboard::Instance()->Operation = OP_COPY;
			}
		}

		else if(choice == RENAME)
		{
			char srcpath[MAXPATHLEN];
			char destdir[MAXPATHLEN];
			snprintf(srcpath, sizeof(srcpath), "%s", browser->GetCurrentSelectedFilepath());
			char entered[151];
			snprintf(entered, sizeof(entered), "%s", browser->GetCurrentFilename());
			int result = OnScreenKeyboard(entered, 150);
			if(result == 1)
			{
				snprintf(destdir, sizeof(destdir), "%s/%s", browser->GetCurrentPath(), entered);
				if(!RenameFile(srcpath, destdir))
					WindowPrompt(tr("Failed renaming item"), tr("Name might already exists."), tr("OK"));
				//! Update browser
				guiBrowser->Refresh();
			}
		}

		else if(choice == DELETE)
		{
			char currentpath[MAXPATHLEN];
			snprintf(currentpath, sizeof(currentpath), "%s/", browser->GetCurrentSelectedFilepath());
			choice = WindowPrompt(browser->GetCurrentFilename(), tr("Delete the selected item(s) and its content?"), tr("Yes"), tr("Cancel"));
			if(choice == 1)
			{
				if(ProgressWindow::Instance()->IsRunning())
					choice = WindowPrompt(tr("Currently a process is running."), tr("Do you want to append this delete to the queue?"), tr("Yes"), tr("Cancel"));

				if(choice == 1)
				{
					//append selected Item
					browser->MarkCurrentItem();
					//Get ItemMarker
					ItemMarker * IMarker = browser->GetItemMarker();
					DeleteTask *task = new DeleteTask(IMarker);
					task->TaskEnd.connect(this, &Explorer::OnFinishedTask);
					this->explorerTasks++;
					Taskbar::Instance()->AddTask(task);
					ThreadedTaskHandler::Instance()->AddTask(task);
					IMarker->Reset();
				}
			}
		}
	}
	else if(choice >= 0 && choice != PASTE && choice != NEWFOLDER && choice != PROPERTIES)
		WindowPrompt(tr("You cant use this operation on:"), tr("Directory .."), tr("OK"));

	if(choice == PASTE)
	{
		choice = WindowPrompt(Clipboard::Instance()->GetItemName(Clipboard::Instance()->GetItemcount()-1), tr("Paste item(s) into current directory?"), tr("Yes"), tr("Cancel"));
		if(choice == 1)
		{
			if(ProgressWindow::Instance()->IsRunning())
				choice = WindowPrompt(tr("Currently a process is running."), tr("Do you want to append this paste to the queue?"), tr("Yes"), tr("Cancel"));

			if(choice == 1)
			{
				if(Clipboard::Instance()->Operation == OP_COPY)
				{
					CopyTask *task = new CopyTask(Clipboard::Instance(), browser->GetCurrentPath());
					task->TaskEnd.connect(this, &Explorer::OnFinishedTask);
					this->explorerTasks++;
					Taskbar::Instance()->AddTask(task);
					ThreadedTaskHandler::Instance()->AddTask(task);
				}
				else if(Clipboard::Instance()->Operation == OP_MOVE)
				{
					MoveTask *task = new MoveTask(Clipboard::Instance(), browser->GetCurrentPath());
					task->TaskEnd.connect(this, &Explorer::OnFinishedTask);
					this->explorerTasks++;
					Taskbar::Instance()->AddTask(task);
					ThreadedTaskHandler::Instance()->AddTask(task);
				}
			}
		}
	}

	else if(choice == ADDTOZIP)
	{
		int ret = WindowPrompt(browser->GetCurrentFilename(), tr("Would you like to add/append the selected item(s) to a zip?"), tr("Yes"), tr("No"));
		if(ret <= 0)
			return;

		char DestZipPath[MAXPATHLEN];
		snprintf(DestZipPath, sizeof(DestZipPath), "%s", browser->GetCurrentPath());
		if(DestZipPath[strlen(DestZipPath)-1] != '/')
			strncat(DestZipPath, "/", sizeof(DestZipPath));
		strncat(DestZipPath, tr("NewZip.zip"), sizeof(DestZipPath));

		if(!OnScreenKeyboard(DestZipPath, sizeof(DestZipPath)))
			return;

		std::string DestPath = DestZipPath;
		size_t pos = DestPath.rfind('/');
		if(pos != std::string::npos)
			DestPath.erase(pos);

		CreateSubfolder(DestPath.c_str());

		//append selected Item
		browser->MarkCurrentItem();
		//Get ItemMarker
		ItemMarker * IMarker = browser->GetItemMarker();

		ZipFile *Zip = new ZipFile(DestZipPath, CheckFile(DestZipPath) ? ZipFile::APPEND : ZipFile::CREATE);
		ArchiveHandle * archive = new ArchiveHandle(Zip);

		PackTask *task = new PackTask(IMarker, "", archive, Settings.CompressionLevel);
		task->TaskEnd.connect(this, &Explorer::OnFinishedTask);
		this->explorerTasks++;
		Taskbar::Instance()->AddTask(task);
		ThreadedTaskHandler::Instance()->AddTask(task);

		//! Update browser
		IMarker->Reset();
	}

	else if(choice == CHECK_MD5)
	{
		int md5Choice = 1;

		if(ProgressWindow::Instance()->IsRunning())
			md5Choice = WindowPrompt(tr("Currently a process is running."), tr("Do you want to append this process to the queue?"), tr("Yes"), tr("Cancel"));

		if(md5Choice == 1)
		{
			char LogPath[1024];
			snprintf(LogPath, sizeof(LogPath), "%s/MD5.log", browser->GetCurrentPath());

			browser->MarkCurrentItem();
			MD5Task *task = new MD5Task(browser->GetItemMarker(), LogPath);
			task->TaskEnd.connect(this, &Explorer::OnFinishedTask);
			this->explorerTasks++;
			Taskbar::Instance()->AddTask(task);
			ThreadedTaskHandler::Instance()->AddTask(task);
			browser->GetItemMarker()->Reset();
		}
	}

	else if(choice == NEWFOLDER)
	{
		char entered[151];
		snprintf(entered, sizeof(entered), tr("New Folder"));
		int result = OnScreenKeyboard(entered, 150);
		if(result == 1)
		{
			char currentpath[MAXPATHLEN];
			snprintf(currentpath, sizeof(currentpath), "%s/%s/", browser->GetCurrentPath(), entered);
			bool ret = CreateSubfolder(currentpath);
			if(ret == false)
				ShowError(tr("Unable to create folder."));

			//! Update browser
			guiBrowser->Refresh();
		}
	}
	else if(choice == PROPERTIES)
	{
		browser->MarkCurrentItem();
		ItemMarker * Marker = browser->GetItemMarker();
		Properties * Prompt = new Properties(Marker);
		Prompt->SetAlignment(ALIGN_CENTER | ALIGN_MIDDLE);
		Prompt->DimBackground(true);
		Application::Instance()->SetUpdateOnly(Prompt);
		Application::Instance()->Append(Prompt);
		Marker->Reset();
	}
}