Skip to content

Commit

Permalink
FullscreenUI: Various improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
stenzek committed Sep 17, 2022
1 parent 91c8681 commit ef3ad91
Show file tree
Hide file tree
Showing 34 changed files with 1,348 additions and 512 deletions.
8 changes: 3 additions & 5 deletions src/common/lru_cache.h
Expand Up @@ -69,7 +69,7 @@ class LRUCache

void Evict(std::size_t count = 1)
{
while (m_items.size() >= count)
while (!m_items.empty() && count > 0)
{
typename MapType::iterator lowest = m_items.end();
for (auto iter = m_items.begin(); iter != m_items.end(); ++iter)
Expand All @@ -78,6 +78,7 @@ class LRUCache
lowest = iter;
}
m_items.erase(lowest);
count--;
}
}

Expand All @@ -87,23 +88,20 @@ class LRUCache
auto iter = m_items.find(key);
if (iter == m_items.end())
return false;

m_items.erase(iter);
return true;
}

void SetManualEvict(bool block)
{
m_manual_evict = block;
if (!m_manual_evict)
ManualEvict();
}

void ManualEvict()
{
// evict if we went over
while (m_items.size() > m_max_capacity)
Evict(m_items.size() - (m_max_capacity - 1));
Evict(m_items.size() - m_max_capacity);
}

private:
Expand Down
25 changes: 25 additions & 0 deletions src/common/string_util.cpp
Expand Up @@ -255,6 +255,31 @@ std::vector<std::string_view> StringUtil::SplitString(const std::string_view& st
return res;
}

std::vector<std::string> StringUtil::SplitNewString(const std::string_view& str, char delimiter,
bool skip_empty /*= true*/)
{
std::vector<std::string> res;
std::string_view::size_type last_pos = 0;
std::string_view::size_type pos;
while (last_pos < str.size() && (pos = str.find(delimiter, last_pos)) != std::string_view::npos)
{
std::string_view part(StripWhitespace(str.substr(last_pos, pos - last_pos)));
if (!skip_empty || !part.empty())
res.emplace_back(part);

last_pos = pos + 1;
}

if (last_pos < str.size())
{
std::string_view part(StripWhitespace(str.substr(last_pos)));
if (!skip_empty || !part.empty())
res.emplace_back(part);
}

return res;
}

std::string StringUtil::ReplaceAll(const std::string_view& subject, const std::string_view& search,
const std::string_view& replacement)
{
Expand Down
1 change: 1 addition & 0 deletions src/common/string_util.h
Expand Up @@ -149,6 +149,7 @@ void StripWhitespace(std::string* str);

/// Splits a string based on a single character delimiter.
std::vector<std::string_view> SplitString(const std::string_view& str, char delimiter, bool skip_empty = true);
std::vector<std::string> SplitNewString(const std::string_view& str, char delimiter, bool skip_empty = true);

/// Joins a string together using the specified delimiter.
template<typename T>
Expand Down
79 changes: 0 additions & 79 deletions src/duckstation-nogui/nogui_host.cpp
Expand Up @@ -376,68 +376,6 @@ void Host::CheckForSettingsChanges(const Settings& old_settings)
CommonHost::CheckForSettingsChanges(old_settings);
}

void Host::SetBaseBoolSettingValue(const char* section, const char* key, bool value)
{
auto lock = Host::GetSettingsLock();
s_base_settings_interface->SetBoolValue(section, key, value);
NoGUIHost::SaveSettings();
}

void Host::SetBaseIntSettingValue(const char* section, const char* key, int value)
{
auto lock = Host::GetSettingsLock();
s_base_settings_interface->SetIntValue(section, key, value);
NoGUIHost::SaveSettings();
}

void Host::SetBaseFloatSettingValue(const char* section, const char* key, float value)
{
auto lock = Host::GetSettingsLock();
s_base_settings_interface->SetFloatValue(section, key, value);
NoGUIHost::SaveSettings();
}

void Host::SetBaseStringSettingValue(const char* section, const char* key, const char* value)
{
auto lock = Host::GetSettingsLock();
s_base_settings_interface->SetStringValue(section, key, value);
NoGUIHost::SaveSettings();
}

void Host::SetBaseStringListSettingValue(const char* section, const char* key, const std::vector<std::string>& values)
{
auto lock = Host::GetSettingsLock();
s_base_settings_interface->SetStringList(section, key, values);
NoGUIHost::SaveSettings();
}

bool Host::AddValueToBaseStringListSetting(const char* section, const char* key, const char* value)
{
auto lock = Host::GetSettingsLock();
if (!s_base_settings_interface->AddToStringList(section, key, value))
return false;

NoGUIHost::SaveSettings();
return true;
}

bool Host::RemoveValueFromBaseStringListSetting(const char* section, const char* key, const char* value)
{
auto lock = Host::GetSettingsLock();
if (!s_base_settings_interface->RemoveFromStringList(section, key, value))
return false;

NoGUIHost::SaveSettings();
return true;
}

void Host::DeleteBaseSettingValue(const char* section, const char* key)
{
auto lock = Host::GetSettingsLock();
s_base_settings_interface->DeleteValue(section, key);
NoGUIHost::SaveSettings();
}

void Host::CommitBaseSettingChanges()
{
NoGUIHost::SaveSettings();
Expand Down Expand Up @@ -1008,23 +946,6 @@ void Host::CancelGameListRefresh()
NoGUIHost::CancelAsyncOp();
}

void Host::DownloadCoversAsync(std::vector<std::string> url_templates)
{
NoGUIHost::StartAsyncOp([url_templates = std::move(url_templates)](ProgressCallback* progress) {
GameList::DownloadCovers(url_templates, progress);
});
}

void Host::CancelCoversDownload()
{
NoGUIHost::CancelAsyncOp();
}

void Host::CoversChanged()
{
Host::RunOnCPUThread([]() { FullscreenUI::InvalidateCoverCache(); });
}

bool Host::IsFullscreen()
{
return s_is_fullscreen;
Expand Down
3 changes: 3 additions & 0 deletions src/duckstation-qt/audiosettingswidget.cpp
Expand Up @@ -162,6 +162,7 @@ void AudioSettingsWidget::onOutputVolumeChanged(int new_value)
// only called for base settings
DebugAssert(!m_dialog->isPerGameSettings());
Host::SetBaseIntSettingValue("Audio", "OutputVolume", new_value);
Host::CommitBaseSettingChanges();
g_emu_thread->setAudioOutputVolume(new_value, m_ui.fastForwardVolume->value());

updateVolumeLabel();
Expand All @@ -172,6 +173,7 @@ void AudioSettingsWidget::onFastForwardVolumeChanged(int new_value)
// only called for base settings
DebugAssert(!m_dialog->isPerGameSettings());
Host::SetBaseIntSettingValue("Audio", "FastForwardVolume", new_value);
Host::CommitBaseSettingChanges();
g_emu_thread->setAudioOutputVolume(m_ui.volume->value(), new_value);

updateVolumeLabel();
Expand All @@ -184,5 +186,6 @@ void AudioSettingsWidget::onOutputMutedChanged(int new_state)

const bool muted = (new_state != 0);
Host::SetBaseBoolSettingValue("Audio", "OutputMuted", muted);
Host::CommitBaseSettingChanges();
g_emu_thread->setAudioOutputMuted(muted);
}
1 change: 1 addition & 0 deletions src/duckstation-qt/autoupdaterdialog.cpp
Expand Up @@ -436,6 +436,7 @@ bool AutoUpdaterDialog::updateNeeded() const
void AutoUpdaterDialog::skipThisUpdateClicked()
{
Host::SetBaseStringSettingValue("AutoUpdater", "LastVersion", m_latest_sha.toUtf8().constData());
Host::CommitBaseSettingChanges();
done(0);
}

Expand Down
1 change: 1 addition & 0 deletions src/duckstation-qt/consolesettingswidget.cpp
Expand Up @@ -156,6 +156,7 @@ void ConsoleSettingsWidget::onEnableCPUClockSpeedControlChecked(int state)
}

Host::SetBaseBoolSettingValue("UI", "CPUOverclockingWarningShown", true);
Host::CommitBaseSettingChanges();
}

m_ui.cpuClockSpeed->setEnabled(m_dialog->getEffectiveBoolValue("CPU", "OverclockEnable", false));
Expand Down
1 change: 1 addition & 0 deletions src/duckstation-qt/controllerbindingwidgets.cpp
Expand Up @@ -177,6 +177,7 @@ void ControllerBindingWidget::onTypeChanged()
{
Host::SetBaseStringSettingValue(m_config_section.c_str(), "Type",
Settings::GetControllerTypeName(m_controller_type));
Host::CommitBaseSettingChanges();
g_emu_thread->applySettings();
}

Expand Down
1 change: 1 addition & 0 deletions src/duckstation-qt/controllersettingsdialog.cpp
Expand Up @@ -308,6 +308,7 @@ void ControllerSettingsDialog::setStringValue(const char* section, const char* k
else
{
Host::SetBaseStringSettingValue(section, key, value);
Host::CommitBaseSettingChanges();
g_emu_thread->applySettings();
}
}
Expand Down
5 changes: 4 additions & 1 deletion src/duckstation-qt/controllersettingwidgetbinder.h
Expand Up @@ -46,6 +46,7 @@ static void BindWidgetToInputProfileBool(SettingsInterface* sif, WidgetType* wid
Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key)]() {
const bool new_value = Accessor::getBoolValue(widget);
Host::SetBaseBoolSettingValue(section.c_str(), key.c_str(), new_value);
Host::CommitBaseSettingChanges();
g_emu_thread->applySettings();
});
}
Expand Down Expand Up @@ -78,6 +79,7 @@ static void BindWidgetToInputProfileFloat(SettingsInterface* sif, WidgetType* wi
Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key)]() {
const float new_value = Accessor::getFloatValue(widget);
Host::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value);
Host::CommitBaseSettingChanges();
g_emu_thread->applySettings();
});
}
Expand Down Expand Up @@ -110,6 +112,7 @@ static void BindWidgetToInputProfileNormalized(SettingsInterface* sif, WidgetTyp
Accessor::connectValueChanged(widget, [widget, section = std::move(section), key = std::move(key), range]() {
const float new_value = (static_cast<float>(Accessor::getIntValue(widget)) / range);
Host::SetBaseFloatSettingValue(section.c_str(), key.c_str(), new_value);
Host::CommitBaseSettingChanges();
g_emu_thread->applySettings();
});
}
Expand Down Expand Up @@ -153,7 +156,7 @@ static void BindWidgetToInputProfileString(SettingsInterface* sif, WidgetType* w
Host::SetBaseStringSettingValue(section.c_str(), key.c_str(), new_value.toUtf8().constData());
else
Host::DeleteBaseSettingValue(section.c_str(), key.c_str());

Host::CommitBaseSettingChanges();
g_emu_thread->applySettings();
});
}
Expand Down
13 changes: 8 additions & 5 deletions src/duckstation-qt/coverdownloaddialog.cpp
Expand Up @@ -5,6 +5,7 @@
CoverDownloadDialog::CoverDownloadDialog(QWidget* parent /*= nullptr*/) : QDialog(parent)
{
m_ui.setupUi(this);
m_ui.coverIcon->setPixmap(QIcon::fromTheme("image-fill").pixmap(32));
updateEnabled();

connect(m_ui.start, &QPushButton::clicked, this, &CoverDownloadDialog::onStartClicked);
Expand All @@ -29,7 +30,8 @@ void CoverDownloadDialog::onDownloadStatus(const QString& text)

void CoverDownloadDialog::onDownloadProgress(int value, int range)
{
// limit to once every five seconds
// Limit to once every five seconds, otherwise it's way too flickery.
// Ideally in the future we'd have some way to invalidate only a single cover.
if (m_last_refresh_time.GetTimeSeconds() >= 5.0f)
{
emit coverRefreshRequested();
Expand Down Expand Up @@ -83,7 +85,8 @@ void CoverDownloadDialog::updateEnabled()

void CoverDownloadDialog::startThread()
{
m_thread = std::make_unique<CoverDownloadThread>(this, m_ui.urls->toPlainText());
m_thread = std::make_unique<CoverDownloadThread>(this, m_ui.urls->toPlainText(), m_ui.useSerialFileNames->isChecked());
m_last_refresh_time.Reset();
connect(m_thread.get(), &CoverDownloadThread::statusUpdated, this, &CoverDownloadDialog::onDownloadStatus);
connect(m_thread.get(), &CoverDownloadThread::progressUpdated, this, &CoverDownloadDialog::onDownloadProgress);
connect(m_thread.get(), &CoverDownloadThread::threadFinished, this, &CoverDownloadDialog::onDownloadComplete);
Expand All @@ -101,8 +104,8 @@ void CoverDownloadDialog::cancelThread()
m_thread.reset();
}

CoverDownloadDialog::CoverDownloadThread::CoverDownloadThread(QWidget* parent, const QString& urls)
: QtAsyncProgressThread(parent)
CoverDownloadDialog::CoverDownloadThread::CoverDownloadThread(QWidget* parent, const QString& urls, bool use_serials)
: QtAsyncProgressThread(parent), m_use_serials(use_serials)
{
for (const QString& str : urls.split(QChar('\n')))
m_urls.push_back(str.toStdString());
Expand All @@ -112,5 +115,5 @@ CoverDownloadDialog::CoverDownloadThread::~CoverDownloadThread() = default;

void CoverDownloadDialog::CoverDownloadThread::runAsync()
{
GameList::DownloadCovers(m_urls, this);
GameList::DownloadCovers(m_urls, m_use_serials, this);
}
3 changes: 2 additions & 1 deletion src/duckstation-qt/coverdownloaddialog.h
Expand Up @@ -34,14 +34,15 @@ private Q_SLOTS:
class CoverDownloadThread : public QtAsyncProgressThread
{
public:
CoverDownloadThread(QWidget* parent, const QString& urls);
CoverDownloadThread(QWidget* parent, const QString& urls, bool use_serials);
~CoverDownloadThread();

protected:
void runAsync() override;

private:
std::vector<std::string> m_urls;
bool m_use_serials;
};

void startThread();
Expand Down

0 comments on commit ef3ad91

Please sign in to comment.