openMSX
ImGuiMedia.hh
Go to the documentation of this file.
1#ifndef IMGUI_MEDIA_HH
2#define IMGUI_MEDIA_HH
3
4#include "ImGuiPart.hh"
5
7#include "HD.hh"
8#include "IDECDROM.hh"
9#include "RealDrive.hh"
10#include "RomTypes.hh"
11#include "TclObject.hh"
12
13#include "circular_buffer.hh"
14#include "function_ref.hh"
15#include "zstring_view.hh"
16
17#include <array>
18#include <functional>
19#include <string>
20#include <vector>
21
22namespace openmsx {
23
24class HardwareConfig;
25class RomInfo;
26
27class ImGuiMedia final : public ImGuiPart
28{
29public:
31 std::string configName;
32 std::string displayName;
33 std::vector<std::pair<std::string, std::string>> configInfo;
34 std::optional<std::string> testResult; // lazily initialized
35 };
36
37public:
39
40 [[nodiscard]] zstring_view iniName() const override { return "media"; }
41 void save(ImGuiTextBuffer& buf) override;
42 void loadLine(std::string_view name, zstring_view value) override;
43 void showMenu(MSXMotherBoard* motherBoard) override;
44 void paint(MSXMotherBoard* motherBoard) override;
45
46 [[nodiscard]] std::string displayNameForExtension(std::string_view config);
47 [[nodiscard]] std::string displayNameForRom(const std::string& filename, bool compact = false);
48 [[nodiscard]] std::string displayNameForHardwareConfig(const HardwareConfig& config, bool compact = false);
49 [[nodiscard]] std::string displayNameForSlotContent(const CartridgeSlotManager& slotManager, unsigned slotNr, bool compact = false);
50 [[nodiscard]] std::string slotAndNameForHardwareConfig(const CartridgeSlotManager& slotManager, const HardwareConfig& config);
51 [[nodiscard]] std::string displayNameForDriveContent(unsigned drive, bool compact = false);
52
53 std::vector<ExtensionInfo>& getAllExtensions();
54 void resetExtensionInfo();
55 ExtensionInfo* findExtensionInfo(std::string_view config);
56 [[nodiscard]] const std::string& getTestResult(ExtensionInfo& info);
57
58public:
70
71 struct MediaItem {
72 std::string name;
73 std::vector<std::string> ipsPatches; // only used for disk and rom images
74 RomType romType = RomType::UNKNOWN; // only used for rom images
75
76 [[nodiscard]] bool operator==(const MediaItem&) const = default;
77 };
78
79 struct ItemGroup { // MediaItem + history
80 static constexpr size_t HISTORY_SIZE = 8;
81
83 int patchIndex = -1; // only used for IPSItem
85 };
86
88 std::array<ItemGroup, 2> groups;
89 int select = 0; // 0-> romImage, 1->extension
90 bool show = false;
91 };
94 groups[2].edit.name = "ramdsk";
95 }
96 std::array<ItemGroup, 3> groups;
97 int select = 0; // 0->diskImage, 1->dirAsDsk, 2->ramDisk
98 bool show = false;
99 };
102 bool show = false;
103 };
104
105public:
106 bool resetOnInsertRom = true;
107
108 static void printDatabase(const RomInfo& romInfo, const char* buf);
109 static bool selectMapperType(const char* label, RomType& item);
110
111 static std::string diskFilter();
112
113private:
114 bool selectRecent(ItemGroup& group, function_ref<std::string(const std::string&)> displayFunc, float width) const;
115 bool selectImage(ItemGroup& group, const std::string& title,
116 function_ref<std::string()> createFilter, zstring_view current,
117 function_ref<std::string(const std::string&)> displayFunc = std::identity{},
118 const std::function<void()>& createNewCallback = {});
119 bool selectDirectory(ItemGroup& info, const std::string& title, zstring_view current,
120 const std::function<void()>& createNewCallback);
121 bool selectPatches(MediaItem& item, int& patchIndex);
122 bool insertMediaButton(std::string_view mediaName, ItemGroup& group, bool* showWindow);
123 TclObject showDiskInfo(std::string_view mediaName, DiskMediaInfo& info);
124 TclObject showCartridgeInfo(std::string_view mediaName, CartridgeMediaInfo& info, int slot);
125 void diskMenu(int i);
126 void cartridgeMenu(int i);
127 void cassetteMenu(const TclObject& cmdResult);
128 void insertMedia(std::string_view mediaName, ItemGroup& group);
129
130 void printExtensionInfo(ExtensionInfo& info);
131 void extensionTooltip(ExtensionInfo& info);
132 bool drawExtensionFilter();
133
134private:
135 std::array<DiskMediaInfo, RealDrive::MAX_DRIVES> diskMediaInfo;
136 std::array<CartridgeMediaInfo, CartridgeSlotManager::MAX_SLOTS> cartridgeMediaInfo;
137 ItemGroup extensionMediaInfo;
138 CassetteMediaInfo cassetteMediaInfo;
139 std::array<ItemGroup, HD::MAX_HD> hdMediaInfo;
140 std::array<ItemGroup, IDECDROM::MAX_CD> cdMediaInfo;
141 ItemGroup laserdiscMediaInfo;
142
143 std::string filterType;
144 std::string filterString;
145 bool filterOpen = false;
146
147 std::vector<ExtensionInfo> extensionInfo;
148
149 static constexpr auto persistentElements = std::tuple{
150 PersistentElement{"resetOnInsertRom", &ImGuiMedia::resetOnInsertRom},
151 // most media stuff is handled elsewhere
152 };
153};
154
155} // namespace openmsx
156
157#endif
Circular buffer class, based on boost::circular_buffer/.
ExtensionInfo * findExtensionInfo(std::string_view config)
static void printDatabase(const RomInfo &romInfo, const char *buf)
std::string displayNameForHardwareConfig(const HardwareConfig &config, bool compact=false)
static std::string diskFilter()
std::string displayNameForRom(const std::string &filename, bool compact=false)
std::string slotAndNameForHardwareConfig(const CartridgeSlotManager &slotManager, const HardwareConfig &config)
void showMenu(MSXMotherBoard *motherBoard) override
std::string displayNameForDriveContent(unsigned drive, bool compact=false)
std::string displayNameForExtension(std::string_view config)
void save(ImGuiTextBuffer &buf) override
Definition ImGuiMedia.cc:45
zstring_view iniName() const override
Definition ImGuiMedia.hh:40
static bool selectMapperType(const char *label, RomType &item)
void paint(MSXMotherBoard *motherBoard) override
std::string displayNameForSlotContent(const CartridgeSlotManager &slotManager, unsigned slotNr, bool compact=false)
void loadLine(std::string_view name, zstring_view value) override
std::vector< ExtensionInfo > & getAllExtensions()
const std::string & getTestResult(ExtensionInfo &info)
ImGuiPart(ImGuiManager &manager_)
Definition ImGuiPart.hh:12
Like std::string_view, but with the extra guarantee that it refers to a zero-terminated string.
This file implemented 3 utility functions:
Definition Autofire.cc:11
std::array< ItemGroup, 2 > groups
Definition ImGuiMedia.hh:88
std::array< ItemGroup, 3 > groups
Definition ImGuiMedia.hh:96
std::vector< std::pair< std::string, std::string > > configInfo
Definition ImGuiMedia.hh:33
std::optional< std::string > testResult
Definition ImGuiMedia.hh:34
static constexpr size_t HISTORY_SIZE
Definition ImGuiMedia.hh:80
circular_buffer< MediaItem > recent
Definition ImGuiMedia.hh:84
std::vector< std::string > ipsPatches
Definition ImGuiMedia.hh:73
bool operator==(const MediaItem &) const =default