123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- /*
- * 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
|