Qt: Add option to reset played time
This commit is contained in:
parent
50a616421f
commit
7c6071dfe1
|
@ -1408,6 +1408,9 @@ void MainWindow::onGameListEntryContextMenuRequested(const QPoint& point)
|
||||||
connect(menu.addAction(tr("Exclude From List")), &QAction::triggered,
|
connect(menu.addAction(tr("Exclude From List")), &QAction::triggered,
|
||||||
[this, entry]() { getSettingsDialog()->getGameListSettingsWidget()->addExcludedPath(entry->path); });
|
[this, entry]() { getSettingsDialog()->getGameListSettingsWidget()->addExcludedPath(entry->path); });
|
||||||
|
|
||||||
|
connect(menu.addAction(tr("Reset Play Time")), &QAction::triggered,
|
||||||
|
[this, entry]() { clearGameListEntryPlayTime(entry); });
|
||||||
|
|
||||||
connect(menu.addAction(tr("Add Search Directory...")), &QAction::triggered,
|
connect(menu.addAction(tr("Add Search Directory...")), &QAction::triggered,
|
||||||
[this]() { getSettingsDialog()->getGameListSettingsWidget()->addSearchDirectory(this); });
|
[this]() { getSettingsDialog()->getGameListSettingsWidget()->addSearchDirectory(this); });
|
||||||
|
|
||||||
|
@ -1451,6 +1454,20 @@ void MainWindow::setGameListEntryCoverImage(const GameList::Entry* entry)
|
||||||
m_game_list_widget->refreshGridCovers();
|
m_game_list_widget->refreshGridCovers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::clearGameListEntryPlayTime(const GameList::Entry* entry)
|
||||||
|
{
|
||||||
|
if (QMessageBox::question(
|
||||||
|
this, tr("Confirm Reset"),
|
||||||
|
tr("Are you sure you want to reset the play time for '%1'?\n\nThis action cannot be undone.")
|
||||||
|
.arg(QString::fromStdString(entry->title))) != QMessageBox::Yes)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
GameList::ClearPlayedTimeForSerial(entry->serial);
|
||||||
|
m_game_list_widget->refresh(false);
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::setupAdditionalUi()
|
void MainWindow::setupAdditionalUi()
|
||||||
{
|
{
|
||||||
const bool status_bar_visible = Host::GetBaseBoolSettingValue("UI", "ShowStatusBar", true);
|
const bool status_bar_visible = Host::GetBaseBoolSettingValue("UI", "ShowStatusBar", true);
|
||||||
|
|
|
@ -226,6 +226,7 @@ private:
|
||||||
void updateMenuSelectedTheme();
|
void updateMenuSelectedTheme();
|
||||||
std::string getDeviceDiscPath(const QString& title);
|
std::string getDeviceDiscPath(const QString& title);
|
||||||
void setGameListEntryCoverImage(const GameList::Entry* entry);
|
void setGameListEntryCoverImage(const GameList::Entry* entry);
|
||||||
|
void clearGameListEntryPlayTime(const GameList::Entry* entry);
|
||||||
void setTheme(const QString& theme);
|
void setTheme(const QString& theme);
|
||||||
void recreate();
|
void recreate();
|
||||||
|
|
||||||
|
|
|
@ -5834,6 +5834,7 @@ void FullscreenUI::HandleGameListOptions(const GameList::Entry* entry)
|
||||||
{ICON_FA_WRENCH " Game Properties", false}, {ICON_FA_PLAY " Resume Game", false},
|
{ICON_FA_WRENCH " Game Properties", false}, {ICON_FA_PLAY " Resume Game", false},
|
||||||
{ICON_FA_UNDO " Load State", false}, {ICON_FA_COMPACT_DISC " Default Boot", false},
|
{ICON_FA_UNDO " Load State", false}, {ICON_FA_COMPACT_DISC " Default Boot", false},
|
||||||
{ICON_FA_LIGHTBULB " Fast Boot", false}, {ICON_FA_MAGIC " Slow Boot", false},
|
{ICON_FA_LIGHTBULB " Fast Boot", false}, {ICON_FA_MAGIC " Slow Boot", false},
|
||||||
|
{ICON_FA_FOLDER_MINUS " Reset Play Time", false},
|
||||||
{ICON_FA_WINDOW_CLOSE " Close Menu", false},
|
{ICON_FA_WINDOW_CLOSE " Close Menu", false},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -5860,6 +5861,9 @@ void FullscreenUI::HandleGameListOptions(const GameList::Entry* entry)
|
||||||
case 5: // Slow Boot
|
case 5: // Slow Boot
|
||||||
DoStartPath(entry_path, {}, false);
|
DoStartPath(entry_path, {}, false);
|
||||||
break;
|
break;
|
||||||
|
case 6: // Reset Play Time
|
||||||
|
GameList::ClearPlayedTimeForSerial(entry_serial);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -862,8 +862,8 @@ GameList::PlayedTimeEntry GameList::UpdatePlayedTimeFile(const std::string& path
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// found it!
|
// found it!
|
||||||
line_entry.last_played_time = last_time;
|
line_entry.last_played_time = (last_time != 0) ? last_time : 0;
|
||||||
line_entry.total_played_time += add_time;
|
line_entry.total_played_time = (last_time != 0) ? (line_entry.total_played_time + add_time) : 0;
|
||||||
|
|
||||||
std::string new_line(MakePlayedTimeLine(serial, line_entry));
|
std::string new_line(MakePlayedTimeLine(serial, line_entry));
|
||||||
if (FileSystem::FSeek64(fp.get(), line_pos, SEEK_SET) != 0 ||
|
if (FileSystem::FSeek64(fp.get(), line_pos, SEEK_SET) != 0 ||
|
||||||
|
@ -875,12 +875,15 @@ GameList::PlayedTimeEntry GameList::UpdatePlayedTimeFile(const std::string& path
|
||||||
return line_entry;
|
return line_entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
// new entry.
|
if (last_time != 0)
|
||||||
std::string new_line(MakePlayedTimeLine(serial, new_entry));
|
|
||||||
if (FileSystem::FSeek64(fp.get(), 0, SEEK_END) != 0 ||
|
|
||||||
std::fwrite(new_line.data(), new_line.length(), 1, fp.get()) != 1)
|
|
||||||
{
|
{
|
||||||
Log_ErrorPrintf("Failed to write '%s'.", path.c_str());
|
// new entry.
|
||||||
|
std::string new_line(MakePlayedTimeLine(serial, new_entry));
|
||||||
|
if (FileSystem::FSeek64(fp.get(), 0, SEEK_END) != 0 ||
|
||||||
|
std::fwrite(new_line.data(), new_line.length(), 1, fp.get()) != 1)
|
||||||
|
{
|
||||||
|
Log_ErrorPrintf("Failed to write '%s'.", path.c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return new_entry;
|
return new_entry;
|
||||||
|
@ -906,6 +909,24 @@ void GameList::AddPlayedTimeForSerial(const std::string& serial, std::time_t las
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameList::ClearPlayedTimeForSerial(const std::string& serial)
|
||||||
|
{
|
||||||
|
if (serial.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
UpdatePlayedTimeFile(GetPlayedTimeFile(), serial, 0, 0);
|
||||||
|
|
||||||
|
std::unique_lock<std::recursive_mutex> lock(s_mutex);
|
||||||
|
for (GameList::Entry& entry : s_entries)
|
||||||
|
{
|
||||||
|
if (entry.serial != serial)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
entry.last_played_time = 0;
|
||||||
|
entry.total_played_time = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
std::time_t GameList::GetCachedPlayedTimeForSerial(const std::string& serial)
|
std::time_t GameList::GetCachedPlayedTimeForSerial(const std::string& serial)
|
||||||
{
|
{
|
||||||
if (serial.empty())
|
if (serial.empty())
|
||||||
|
|
|
@ -81,6 +81,7 @@ void Refresh(bool invalidate_cache, bool only_cache = false, ProgressCallback* p
|
||||||
|
|
||||||
/// Add played time for the specified serial.
|
/// Add played time for the specified serial.
|
||||||
void AddPlayedTimeForSerial(const std::string& serial, std::time_t last_time, std::time_t add_time);
|
void AddPlayedTimeForSerial(const std::string& serial, std::time_t last_time, std::time_t add_time);
|
||||||
|
void ClearPlayedTimeForSerial(const std::string& serial);
|
||||||
|
|
||||||
/// Returns the total time played for a game. Requires the game to be scanned in the list.
|
/// Returns the total time played for a game. Requires the game to be scanned in the list.
|
||||||
std::time_t GetCachedPlayedTimeForSerial(const std::string& serial);
|
std::time_t GetCachedPlayedTimeForSerial(const std::string& serial);
|
||||||
|
|
|
@ -1857,7 +1857,7 @@ void ImGuiFullscreen::DrawChoiceDialog()
|
||||||
const float title_height =
|
const float title_height =
|
||||||
g_large_font->FontSize + ImGui::GetStyle().FramePadding.y * 2.0f + ImGui::GetStyle().WindowPadding.y * 2.0f;
|
g_large_font->FontSize + ImGui::GetStyle().FramePadding.y * 2.0f + ImGui::GetStyle().WindowPadding.y * 2.0f;
|
||||||
const float height =
|
const float height =
|
||||||
std::min(LayoutScale(400.0f),
|
std::min(LayoutScale(450.0f),
|
||||||
title_height + LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + (LAYOUT_MENU_BUTTON_Y_PADDING * 2.0f)) *
|
title_height + LayoutScale(LAYOUT_MENU_BUTTON_HEIGHT_NO_SUMMARY + (LAYOUT_MENU_BUTTON_Y_PADDING * 2.0f)) *
|
||||||
static_cast<float>(s_choice_dialog_options.size()));
|
static_cast<float>(s_choice_dialog_options.size()));
|
||||||
ImGui::SetNextWindowSize(ImVec2(width, height));
|
ImGui::SetNextWindowSize(ImVec2(width, height));
|
||||||
|
|
Loading…
Reference in New Issue