Работа с буфером обмена в wxLuaПодписка на Комментарии к "Работа с буфером обмена в wxLua"

Аватар xxblx

Для работы с буфером обмена в wxWidgets предусмотрен класс wxClipboard, в этой записи речь пойдет об использовании wxClipboard в wxLua.

Для начала, чтобы было наглядно, создадим небольшой фрейм, на котором будут присутствовать четыре элемента - две пары: текстовое поле + кнопка, для операций "Копировать" и "Вставить".

-- wxLua
local wx = require("wx")

-- Интерфейс
local UI = {}

-- Фрейм
UI.frame = wx.wxFrame (wx.NULL, wx.wxID_ANY, "wxLua - Clipboard", wx.wxDefaultPosition, wx.wxSize(250, 180), wx.wxDEFAULT_FRAME_STYLE+wx.wxTAB_TRAVERSAL)
UI.frame:SetSizeHints(wx.wxDefaultSize, wx.wxDefaultSize)

-- Вертикальный сайзер       
UI.sizer = wx.wxBoxSizer(wx.wxVERTICAL)

-- Поле для ввода текста, который будет скопирован
UI.textCtrl_copy = wx.wxTextCtrl(UI.frame, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.textCtrl_copy, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)

-- Кнопка Copy
UI.button_copy = wx.wxButton(UI.frame, wx.wxID_ANY, "Copy", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.button_copy, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)

-- Поле для текста, который будет вставлен
UI.textCtrl_paste = wx.wxTextCtrl(UI.frame, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.textCtrl_paste, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)

-- Кнопка Paste
UI.button_paste = wx.wxButton(UI.frame, wx.wxID_ANY, "Paste", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.button_paste, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)
       
UI.frame:SetSizer(UI.sizer)
UI.frame:Layout()
       
UI.frame:Centre(wx.wxBOTH)

-- Делаем фрейм видимым и запускаем приложение
UI.frame:Show(true)
wx.wxGetApp():MainLoop()

snimok-wxlua_-_clipboard.png

Что будет происходить по нажатию кнопок:
Copy

  • чтение содержимого поля UI.textCtrl_copy;
  • открытие буфера обмена;
  • размещение в буфере обмена нового текстового объекта wxTextDataObject с текстом из UI.textCtrl_copy;
  • закрытие буфера обмена.

Paste

  • создание переменной с типом текстовый объект wxTextDataObject;
  • открытие буфера обмена;
  • чтение и размещение содержимого буфера обмена в вышеупомянутую переменную;
  • закрытие буфера обмена;
  • чтение текста из переменной - текстового объекта;
  • добавление полученного текста с замещением текущего в текстовое поле UI.textCtrl_paste.

Добавим обработку события для нажатия кнопки Copy.

-- wxLua
local wx = require("wx")

-- Интерфейс
local UI = {}

-- Фрейм
UI.frame = wx.wxFrame (wx.NULL, wx.wxID_ANY, "wxLua - Clipboard", wx.wxDefaultPosition, wx.wxSize(250, 180), wx.wxDEFAULT_FRAME_STYLE+wx.wxTAB_TRAVERSAL)
UI.frame:SetSizeHints(wx.wxDefaultSize, wx.wxDefaultSize)

-- Вертикальный сайзер       
UI.sizer = wx.wxBoxSizer(wx.wxVERTICAL)

-- Поле для ввода текста, который будет скопирован
UI.textCtrl_copy = wx.wxTextCtrl(UI.frame, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.textCtrl_copy, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)

-- Кнопка Copy
UI.button_copy = wx.wxButton(UI.frame, wx.wxID_ANY, "Copy", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.button_copy, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)

-- Поле для текста, который будет вставлен
UI.textCtrl_paste = wx.wxTextCtrl(UI.frame, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.textCtrl_paste, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)

-- Кнопка Paste
UI.button_paste = wx.wxButton(UI.frame, wx.wxID_ANY, "Paste", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.button_paste, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)
       
UI.frame:SetSizer(UI.sizer)
UI.frame:Layout()
       
UI.frame:Centre(wx.wxBOTH)

-- Обработка нажатия кнопки Copy
UI.button_copy:Connect(wx.wxID_ANY, wx.wxEVT_COMMAND_BUTTON_CLICKED,
        function(event)
               
                -- Если поле UI.textCtrl_copy не пустое
                if (UI.textCtrl_copy:GetValue() and UI.textCtrl_copy:GetValue() ~= "") then
                       
                        -- Буфер обмена
                        local cb = wx.wxClipboard.Get()
                       
                        -- Если буфер обмена открыт (удается открыть)
                        if (cb:Open()) then
                                -- Получаем текст из UI.textCtrl_copy
                                local text = UI.textCtrl_copy:GetValue()
                                -- Добавляем его в буфер обмена
                                cb:SetData(wx.wxTextDataObject(text))
                                -- Закрываем буфер обмена
                                cb:Close()
                        end
                end
               
        end
)


-- Делаем фрейм видимым и запускаем приложение
UI.frame:Show(true)
wx.wxGetApp():MainLoop()

Если поле UI.textCtrl_copy не пустое, его содержимое будет скопировано в буфер обмена. Важно заметить, скопированная в буфер обмена информация будет доступна только пока запущено приложение! Когда приложение будет закрыто, помещенная в буфер обмена информация будет автоматически удалена.
Чтобы избежать удаления информации из буфера при закрытии приложения, у wxClipboard имеется метод Flush, но он не поддерживается в X11-портах wxWidgets, в том числе в wxGTK.

Добавим обработку события для нажатия кнопки Paste.

-- wxLua
local wx = require("wx")

-- Интерфейс
local UI = {}

-- Фрейм
UI.frame = wx.wxFrame (wx.NULL, wx.wxID_ANY, "wxLua - Clipboard", wx.wxDefaultPosition, wx.wxSize(250, 180), wx.wxDEFAULT_FRAME_STYLE+wx.wxTAB_TRAVERSAL)
UI.frame:SetSizeHints(wx.wxDefaultSize, wx.wxDefaultSize)

-- Вертикальный сайзер       
UI.sizer = wx.wxBoxSizer(wx.wxVERTICAL)

-- Поле для ввода текста, который будет скопирован
UI.textCtrl_copy = wx.wxTextCtrl(UI.frame, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.textCtrl_copy, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)

-- Кнопка Copy
UI.button_copy = wx.wxButton(UI.frame, wx.wxID_ANY, "Copy", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.button_copy, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)

-- Поле для текста, который будет вставлен
UI.textCtrl_paste = wx.wxTextCtrl(UI.frame, wx.wxID_ANY, "", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.textCtrl_paste, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)

-- Кнопка Paste
UI.button_paste = wx.wxButton(UI.frame, wx.wxID_ANY, "Paste", wx.wxDefaultPosition, wx.wxDefaultSize, 0)
UI.sizer:Add(UI.button_paste, 0, wx.wxALIGN_CENTER + wx.wxALL, 5)
       
UI.frame:SetSizer(UI.sizer)
UI.frame:Layout()
       
UI.frame:Centre(wx.wxBOTH)

-- Обработка нажатия кнопки Copy
UI.button_copy:Connect(wx.wxID_ANY, wx.wxEVT_COMMAND_BUTTON_CLICKED,
        function(event)
               
                -- Если поле UI.textCtrl_copy не пустое
                if (UI.textCtrl_copy:GetValue() and UI.textCtrl_copy:GetValue() ~= "") then
                       
                        -- Буфер обмена
                        local cb = wx.wxClipboard.Get()
                       
                        -- Если буфер обмена открыт (удается открыть)
                        if (cb:Open()) then
                                -- Получаем текст из UI.textCtrl_copy
                                local text = UI.textCtrl_copy:GetValue()
                                -- Добавляем его в буфер обмена
                                cb:SetData(wx.wxTextDataObject(text))
                                -- Закрываем буфер обмена
                                cb:Close()
                        end
               
                end
               
        end
)

-- Обработка нажатия кнопки Paste
UI.button_paste:Connect(wx.wxID_ANY, wx.wxEVT_COMMAND_BUTTON_CLICKED,
        function(event)
               
                -- Буфер обмена
                local cb = wx.wxClipboard.Get()
                -- Переменная под содержимое буфера обмена
                local t = wx.wxTextDataObject()
               
                -- Если буфер обмена открыт (удается открыть)
                if (cb:Open()) then
                        -- Получаем содержимое из буфера обмена
                        cb:GetData(t)
                        -- Закрываем буфер обмена
                        cb:Close()
                end
               
                -- Если какой-то текст из буфера обмена получен
                if (t:GetText() and t:GetText() ~= "") then
                        -- Размещаем полученный текст в UI.textCtrl_paste
                        UI.textCtrl_paste:SetValue(t:GetText())
                end
               
        end
)

-- Делаем фрейм видимым и запускаем приложение
UI.frame:Show(true)
wx.wxGetApp():MainLoop()

Если ввести текст в UI.textCtrl_copy и нажать Copy, после нажать Paste, введенный в UI.textCtrl_copy текст отобразиться и в UI.textCtrl_paste.

p.s. я использую wxLua 2.8.12.3 собранную для использования с Lua 5.2 и wxWidgets (wxGTK) 2.9.5, с другими версиями Lua и wxGTK не проверял.

Похожие материалы:

Добавить комментарий