/* Copyright (C) 2023 Grok Image Compression Inc. This file is part of DCP-o-matic. DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with DCP-o-matic. If not, see . */ #pragma once #include "lib/grok/util.h" #include class GpuList : public wxPanel { public: GpuList(wxPanel* parent) : wxPanel(parent, wxID_ANY) { _combo_box = new wxComboBox(this, wxID_ANY, wxString{}, wxDefaultPosition, wxSize(400, -1)); _combo_box->Bind(wxEVT_COMBOBOX, &GpuList::OnComboBox, this); update(); auto sizer = new wxBoxSizer(wxHORIZONTAL); sizer->Add(_combo_box, 0, wxALIGN_CENTER_VERTICAL); SetSizerAndFit(sizer); } void update() { _combo_box->Clear(); for (auto const& name: get_gpu_names()) { _combo_box->Append(std_to_wx(name)); } } void set_selection(int sel) { if (sel < static_cast(_combo_box->GetCount())) { _combo_box->SetSelection(sel); } } private: void OnComboBox(wxCommandEvent&) { auto selection = _combo_box->GetSelection(); if (selection != wxNOT_FOUND) { auto grok = Config::instance()->grok(); grok.selected = selection; Config::instance()->set_grok(grok); } } wxComboBox* _combo_box; int _selection = 0; }; class GPUPage : public dcpomatic::preferences::Page { public: GPUPage(wxSize panel_size, int border) : Page(panel_size, border) {} wxString GetName() const override { return _("GPU"); } #ifdef DCPOMATIC_OSX /* XXX: this icon does not exist */ wxBitmap GetLargeIcon() const override { return wxBitmap(icon_path("gpu"), wxBITMAP_TYPE_PNG); } #endif private: void setup() override { _enable_gpu = new CheckBox(_panel, _("Enable GPU acceleration")); _panel->GetSizer()->Add(_enable_gpu, 0, wxALL | wxEXPAND, _border); wxFlexGridSizer* table = new wxFlexGridSizer(2, DCPOMATIC_SIZER_X_GAP, DCPOMATIC_SIZER_Y_GAP); table->AddGrowableCol(1, 1); _panel->GetSizer()->Add(table, 1, wxALL | wxEXPAND, _border); add_label_to_sizer(table, _panel, _("Acceleration binary folder"), true, 0, wxLEFT | wxLEFT | wxALIGN_CENTRE_VERTICAL); _binary_location = new wxDirPickerCtrl(_panel, wxDD_DIR_MUST_EXIST); table->Add(_binary_location, 1, wxEXPAND); add_label_to_sizer(table, _panel, _("GPU selection"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); _gpu_list_control = new GpuList(_panel); table->Add(_gpu_list_control, 1, wxEXPAND); add_label_to_sizer(table, _panel, _("License server"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); _server = new wxTextCtrl(_panel, wxID_ANY); table->Add(_server, 1, wxEXPAND | wxALL); add_label_to_sizer(table, _panel, _("License"), true, 0, wxLEFT | wxRIGHT | wxALIGN_CENTRE_VERTICAL); _licence = new PasswordEntry(_panel); table->Add(_licence->get_panel(), 1, wxEXPAND | wxALL); _enable_gpu->bind(&GPUPage::enable_gpu_changed, this); _binary_location->Bind(wxEVT_DIRPICKER_CHANGED, boost::bind (&GPUPage::binary_location_changed, this)); _server->Bind(wxEVT_TEXT, boost::bind(&GPUPage::server_changed, this)); _licence->Changed.connect(boost::bind(&GPUPage::licence_changed, this)); setup_sensitivity(); } void setup_sensitivity() { auto grok = Config::instance()->grok(); _binary_location->Enable(grok.enable); _gpu_list_control->Enable(grok.enable); _server->Enable(grok.enable); _licence->get_panel()->Enable(grok.enable); } void config_changed() override { auto grok = Config::instance()->grok(); checked_set(_enable_gpu, grok.enable); _binary_location->SetPath(std_to_wx(grok.binary_location.string())); _gpu_list_control->update(); _gpu_list_control->set_selection(grok.selected); checked_set(_server, grok.licence_server); checked_set(_licence, grok.licence); } void enable_gpu_changed() { auto grok = Config::instance()->grok(); grok.enable = _enable_gpu->GetValue(); Config::instance()->set_grok(grok); setup_sensitivity(); } void binary_location_changed() { auto grok = Config::instance()->grok(); grok.binary_location = wx_to_std(_binary_location->GetPath()); Config::instance()->set_grok(grok); _gpu_list_control->update(); } void server_changed() { auto grok = Config::instance()->grok(); grok.licence_server = wx_to_std(_server->GetValue()); Config::instance()->set_grok(grok); } void port_changed() { auto grok = Config::instance()->grok(); Config::instance()->set_grok(grok); } void licence_changed() { auto grok = Config::instance()->grok(); grok.licence = _licence->get(); Config::instance()->set_grok(grok); } CheckBox* _enable_gpu = nullptr; wxDirPickerCtrl* _binary_location = nullptr; GpuList* _gpu_list_control = nullptr; wxTextCtrl* _server = nullptr; PasswordEntry* _licence = nullptr; };