Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Screenshot manager #7831

Merged
merged 1 commit into from Mar 22, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
78 changes: 78 additions & 0 deletions rpcs3/rpcs3.vcxproj

Large diffs are not rendered by default.

39 changes: 39 additions & 0 deletions rpcs3/rpcs3.vcxproj.filters
Expand Up @@ -125,6 +125,9 @@
<Extensions>ts</Extensions>
<ParseFiles>false</ParseFiles>
</Filter>
<Filter Include="Gui\screenshot manager">
<UniqueIdentifier>{b227bdd4-16f5-4f6e-a8b2-8b1f4bdc606a}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="\rpcs3qt\*.cpp">
Expand Down Expand Up @@ -886,6 +889,36 @@
<ClCompile Include="rpcs3qt\curl_handle.cpp">
<Filter>rpcs3</Filter>
</ClCompile>
<ClCompile Include="rpcs3qt\screenshot_manager_dialog.cpp">
<Filter>Gui\screenshot manager</Filter>
</ClCompile>
<ClCompile Include="QTGeneratedFiles\Release - LLVM\moc_screenshot_manager_dialog.cpp">
<Filter>Generated Files\Release - LLVM</Filter>
</ClCompile>
<ClCompile Include="QTGeneratedFiles\Debug\moc_screenshot_manager_dialog.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="QTGeneratedFiles\Release\moc_screenshot_manager_dialog.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="QTGeneratedFiles\Debug - LLVM\moc_screenshot_manager_dialog.cpp">
<Filter>Generated Files\Debug - LLVM</Filter>
</ClCompile>
<ClCompile Include="rpcs3qt\screenshot_preview.cpp">
<Filter>Gui\screenshot manager</Filter>
</ClCompile>
<ClCompile Include="QTGeneratedFiles\Release - LLVM\moc_screenshot_preview.cpp">
<Filter>Generated Files\Release - LLVM</Filter>
</ClCompile>
<ClCompile Include="QTGeneratedFiles\Debug\moc_screenshot_preview.cpp">
<Filter>Generated Files\Debug</Filter>
</ClCompile>
<ClCompile Include="QTGeneratedFiles\Release\moc_screenshot_preview.cpp">
<Filter>Generated Files\Release</Filter>
</ClCompile>
<ClCompile Include="QTGeneratedFiles\Debug - LLVM\moc_screenshot_preview.cpp">
<Filter>Generated Files\Debug - LLVM</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="\rpcs3qt\*.h">
Expand Down Expand Up @@ -1169,6 +1202,12 @@
<CustomBuild Include="rpcs3qt\localized.h">
<Filter>Gui\settings</Filter>
</CustomBuild>
<CustomBuild Include="rpcs3qt\screenshot_manager_dialog.h">
<Filter>Gui\screenshot manager</Filter>
</CustomBuild>
<CustomBuild Include="rpcs3qt\screenshot_preview.h">
<Filter>Gui\screenshot manager</Filter>
</CustomBuild>
</ItemGroup>
<ItemGroup>
<Image Include="rpcs3.ico" />
Expand Down
2 changes: 2 additions & 0 deletions rpcs3/rpcs3qt/CMakeLists.txt
Expand Up @@ -42,6 +42,8 @@
save_data_info_dialog.cpp
save_data_list_dialog.cpp
save_manager_dialog.cpp
screenshot_manager_dialog.cpp
screenshot_preview.cpp
settings.cpp
settings_dialog.cpp
skylander_dialog.cpp
Expand Down
7 changes: 7 additions & 0 deletions rpcs3/rpcs3qt/main_window.cpp
Expand Up @@ -6,6 +6,7 @@
#include "save_manager_dialog.h"
#include "trophy_manager_dialog.h"
#include "user_manager_dialog.h"
#include "screenshot_manager_dialog.h"
#include "kernel_explorer.h"
#include "game_list_frame.h"
#include "debugger_frame.h"
Expand Down Expand Up @@ -1518,6 +1519,12 @@ void main_window::CreateConnects()
m_game_list_frame->Refresh(true); // New user may have different games unlocked.
});

connect(ui->actionManage_Screenshots, &QAction::triggered, [this]
{
screenshot_manager_dialog* screenshot_manager = new screenshot_manager_dialog();
screenshot_manager->show();
});

connect(ui->toolsCgDisasmAct, &QAction::triggered, [this]
{
cg_disasm_window* cgdw = new cg_disasm_window(m_gui_settings);
Expand Down
6 changes: 6 additions & 0 deletions rpcs3/rpcs3qt/main_window.ui
Expand Up @@ -229,6 +229,7 @@
<addaction name="actionManage_Trophy_Data"/>
<addaction name="actionManage_Skylanders_Portal"/>
<addaction name="actionManage_Cheats"/>
<addaction name="actionManage_Screenshots"/>
</widget>
<widget class="QMenu" name="menuUtilities">
<property name="title">
Expand Down Expand Up @@ -1033,6 +1034,11 @@
<string>English</string>
</property>
</action>
<action name="actionManage_Screenshots">
<property name="text">
<string>Screenshots</string>
</property>
</action>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources>
Expand Down
59 changes: 59 additions & 0 deletions rpcs3/rpcs3qt/screenshot_manager_dialog.cpp
@@ -0,0 +1,59 @@
#include "screenshot_manager_dialog.h"
#include "screenshot_preview.h"
#include "qt_utils.h"
#include "Utilities/File.h"

#include <QApplication>
#include <QDir>
#include <QDirIterator>
#include <QListWidget>
#include <QScreen>
#include <QVBoxLayout>

screenshot_manager_dialog::screenshot_manager_dialog(QWidget* parent) : QDialog(parent)
{
setWindowTitle(tr("Screenshots"));

m_grid = new QListWidget(this);
m_grid->setViewMode(QListWidget::IconMode);
m_grid->setMovement(QListWidget::Static);
m_grid->setResizeMode(QListWidget::Adjust);
m_grid->setIconSize(QSize(160, 90));
m_grid->setGridSize(m_grid->iconSize() + QSize(10, 10));

const std::string screen_path = fs::get_config_dir() + "/screenshots/";
const QStringList filter{ QStringLiteral("*.png") };
QDirIterator dir_iter(QString::fromStdString(screen_path), filter, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);

while (dir_iter.hasNext())
{
const QString filepath = dir_iter.next();

QListWidgetItem* item = new QListWidgetItem;
item->setData(Qt::UserRole, filepath);
item->setIcon(QIcon(filepath));
item->setToolTip(filepath);

m_grid->addItem(item);
}

connect(m_grid, &QListWidget::itemDoubleClicked, [this](QListWidgetItem* item)
{
if (!item)
{
return;
}

const QString filepath = item->data(Qt::UserRole).toString();

screenshot_preview* preview = new screenshot_preview(filepath);
preview->show();
});

QVBoxLayout* layout = new QVBoxLayout;
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(m_grid);
setLayout(layout);

resize(QGuiApplication::primaryScreen()->availableSize() * 3 / 5);
}
16 changes: 16 additions & 0 deletions rpcs3/rpcs3qt/screenshot_manager_dialog.h
@@ -0,0 +1,16 @@
#pragma once

#include <QDialog>

class QListWidget;

class screenshot_manager_dialog : public QDialog
{
Q_OBJECT

public:
screenshot_manager_dialog(QWidget* parent = nullptr);

private:
QListWidget* m_grid = nullptr;
};
64 changes: 64 additions & 0 deletions rpcs3/rpcs3qt/screenshot_preview.cpp
@@ -0,0 +1,64 @@
#include "screenshot_preview.h"
#include "qt_utils.h"

#include <QAction>
#include <QApplication>
#include <QClipboard>
#include <QImage>
#include <QImageReader>
#include <QMenu>
#include <QResizeEvent>

screenshot_preview::screenshot_preview(const QString& filepath, QWidget* parent)
: QLabel(parent)
, m_filepath(filepath)
{
QImageReader reader(filepath);
reader.setAutoTransform(true);

m_image = reader.read();

setWindowTitle(tr("Screenshot Preview"));
setObjectName("screenshot_preview");
setContextMenuPolicy(Qt::CustomContextMenu);
setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
setPixmap(QPixmap::fromImage(m_image));
setMinimumSize(160, 90);

connect(this, &screenshot_preview::customContextMenuRequested, this, &screenshot_preview::show_context_menu);
}
#include <QDebug>

void screenshot_preview::show_context_menu(const QPoint & pos)
{
QMenu* menu = new QMenu();
menu->addAction(tr("&Copy"), [this]() { QGuiApplication::clipboard()->setImage(m_image); });
menu->addSeparator();

QAction* reset_act = menu->addAction(tr("To &Normal Size"), [this]() { scale(m_image.size()); });
reset_act->setEnabled(pixmap()->size() != m_image.size());

QAction* stretch_act = menu->addAction(tr("&Stretch to size"), [this]() { m_stretch = !m_stretch; scale(size()); });
stretch_act->setCheckable(true);
stretch_act->setChecked(m_stretch);

menu->addSeparator();
menu->addAction(tr("E&xit"), this, &QLabel::close);
menu->exec(mapToGlobal(pos));
}

void screenshot_preview::scale(const QSize& new_size)
{
if (new_size != size())
{
resize(new_size);
}

setPixmap(QPixmap::fromImage(m_image.scaled(new_size, m_stretch ? Qt::IgnoreAspectRatio : Qt::KeepAspectRatio, Qt::SmoothTransformation)));
}

void screenshot_preview::resizeEvent(QResizeEvent* event)
{
scale(event->size());
event->ignore();
}
26 changes: 26 additions & 0 deletions rpcs3/rpcs3qt/screenshot_preview.h
@@ -0,0 +1,26 @@
#pragma once

#include <QImage>
#include <QLabel>

class screenshot_preview : public QLabel
{
Q_OBJECT

public:
screenshot_preview(const QString& filepath, QWidget* parent = nullptr);

protected:
void resizeEvent(QResizeEvent* event);

private Q_SLOTS:
void show_context_menu(const QPoint& pos);

private:
void scale(const QSize& size);

QString m_filepath;
QImage m_image;
double m_factor = 1.0;
bool m_stretch = false;
};