Initial community commit
This commit is contained in:
parent
537bcbc862
commit
fc06254474
16440 changed files with 4239995 additions and 2 deletions
|
@ -0,0 +1,160 @@
|
|||
/*
|
||||
* PatternClipboard.h
|
||||
* ------------------
|
||||
* Purpose: Implementation of the pattern clipboard mechanism
|
||||
* Notes : (currently none)
|
||||
* Authors: OpenMPT Devs
|
||||
* The OpenMPT source code is released under the BSD license. Read LICENSE for more details.
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "openmpt/all/BuildSettings.hpp"
|
||||
|
||||
#include "ResizableDialog.h"
|
||||
#include "../soundlib/Snd_defs.h"
|
||||
|
||||
OPENMPT_NAMESPACE_BEGIN
|
||||
|
||||
struct PatternEditPos;
|
||||
class PatternRect;
|
||||
class CSoundFile;
|
||||
|
||||
struct PatternClipboardElement
|
||||
{
|
||||
std::string content;
|
||||
CString description;
|
||||
};
|
||||
|
||||
|
||||
class PatternClipboard
|
||||
{
|
||||
friend class PatternClipboardDialog;
|
||||
|
||||
public:
|
||||
enum PasteModes
|
||||
{
|
||||
pmOverwrite,
|
||||
pmMixPaste,
|
||||
pmMixPasteIT,
|
||||
pmPasteFlood,
|
||||
pmPushForward,
|
||||
};
|
||||
|
||||
// Clipboard index type
|
||||
using clipindex_t = size_t;
|
||||
|
||||
protected:
|
||||
// The one and only pattern clipboard object
|
||||
static PatternClipboard instance;
|
||||
|
||||
// Active internal clipboard index
|
||||
clipindex_t m_activeClipboard = 0;
|
||||
// Internal clipboard collection
|
||||
std::vector<PatternClipboardElement> m_clipboards;
|
||||
PatternClipboardElement m_channelClipboard;
|
||||
PatternClipboardElement m_patternClipboard;
|
||||
|
||||
public:
|
||||
// Copy a range of patterns to both the system clipboard and the internal clipboard.
|
||||
static bool Copy(const CSoundFile &sndFile, ORDERINDEX first, ORDERINDEX last, bool onlyOrders);
|
||||
// Copy a pattern selection to both the system clipboard and the internal clipboard.
|
||||
static bool Copy(const CSoundFile &sndFile, PATTERNINDEX pattern, PatternRect selection);
|
||||
// Copy a pattern or pattern channel to the internal pattern or channel clipboard.
|
||||
static bool Copy(const CSoundFile &sndFile, PATTERNINDEX pattern, CHANNELINDEX channel = CHANNELINDEX_INVALID);
|
||||
// Try pasting a pattern selection from the system clipboard.
|
||||
static bool Paste(CSoundFile &sndFile, PatternEditPos &pastePos, PasteModes mode, PatternRect &pasteRect, bool &orderChanged);
|
||||
// Try pasting a pattern selection from an internal clipboard.
|
||||
static bool Paste(CSoundFile &sndFile, PatternEditPos &pastePos, PasteModes mode, PatternRect &pasteRect, clipindex_t internalClipboard, bool &orderChanged);
|
||||
// Paste from pattern or channel clipboard.
|
||||
static bool Paste(CSoundFile &sndFile, PATTERNINDEX pattern, CHANNELINDEX channel = CHANNELINDEX_INVALID);
|
||||
// Copy one of the internal clipboards to the system clipboard.
|
||||
static bool SelectClipboard(clipindex_t which);
|
||||
// Switch to the next internal clipboard.
|
||||
static bool CycleForward();
|
||||
// Switch to the previous internal clipboard.
|
||||
static bool CycleBackward();
|
||||
// Set the maximum number of internal clipboards.
|
||||
static void SetClipboardSize(clipindex_t maxEntries);
|
||||
// Return the current number of clipboards.
|
||||
static clipindex_t GetClipboardSize() { return instance.m_clipboards.size(); };
|
||||
// Check whether patterns can be pasted from clipboard
|
||||
static bool CanPaste();
|
||||
|
||||
protected:
|
||||
PatternClipboard() { SetClipboardSize(1); };
|
||||
|
||||
static std::string GetFileExtension(const char *ext, bool addPadding);
|
||||
|
||||
static std::string FormatClipboardHeader(const CSoundFile &sndFile);
|
||||
|
||||
// Create the clipboard text for a pattern selection
|
||||
static std::string CreateClipboardString(const CSoundFile &sndFile, PATTERNINDEX pattern, PatternRect selection);
|
||||
|
||||
// Parse clipboard string and perform the pasting operation.
|
||||
static bool HandlePaste(CSoundFile &sndFile, PatternEditPos &pastePos, PasteModes mode, const std::string &data, PatternRect &pasteRect, bool &orderChanged);
|
||||
|
||||
// System-specific clipboard functions
|
||||
static bool ToSystemClipboard(const PatternClipboardElement &clipboard) { return ToSystemClipboard(clipboard.content); };
|
||||
static bool ToSystemClipboard(const std::string_view &data);
|
||||
static bool FromSystemClipboard(std::string &data);
|
||||
};
|
||||
|
||||
|
||||
class PatternClipboardDialog : public ResizableDialog
|
||||
{
|
||||
protected:
|
||||
// The one and only pattern clipboard dialog object
|
||||
static PatternClipboardDialog instance;
|
||||
|
||||
// Edit class for clipboard name editing
|
||||
class CInlineEdit : public CEdit
|
||||
{
|
||||
protected:
|
||||
PatternClipboardDialog &parent;
|
||||
|
||||
public:
|
||||
CInlineEdit(PatternClipboardDialog &dlg);
|
||||
|
||||
DECLARE_MESSAGE_MAP();
|
||||
|
||||
afx_msg void OnKillFocus(CWnd *newWnd);
|
||||
};
|
||||
|
||||
CSpinButtonCtrl m_numClipboardsSpin;
|
||||
CListBox m_clipList;
|
||||
CInlineEdit m_editNameBox;
|
||||
int m_posX = -1, m_posY = -1;
|
||||
bool m_isLocked = true, m_isCreated = false;
|
||||
|
||||
public:
|
||||
static void UpdateList();
|
||||
static void Show();
|
||||
static void Toggle()
|
||||
{
|
||||
if(instance.m_isCreated)
|
||||
instance.OnCancel();
|
||||
else
|
||||
instance.Show();
|
||||
}
|
||||
|
||||
protected:
|
||||
PatternClipboardDialog();
|
||||
|
||||
void DoDataExchange(CDataExchange *pDX) override;
|
||||
|
||||
void OnOK() override;
|
||||
void OnCancel() override;
|
||||
|
||||
afx_msg void OnNumClipboardsChanged();
|
||||
afx_msg void OnSelectClipboard();
|
||||
|
||||
// Edit clipboard name
|
||||
afx_msg void OnEditName();
|
||||
void OnEndEdit(bool apply = true);
|
||||
|
||||
DECLARE_MESSAGE_MAP();
|
||||
};
|
||||
|
||||
OPENMPT_NAMESPACE_END
|
Loading…
Add table
Add a link
Reference in a new issue