Skip to content

Commit

Permalink
Qt: Add basic screenshot manager
Browse files Browse the repository at this point in the history
  • Loading branch information
Megamouse committed Mar 22, 2020
1 parent b447e6f commit ef10ed4
Show file tree
Hide file tree
Showing 9 changed files with 297 additions and 0 deletions.
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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;
};

0 comments on commit ef10ed4

Please sign in to comment.