4 Коммиты 536dc682db ... 5ca416898f

Автор SHA1 Сообщение Дата
  Thomas Edvalson 5ca416898f Fix bug of Config saving after needed references are destroyed 8 лет назад
  Thomas Edvalson 5b752accd1 Add Music page to settings and copy eShop BGM to subdir 8 лет назад
  Thomas Edvalson d25694c6a1 Update latest cpp3ds API 8 лет назад
  Thomas Edvalson e6d5f52bbc Add fmtlib for new cpp3ds and use -O3 8 лет назад

+ 3 - 3
CMakeLists.txt

@@ -101,12 +101,12 @@ FILE(GLOB_RECURSE SHADER_FILES ${PROJECT_SOURCE_DIR}/res/romfs/shaders/[^.]*.vsh
 ##################################################
 # Don't usually need to change anything below
 ##################################################
-set(CPP3DS_ARM_FLAGS "-O2 -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft")
+set(CPP3DS_ARM_FLAGS "-g -O3 -march=armv6k -mtune=mpcore -mfloat-abi=hard -mtp=soft")
 set(CPP3DS_EMU_FLAGS "-O0")
 set(TEST_FLAGS "-O0 -coverage")
 
-set(CPP3DS_ARM_LIBS cpp3ds-window cpp3ds-network cpp3ds-graphics cpp3ds-audio cpp3ds-system citro3d ctru freetype png z vorbisidec ogg archive)
-set(CPP3DS_EMU_LIBS cpp3ds-emu sfml-graphics sfml-window sfml-system sfml-audio openal GLEW GL jpeg freetype vorbisfile vorbis ogg ssl crypto pthread archive)
+set(CPP3DS_ARM_LIBS cpp3ds-window cpp3ds-network cpp3ds-graphics cpp3ds-audio cpp3ds-system citro3d ctru freetype png z vorbisidec ogg archive faad fmt)
+set(CPP3DS_EMU_LIBS cpp3ds-emu sfml-graphics sfml-window sfml-system sfml-audio openal GLEW GL jpeg freetype vorbisfile vorbis ogg ssl crypto pthread archive faad fmt)
 
 add_subdirectory(${CPP3DS}/cmake/template_arm build/arm)
 if(BUILD_EMULATOR)

+ 1 - 1
src/AppList.cpp

@@ -165,7 +165,7 @@ void AppList::processKeyRepeat()
 			newIndex = getVisibleCount() - 1;
 
 		if (newIndex != index)
-			m_soundBlip.play(1);
+			m_soundBlip.play();
 
 		setSelectedIndex(newIndex);
 		m_clockKeyRepeat.restart();

+ 7 - 0
src/Config.cpp

@@ -30,6 +30,9 @@ namespace {
 		"play_sound_after_download",
 		"power_off_after_download",
 		"power_off_time",
+		// Music
+		"music_mode",
+		"music_filename",
 		// Other
 		"sleep_mode",
 		"language",
@@ -117,6 +120,10 @@ void Config::loadDefaults()
 	ADD_DEFAULT(PowerOffAfterDownload, false);
 	ADD_DEFAULT(PowerOffTime, 120);
 
+	// Music
+	ADD_DEFAULT(MusicMode, "eshop");
+	ADD_DEFAULT(MusicFilename, "");
+
 	// Other
 	ADD_DEFAULT(SleepMode, true);
 	ADD_DEFAULT(Language, "auto");

+ 3 - 0
src/Config.hpp

@@ -36,6 +36,9 @@ public:
 		PlaySoundAfterDownload,
 		PowerOffAfterDownload,
 		PowerOffTime,
+		// Music
+		MusicMode,
+		MusicFilename,
 		// Other
 		SleepMode,
 		Language,

+ 1 - 1
src/DownloadQueue.cpp

@@ -300,7 +300,7 @@ void DownloadQueue::addDownload(std::shared_ptr<AppItem> app, cpp3ds::Uint64 tit
 		// Play sound if queue is finished
 		if (getActiveCount() == 0 && !canceled)
 			if (Config::get(Config::PlaySoundAfterDownload).GetBool())
-				m_soundFinish.play(3);
+				m_soundFinish.play();
 
 		if (callback)
 			callback(succeeded);

+ 0 - 1
src/FreeShop.cpp

@@ -102,7 +102,6 @@ FreeShop::FreeShop()
 FreeShop::~FreeShop()
 {
 	delete m_stateStack;
-	Config::saveToFile();
 
 #ifdef _3DS
 	if (g_requestJump != 0)

+ 107 - 3
src/GUI/Settings.cpp

@@ -4,6 +4,8 @@
 #include <unistd.h>
 #include <cpp3ds/System/FileSystem.hpp>
 #include <cmath>
+#include <dirent.h>
+#include <stdlib.h>
 #include "Settings.hpp"
 #include "../Download.hpp"
 #include "../Util.hpp"
@@ -48,13 +50,13 @@ Settings::Settings(Gwen::Skin::TexturedBase *skin,  State *state)
 	m_buttonFilterSave = new Button(page);
 	m_buttonFilterSave->SetFont(L"fonts/fontawesome.ttf", 18, false);
 	m_buttonFilterSave->SetText("\uf0c7"); // Save floppy icon
-	m_buttonFilterSave->SetBounds(4, 140, 22, 22);
+	m_buttonFilterSave->SetBounds(0, 140, 22, 22);
 	m_buttonFilterSave->SetPadding(Gwen::Padding(0, 0, 0, 3));
 	m_buttonFilterSave->onPress.Add(this, &Settings::filterSaveClicked);
 	m_buttonFilterSaveClear = new Button(page);
 	m_buttonFilterSaveClear->SetFont(L"fonts/fontawesome.ttf", 18, false);
 	m_buttonFilterSaveClear->SetText("\uf014"); // Trash can icon
-	m_buttonFilterSaveClear->SetBounds(32, 140, 22, 22);
+	m_buttonFilterSaveClear->SetBounds(26, 140, 22, 22);
 	m_buttonFilterSaveClear->SetPadding(Gwen::Padding(0, 0, 0, 3));
 	m_buttonFilterSaveClear->onPress.Add(this, &Settings::filterClearClicked);
 
@@ -78,6 +80,9 @@ Settings::Settings(Gwen::Skin::TexturedBase *skin,  State *state)
 	page = m_tabControl->AddPage(_("Download").toAnsiString())->GetPage();
 	fillDownloadPage(page);
 
+	page = m_tabControl->AddPage(_("Music").toAnsiString())->GetPage();
+	fillMusicPage(page);
+
 	page = m_tabControl->AddPage(_("Other").toAnsiString())->GetPage();
 	fillOtherPage(page);
 
@@ -143,12 +148,19 @@ void Settings::saveToConfig()
 	}
 	Config::set(Config::KeyURLs, list);
 
+	// Download
 	Config::set(Config::DownloadTimeout, m_sliderTimeout->GetFloatValue());
 	Config::set(Config::DownloadBufferSize, static_cast<size_t>(std::ceil(m_sliderDownloadBufferSize->GetFloatValue())));
 	Config::set(Config::PlaySoundAfterDownload, m_checkboxPlaySound->Checkbox()->IsChecked());
 	Config::set(Config::PowerOffAfterDownload, m_checkboxPowerOff->Checkbox()->IsChecked());
 	Config::set(Config::PowerOffTime, static_cast<int>(strtol(m_comboPowerOffTime->GetSelectedItem()->GetName().c_str(), nullptr, 10)));
 
+	// Music
+	Config::set(Config::MusicMode, m_comboMusicMode->GetSelectedItem()->GetName().c_str());
+	auto selectedMusic = m_listboxMusicFiles->GetSelectedRow();
+	Config::set(Config::MusicFilename, selectedMusic ? selectedMusic->GetText(0).c_str() : "");
+
+	// Other
 	Config::set(Config::SleepMode, m_checkboxSleep->Checkbox()->IsChecked());
 	auto language = m_listboxLanguages->GetSelectedRow();
 	Config::set(Config::Language, language ? language->GetName().c_str() : "auto");
@@ -193,10 +205,20 @@ void Settings::loadConfig()
 	downloadTimeoutChanged(m_sliderTimeout);
 	downloadBufferSizeChanged(m_sliderDownloadBufferSize);
 
+	// Music
+	auto musicFileRows = m_listboxMusicFiles->GetChildren().front()->GetChildren();
+	for (auto& row : musicFileRows)
+		if (gwen_cast<Layout::TableRow>(row)->GetText(0) == Config::get(Config::MusicFilename).GetString())
+		{
+			m_listboxMusicFiles->SetSelectedRow(row, true);
+			break;
+		}
+	m_comboMusicMode->SelectItemByName(Config::get(Config::MusicMode).GetString());
+
 	// Other
 	m_checkboxSleep->Checkbox()->SetChecked(Config::get(Config::SleepMode).GetBool());
 	auto languageRows = m_listboxLanguages->GetChildren().front()->GetChildren();
-	for (auto row : languageRows)
+	for (auto& row : languageRows)
 		if (row->GetName() == Config::get(Config::Language).GetString())
 		{
 			m_listboxLanguages->SetSelectedRow(row, true);
@@ -756,6 +778,43 @@ void Settings::downloadBufferSizeChanged(Gwen::Controls::Base *base)
 	m_labelDownloadBufferSize->SetText(_("Buffer size: %u KB", static_cast<size_t>(std::ceil(slider->GetFloatValue()))).toAnsiString());
 }
 
+void Settings::fillMusicPage(Gwen::Controls::Base *page)
+{
+	m_comboMusicMode = new ComboBox(page);
+	m_comboMusicMode->Dock(Gwen::Pos::Top);
+
+	m_comboMusicMode->AddItem(_("Disable music"), "disable");
+	m_comboMusicMode->AddItem(_("Play eShop music"), "eshop");
+	m_comboMusicMode->AddItem(_("Play random track"), "random");
+	m_comboMusicMode->AddItem(_("Play selected track"), "selected");
+
+	m_listboxMusicFiles = new ListBox(page);
+	m_listboxMusicFiles->Dock(Gwen::Pos::Fill);
+
+	m_comboMusicMode->onSelection.Add(this, &Settings::musicComboChanged);
+	m_listboxMusicFiles->onRowSelected.Add(this, &Settings::musicFileChanged);
+
+	// Fill listbox with files from /music/ subdir
+	DIR *dir;
+	struct stat sb;
+	struct dirent *ent;
+	if (dir = opendir(cpp3ds::FileSystem::getFilePath(FREESHOP_DIR "/music").c_str()))
+	{
+		while (ent = readdir(dir))
+		{
+			std::string filename = ent->d_name;
+			std::string path = cpp3ds::FileSystem::getFilePath(FREESHOP_DIR "/music/") + filename;
+
+			if (filename == "." || filename == "..")
+				continue;
+
+			if (stat(path.c_str(), &sb) == 0 && S_ISREG(sb.st_mode))
+				m_listboxMusicFiles->AddItem(filename);
+		}
+		closedir (dir);
+	}
+}
+
 void Settings::fillOtherPage(Gwen::Controls::Base *page)
 {
 	auto label = new Label(page);
@@ -939,6 +998,51 @@ void Settings::updateSorting(Gwen::Controls::Base *control)
 	AppList::getInstance().setSortType(sortType, isAscending);
 }
 
+void Settings::musicComboChanged(Gwen::Controls::Base *combobox)
+{
+	std::string mode = m_comboMusicMode->GetSelectedItem()->GetName();
+	if (mode == "disable")
+		g_browseState->stopBGM();
+	else if (mode == "eshop")
+		g_browseState->playBGMeShop();
+	else if (mode == "random")
+		selectRandomMusicTrack();
+	else // selected
+		playSelectedMusic();
+}
+
+void Settings::musicFileChanged(Gwen::Controls::Base *base)
+{
+	std::string mode = m_comboMusicMode->GetSelectedItem()->GetName();
+	if (mode == "selected" || mode == "random")
+		playSelectedMusic();
+}
+
+void Settings::selectRandomMusicTrack()
+{
+	auto& musicRows = m_listboxMusicFiles->GetChildren().front()->GetChildren();
+	if (musicRows.size() > 0)
+	{
+		int randIndex = std::rand() % musicRows.size();
+		int i = 0;
+		for (auto it = musicRows.begin(); it != musicRows.end(); ++it, ++i)
+			if (i == randIndex)
+			{
+				m_listboxMusicFiles->SetSelectedRow(*it, true);
+				break;
+			}
+	}
+}
+
+void Settings::playSelectedMusic()
+{
+	if (!m_listboxMusicFiles->GetSelectedRow())
+		return;
+	std::string filename = m_listboxMusicFiles->GetSelectedRow()->GetText(0).c_str();
+	std::string path = FREESHOP_DIR "/music/" + filename;
+	g_browseState->playBGM(path);
+}
+
 void Settings::showNews(Gwen::Controls::Base *base)
 {
 	Config::set(Config::ShowNews, true);

+ 10 - 0
src/GUI/Settings.hpp

@@ -50,6 +50,7 @@ namespace FreeShop
 			void fillSortPage(Gwen::Controls::Base *page);
 			void fillUpdatePage(Gwen::Controls::Base *page);
 			void fillDownloadPage(Gwen::Controls::Base *page);
+			void fillMusicPage(Gwen::Controls::Base *page);
 			void fillOtherPage(Gwen::Controls::Base *page);
 
 			// Event Callback functions
@@ -77,6 +78,11 @@ namespace FreeShop
 			void updateEnabledState(Gwen::Controls::Base* control);
 			void updateSorting(Gwen::Controls::Base* control);
 
+			void musicComboChanged(Gwen::Controls::Base *combobox);
+			void musicFileChanged(Gwen::Controls::Base* base);
+			void selectRandomMusicTrack();
+			void playSelectedMusic();
+
 			void showNews(Gwen::Controls::Base* base);
 			void languageChange(Gwen::Controls::Base* base);
 
@@ -119,6 +125,10 @@ namespace FreeShop
 			Gwen::Controls::CheckBoxWithLabel *m_checkboxPowerOff;
 			Gwen::Controls::ComboBox *m_comboPowerOffTime;
 
+			// Music
+			Gwen::Controls::ComboBox *m_comboMusicMode;
+			Gwen::Controls::ListBox *m_listboxMusicFiles;
+
 			// Other
 			Gwen::Controls::CheckBoxWithLabel *m_checkboxSleep;
 			Gwen::Controls::ListBox *m_listboxLanguages;

+ 3 - 0
src/States/BrowseState.cpp

@@ -50,6 +50,9 @@ BrowseState::BrowseState(StateStack& stack, Context& context, StateCallback call
 
 BrowseState::~BrowseState()
 {
+	m_settingsGUI->saveToConfig();
+	Config::saveToFile();
+
 	if (m_settingsGUI)
 		delete m_settingsGUI;
 	if (m_gwenSkin)

+ 0 - 0
src/States/SyncState.cpp


Некоторые файлы не были показаны из-за большого количества измененных файлов