mirror of https://github.com/stella-emu/stella.git
215 lines
6.0 KiB
C++
215 lines
6.0 KiB
C++
//============================================================================
|
|
//
|
|
// SSSS tt lll lll
|
|
// SS SS tt ll ll
|
|
// SS tttttt eeee ll ll aaaa
|
|
// SSSS tt ee ee ll ll aa
|
|
// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
|
|
// SS SS tt ee ll ll aa aa
|
|
// SSSS ttt eeeee llll llll aaaaa
|
|
//
|
|
// Copyright (c) 1995-2021 by Bradford W. Mott, Stephen Anthony
|
|
// and the Stella Team
|
|
//
|
|
// See the file "License.txt" for information on usage and redistribution of
|
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
|
//============================================================================
|
|
|
|
#ifndef LAUNCHER_DIALOG_HXX
|
|
#define LAUNCHER_DIALOG_HXX
|
|
|
|
class ButtonWidget;
|
|
class CommandSender;
|
|
class ContextMenu;
|
|
class DialogContainer;
|
|
class OSystem;
|
|
class Properties;
|
|
class EditTextWidget;
|
|
class FileListWidget;
|
|
class RomInfoWidget;
|
|
class StaticTextWidget;
|
|
namespace Common {
|
|
struct Size;
|
|
}
|
|
namespace GUI {
|
|
class MessageBox;
|
|
}
|
|
|
|
#include <unordered_map>
|
|
|
|
#include "bspf.hxx"
|
|
#include "Dialog.hxx"
|
|
#include "FSNode.hxx"
|
|
|
|
class LauncherDialog : public Dialog
|
|
{
|
|
public:
|
|
// These must be accessible from dialogs created by this class
|
|
enum {
|
|
kLoadROMCmd = 'STRT', // load currently selected ROM
|
|
kRomDirChosenCmd = 'romc' // rom dir chosen
|
|
};
|
|
|
|
public:
|
|
LauncherDialog(OSystem& osystem, DialogContainer& parent,
|
|
int x, int y, int w, int h);
|
|
~LauncherDialog() override = default;
|
|
|
|
/**
|
|
Get path for the currently selected file.
|
|
|
|
@return path if a valid ROM file, else the empty string
|
|
*/
|
|
const string& selectedRom() const;
|
|
|
|
/**
|
|
Get MD5sum for the currently selected file.
|
|
If the MD5 hasn't already been calculated, it will be
|
|
calculated (and cached) for future use.
|
|
|
|
@return md5sum if a valid ROM file, else the empty string
|
|
*/
|
|
const string& selectedRomMD5();
|
|
|
|
/**
|
|
Get node for the currently selected entry.
|
|
|
|
@return FilesystemNode currently selected
|
|
*/
|
|
const FilesystemNode& currentNode() const;
|
|
|
|
/**
|
|
Get node for the current directory.
|
|
|
|
@return FilesystemNode (directory) currently active
|
|
*/
|
|
const FilesystemNode& currentDir() const;
|
|
|
|
/**
|
|
Reload the current listing
|
|
*/
|
|
void reload();
|
|
|
|
void tick() override;
|
|
|
|
private:
|
|
static constexpr int MIN_LAUNCHER_CHARS = 24;
|
|
static constexpr int MIN_ROMINFO_CHARS = 30;
|
|
static constexpr int MIN_ROMINFO_ROWS = 7; // full lines
|
|
static constexpr int MIN_ROMINFO_LINES = 4; // extra lines
|
|
|
|
void setPosition() override { positionAt(0); }
|
|
void handleKeyDown(StellaKey key, StellaMod mod, bool repeated) override;
|
|
void handleMouseDown(int x, int y, MouseButton b, int clickCount) override;
|
|
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
|
void handleJoyDown(int stick, int button, bool longPress) override;
|
|
void handleJoyUp(int stick, int button) override;
|
|
Event::Type getJoyAxisEvent(int stick, JoyAxis axis, JoyDir adir, int button) override;
|
|
|
|
void loadConfig() override;
|
|
void saveConfig() override;
|
|
void updateUI();
|
|
|
|
/**
|
|
Search if string contains pattern including wildcard '*'
|
|
and '?' as joker, ignoring case.
|
|
|
|
@param str The searched string
|
|
@param pattern The pattern to search for
|
|
|
|
@return True if pattern was found.
|
|
*/
|
|
bool matchWithWildcardsIgnoreCase(const string& str, const string& pattern);
|
|
|
|
/**
|
|
Search if string contains pattern including wildcard '*'
|
|
and '?' as joker.
|
|
|
|
@param str The searched string
|
|
@param pattern The pattern to search for
|
|
|
|
@return True if pattern was found.
|
|
*/
|
|
bool matchWithWildcards(const string& str, const string& pattern);
|
|
|
|
/**
|
|
Search if string contains pattern including '?' as joker.
|
|
|
|
@param str The searched string
|
|
@param pattern The pattern to search for
|
|
|
|
@return Position of pattern in string.
|
|
*/
|
|
size_t matchWithJoker(const string& str, const string& pattern);
|
|
|
|
void applyFiltering();
|
|
|
|
float getRomInfoZoom(int listHeight) const;
|
|
void setRomInfoFont(const Common::Size& area);
|
|
|
|
void loadRom();
|
|
void loadRomInfo();
|
|
void handleContextMenu();
|
|
void showOnlyROMs(bool state);
|
|
void setDefaultDir();
|
|
void openGlobalProps();
|
|
void openSettings();
|
|
void openHighScores();
|
|
void openWhatsNew();
|
|
|
|
ContextMenu& menu();
|
|
|
|
private:
|
|
unique_ptr<Dialog> myDialog;
|
|
unique_ptr<ContextMenu> myMenu;
|
|
|
|
// automatically sized font for ROM info viewer
|
|
unique_ptr<GUI::Font> myROMInfoFont;
|
|
|
|
CheckboxWidget* myAllFiles{nullptr};
|
|
EditTextWidget* myPattern{nullptr};
|
|
CheckboxWidget* mySubDirs{nullptr};
|
|
StaticTextWidget* myRomCount{nullptr};
|
|
|
|
FileListWidget* myList{nullptr};
|
|
|
|
StaticTextWidget* myDirLabel{nullptr};
|
|
EditTextWidget* myDir{nullptr};
|
|
|
|
ButtonWidget* myStartButton{nullptr};
|
|
ButtonWidget* myPrevDirButton{nullptr};
|
|
ButtonWidget* myOptionsButton{nullptr};
|
|
ButtonWidget* myQuitButton{nullptr};
|
|
|
|
// FIXME - NOT USED StaticTextWidget* myRomLink{nullptr};
|
|
RomInfoWidget* myRomInfoWidget{nullptr};
|
|
std::unordered_map<string,string> myMD5List;
|
|
|
|
int mySelectedItem{0};
|
|
|
|
bool myShowOnlyROMs{false};
|
|
bool myUseMinimalUI{false};
|
|
bool myEventHandled{false};
|
|
bool myShortCount{false};
|
|
bool myPendingReload{false};
|
|
uInt64 myReloadTime{0};
|
|
|
|
enum {
|
|
kAllfilesCmd = 'lalf', // show all files (or ROMs only)
|
|
kSubDirsCmd = 'lred',
|
|
kPrevDirCmd = 'PRVD',
|
|
kOptionsCmd = 'OPTI',
|
|
kQuitCmd = 'QUIT'
|
|
};
|
|
|
|
private:
|
|
// Following constructors and assignment operators not supported
|
|
LauncherDialog() = delete;
|
|
LauncherDialog(const LauncherDialog&) = delete;
|
|
LauncherDialog(LauncherDialog&&) = delete;
|
|
LauncherDialog& operator=(const LauncherDialog&) = delete;
|
|
LauncherDialog& operator=(LauncherDialog&&) = delete;
|
|
};
|
|
|
|
#endif
|