aboutsummaryrefslogtreecommitdiff
path: root/Src/external_dependencies/openmpt-trunk/mptrack/PatternClipboard.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/external_dependencies/openmpt-trunk/mptrack/PatternClipboard.h')
-rw-r--r--Src/external_dependencies/openmpt-trunk/mptrack/PatternClipboard.h160
1 files changed, 160 insertions, 0 deletions
diff --git a/Src/external_dependencies/openmpt-trunk/mptrack/PatternClipboard.h b/Src/external_dependencies/openmpt-trunk/mptrack/PatternClipboard.h
new file mode 100644
index 00000000..0054ca29
--- /dev/null
+++ b/Src/external_dependencies/openmpt-trunk/mptrack/PatternClipboard.h
@@ -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