Skip to content

Commit

Permalink
refactored config, added desktop widget, refactored model info
Browse files Browse the repository at this point in the history
  • Loading branch information
fszontagh committed Dec 4, 2024
1 parent d50ae08 commit d8b532e
Show file tree
Hide file tree
Showing 21 changed files with 1,182 additions and 651 deletions.
9 changes: 9 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,11 @@ set(SOURCES
src/ui/MainWindowCivitAiWindow.cpp
src/ui/MainWindowImageDialog.cpp
src/ui/MainWindowUI.cpp
src/ui/MainWindowDesktopWidget.cpp
src/ui/QueueManager.cpp
src/ui/ModelInfo.cpp
src/libs/SharedMemoryManager.cpp

)

if (WIN32)
Expand All @@ -94,6 +96,13 @@ add_subdirectory(extprocess)
add_executable(${PROJECT_BINARY_NAME} ${SOURCES})
target_precompile_headers(${PROJECT_BINARY_NAME} PRIVATE src/pch.h)

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
target_compile_options(${PROJECT_BINARY_NAME} PRIVATE -Wunused)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
target_compile_options(${PROJECT_BINARY_NAME} PRIVATE /w44265) # Hasonló figyelmeztetés MSVC-ben
endif()


if (NOT WIN32)

set(APPDEPENDS wx::base wx::core wx::xrc wx::aui wx::richtext)
Expand Down
2 changes: 1 addition & 1 deletion extprocess/src/pch.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <cstring>
#endif

#include "libs/json.hpp"

#include "ver.hpp"
#include "config.hpp"
Expand All @@ -27,7 +28,6 @@
#include "helpers/sslUtils.hpp"
#include "libs/SharedLibrary.h"
#include "libs/SharedMemoryManager.h"
#include "libs/json.hpp"
#include "ui/QueueManager.h"


Expand Down
Binary file added graphics/icons/16/drag.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
437 changes: 306 additions & 131 deletions graphics/window_3.2_tmp.fbp

Large diffs are not rendered by default.

29 changes: 16 additions & 13 deletions src/MainApp.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,11 @@ class MainApp : public wxApp {
wxSingleInstanceChecker* m_checker;

public:
const wxString getIniPath() { return this->iniPath; }
bool OnInit() override {
wxString forceType = "";
bool allow_multiple_instance = false;
this->backend = "cpu";
bool disableExternalProcessHandling = false;
this->iniPath = wxStandardPaths::Get().GetUserConfigDir() + wxFileName::GetPathSeparator() + "sd.ui.config.ini";

this->initConfig();

Expand Down Expand Up @@ -112,10 +110,10 @@ class MainApp : public wxApp {

// load locale

auto configLang = this->config->Read("language", wxUILocale::GetLanguageInfo(wxUILocale::GetSystemLocale())->CanonicalName.utf8_string());
auto configLang = this->config->Read("/language", wxUILocale::GetSystemLocaleId().GetLanguage());
// if empty, use system (empty while edited with manually the ini file)
if (configLang.empty()) {
configLang = wxUILocale::GetLanguageInfo(wxUILocale::GetSystemLocale())->CanonicalName.utf8_string();
configLang = wxUILocale::GetSystemLocaleId().GetLanguage();
}

// trans->SetLanguage(configLang);
Expand All @@ -125,6 +123,9 @@ class MainApp : public wxApp {
}
int OnExit() override {
delete m_checker;
if (this->cfg != nullptr) {
delete this->cfg;
}
return 0;
}
void ReloadMainWindow(wxString newLangName, bool disableExternalProcessHandling = false) {
Expand Down Expand Up @@ -159,28 +160,30 @@ class MainApp : public wxApp {

this->mainFrame = new MainWindowUI(nullptr, this->dllName.utf8_string(), this->backend.utf8_string(), disableExternalProcessHandling, this);
SetTopWindow(this->mainFrame);
this->mainFrame->Centre();
this->mainFrame->Show();
};

void inline initConfig() {
if (this->config) {
wxDELETE(this->config);
if (this->config != nullptr) {
this->config->Flush();
delete this->config;
this->config = nullptr;
}
if (this->cfg != nullptr) {
delete this->cfg;
}
this->config = new wxFileConfig(PROJECT_NAME, SD_GUI_AUTHOR, this->getIniPath(), wxEmptyString, wxCONFIG_USE_LOCAL_FILE);
this->config->SetVendorName(SD_GUI_AUTHOR);
this->config->SetAppName(PROJECT_NAME);
this->config->DisableAutoSave();
this->config = new wxConfig(PROJECT_NAME, SD_GUI_AUTHOR, wxEmptyString, wxEmptyString, wxCONFIG_USE_LOCAL_FILE);
this->cfg = new sd_gui_utils::config(this->config);
wxConfigBase::Set(this->config);
}

wxFileConfig* config = nullptr;
wxConfigBase* config = nullptr;
sd_gui_utils::config* cfg = nullptr;

private:
MainWindowUI* mainFrame = nullptr;
wxString dllName;
wxString backend;
wxString iniPath;
wxLocale* m_Locale = nullptr;
};
#endif
2 changes: 2 additions & 0 deletions src/pch.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
#include "wx/sstream.h"
#include "wx/txtstrm.h"

#include "libs/json.hpp"

#include "extprocess/config.hpp"
#include "exiv2/exiv2.hpp"

Expand Down
77 changes: 59 additions & 18 deletions src/ui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include "embedded_files/cube.png.h"
#include "embedded_files/dice_four.png.h"
#include "embedded_files/disk.png.h"
#include "embedded_files/drag.png.h"
#include "embedded_files/file_import.png.h"
#include "embedded_files/forward.png.h"
#include "embedded_files/images.png.h"
Expand Down Expand Up @@ -138,21 +139,30 @@ mainUI::mainUI( wxWindow* parent, wxWindowID id, const wxString& title, const wx
sizer0021->Add( bSizer100, 0, wxEXPAND, 5 );

wxBoxSizer* bSizer120;
bSizer120 = new wxBoxSizer( wxHORIZONTAL );
bSizer120 = new wxBoxSizer( wxVERTICAL );

m_currentStatus = new wxStaticText( m_panel10, wxID_ANY, _("Current job: none"), wxDefaultPosition, wxDefaultSize, 0 );
m_currentStatus->Wrap( -1 );
m_currentStatus->SetMinSize( wxSize( 300,-1 ) );

bSizer120->Add( m_currentStatus, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
bSizer120->Add( m_currentStatus, 0, wxLEFT|wxTOP, 5 );

m_currentProgress = new wxGauge( m_panel10, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL|wxGA_SMOOTH );
m_currentProgress = new wxGauge( m_panel10, wxID_ANY, 100, wxDefaultPosition, wxSize( 300,-1 ), wxGA_HORIZONTAL|wxGA_SMOOTH );
m_currentProgress->SetValue( 0 );
bSizer120->Add( m_currentProgress, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
bSizer120->Add( m_currentProgress, 0, wxLEFT, 5 );


sizer0021->Add( bSizer120, 1, wxEXPAND, 5 );

wxBoxSizer* bSizer123;
bSizer123 = new wxBoxSizer( wxVERTICAL );

m_showWidget = new wxButton( m_panel10, wxID_ANY, _("Show Widget"), wxDefaultPosition, wxDefaultSize, 0 );
bSizer123->Add( m_showWidget, 0, wxALL, 5 );


sizer0021->Add( bSizer123, 1, wxEXPAND, 5 );


m_panel10->SetSizer( sizer0021 );
m_panel10->Layout();
Expand Down Expand Up @@ -1469,6 +1479,7 @@ mainUI::mainUI( wxWindow* parent, wxWindowID id, const wxString& title, const wx
m_stop_background_process->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( mainUI::OnStopBackgroundProcess ), NULL, this );
m_model->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( mainUI::onModelSelect ), NULL, this );
m_type->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( mainUI::onTypeSelect ), NULL, this );
m_showWidget->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( mainUI::OnShowWidget ), NULL, this );
m_vae->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( mainUI::onVaeSelect ), NULL, this );
vaeOnCpu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( mainUI::onVAEOnCpu ), NULL, this );
clipOnCpu->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( mainUI::onClipOnCpu ), NULL, this );
Expand Down Expand Up @@ -1551,6 +1562,7 @@ mainUI::~mainUI()
m_stop_background_process->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( mainUI::OnStopBackgroundProcess ), NULL, this );
m_model->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( mainUI::onModelSelect ), NULL, this );
m_type->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( mainUI::onTypeSelect ), NULL, this );
m_showWidget->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( mainUI::OnShowWidget ), NULL, this );
m_vae->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( mainUI::onVaeSelect ), NULL, this );
vaeOnCpu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( mainUI::onVAEOnCpu ), NULL, this );
clipOnCpu->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( mainUI::onClipOnCpu ), NULL, this );
Expand Down Expand Up @@ -2424,40 +2436,69 @@ CivitAiWindow::~CivitAiWindow()

}

DesktopWidget::DesktopWidget( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxPanel( parent, id, pos, size, style, name )
DesktopWidget::DesktopWidget( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : wxFrame( parent, id, title, pos, size, style, name )
{
this->SetExtraStyle( wxWS_EX_PROCESS_UI_UPDATES|wxWS_EX_TRANSIENT );
this->SetForegroundColour( wxColour( 224, 224, 224 ) );
this->SetBackgroundColour( wxColour( 48, 48, 48 ) );
this->SetSizeHints( wxDefaultSize, wxDefaultSize );
this->SetExtraStyle( wxWS_EX_TRANSIENT );

wxBoxSizer* bSizer122;
bSizer122 = new wxBoxSizer( wxHORIZONTAL );

m_staticText64 = new wxStaticText( this, wxID_ANY, _("Status:"), wxDefaultPosition, wxSize( 240,-1 ), 0 );
m_staticText64->Wrap( -1 );
bSizer122->Add( m_staticText64, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
wxBoxSizer* bSizer128;
bSizer128 = new wxBoxSizer( wxVERTICAL );

m_currentStatus = new wxStaticText( this, wxID_ANY, _("Current job: none"), wxDefaultPosition, wxSize( -1,-1 ), 0 );
m_currentStatus->Wrap( -1 );
m_currentStatus->SetExtraStyle( wxWS_EX_BLOCK_EVENTS );

bSizer128->Add( m_currentStatus, 1, wxALL|wxEXPAND, 5 );

m_currentProgress = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL );
m_currentProgress->SetValue( 0 );
m_currentProgress->SetExtraStyle( wxWS_EX_BLOCK_EVENTS );

m_statusProgress = new wxGauge( this, wxID_ANY, 100, wxDefaultPosition, wxDefaultSize, wxGA_HORIZONTAL );
m_statusProgress->SetValue( 0 );
bSizer122->Add( m_statusProgress, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
bSizer128->Add( m_currentProgress, 0, wxALL|wxEXPAND, 5 );


bSizer122->Add( bSizer128, 1, wxALL|wxEXPAND, 5 );

wxBoxSizer* bSizer127;
bSizer127 = new wxBoxSizer( wxVERTICAL );

bSizer127->SetMinSize( wxSize( 24,-1 ) );
m_bitmap10 = new wxStaticBitmap( this, wxID_ANY, drag_png_to_wx_bitmap(), wxDefaultPosition, wxDefaultSize, 0 );
m_bitmap10->SetToolTip( _("Hold left mouse button to drag the widget\nDouble click to show main window") );

bSizer127->Add( m_bitmap10, 0, wxALL, 5 );


bSizer122->Add( bSizer127, 0, wxALIGN_CENTER_VERTICAL, 5 );


this->SetSizer( bSizer122 );
this->Layout();

this->Centre( wxBOTH );

// Connect Events
this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DesktopWidget::OnClose ) );
this->Connect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( DesktopWidget::OnMouseEnter ) );
this->Connect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( DesktopWidget::OnMouseLeave ) );
this->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DesktopWidget::OnMouseLeftDown ) );
this->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DesktopWidget::OnMouseLeftUp ) );
this->Connect( wxEVT_MOTION, wxMouseEventHandler( DesktopWidget::OnMouseMotion ) );
m_bitmap10->Connect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( DesktopWidget::OnLeftMouseDClick ), NULL, this );
m_bitmap10->Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DesktopWidget::OnMouseLeftDown ), NULL, this );
m_bitmap10->Connect( wxEVT_LEFT_UP, wxMouseEventHandler( DesktopWidget::OnMouseLeftUp ), NULL, this );
}

DesktopWidget::~DesktopWidget()
{
// Disconnect Events
this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DesktopWidget::OnClose ) );
this->Disconnect( wxEVT_ENTER_WINDOW, wxMouseEventHandler( DesktopWidget::OnMouseEnter ) );
this->Disconnect( wxEVT_LEAVE_WINDOW, wxMouseEventHandler( DesktopWidget::OnMouseLeave ) );
this->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DesktopWidget::OnMouseLeftDown ) );
this->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DesktopWidget::OnMouseLeftUp ) );
this->Disconnect( wxEVT_MOTION, wxMouseEventHandler( DesktopWidget::OnMouseMotion ) );
m_bitmap10->Disconnect( wxEVT_LEFT_DCLICK, wxMouseEventHandler( DesktopWidget::OnLeftMouseDClick ), NULL, this );
m_bitmap10->Disconnect( wxEVT_LEFT_DOWN, wxMouseEventHandler( DesktopWidget::OnMouseLeftDown ), NULL, this );
m_bitmap10->Disconnect( wxEVT_LEFT_UP, wxMouseEventHandler( DesktopWidget::OnMouseLeftUp ), NULL, this );

}
14 changes: 10 additions & 4 deletions src/ui/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class mainUI : public wxFrame
wxChoice* m_type;
wxStaticText* m_currentStatus;
wxGauge* m_currentProgress;
wxButton* m_showWidget;
wxPanel* m_panel12;
wxScrolledWindow* m_scrolledWindow1;
wxStaticText* m_staticText161;
Expand Down Expand Up @@ -247,6 +248,7 @@ class mainUI : public wxFrame
virtual void OnStopBackgroundProcess( wxCommandEvent& event ) { event.Skip(); }
virtual void onModelSelect( wxCommandEvent& event ) { event.Skip(); }
virtual void onTypeSelect( wxCommandEvent& event ) { event.Skip(); }
virtual void OnShowWidget( wxCommandEvent& event ) { event.Skip(); }
virtual void onVaeSelect( wxCommandEvent& event ) { event.Skip(); }
virtual void onVAEOnCpu( wxCommandEvent& event ) { event.Skip(); }
virtual void onClipOnCpu( wxCommandEvent& event ) { event.Skip(); }
Expand Down Expand Up @@ -546,24 +548,28 @@ class CivitAiWindow : public wxFrame
///////////////////////////////////////////////////////////////////////////////
/// Class DesktopWidget
///////////////////////////////////////////////////////////////////////////////
class DesktopWidget : public wxPanel
class DesktopWidget : public wxFrame
{
private:

protected:
wxStaticText* m_staticText64;
wxGauge* m_statusProgress;
wxStaticText* m_currentStatus;
wxGauge* m_currentProgress;
wxStaticBitmap* m_bitmap10;

// Virtual event handlers, override them in your derived class
virtual void OnClose( wxCloseEvent& event ) { event.Skip(); }
virtual void OnMouseEnter( wxMouseEvent& event ) { event.Skip(); }
virtual void OnMouseLeave( wxMouseEvent& event ) { event.Skip(); }
virtual void OnMouseMotion( wxMouseEvent& event ) { event.Skip(); }
virtual void OnLeftMouseDClick( wxMouseEvent& event ) { event.Skip(); }
virtual void OnMouseLeftDown( wxMouseEvent& event ) { event.Skip(); }
virtual void OnMouseLeftUp( wxMouseEvent& event ) { event.Skip(); }


public:

DesktopWidget( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 400,40 ), long style = wxBORDER_NONE|wxCLIP_CHILDREN|wxNO_FULL_REPAINT_ON_RESIZE, const wxString& name = wxEmptyString );
DesktopWidget( wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 400,-1 ), long style = wxFRAME_NO_TASKBAR|wxSTAY_ON_TOP|wxBORDER_NONE, const wxString& name = wxT("DesktopWidget") );

~DesktopWidget();

Expand Down
24 changes: 14 additions & 10 deletions src/ui/MainWindowCivitAiWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,19 +103,20 @@ void MainWindowCivitAiWindow::m_model_downloadOnButtonClick(wxCommandEvent& even
auto parentItem = this->m_dataViewListCtrl5->RowToItem(parentSelection);
nlohmann::json* parent_jsptr = reinterpret_cast<nlohmann::json*>(this->m_dataViewListCtrl5->GetItemData(parentItem));
nlohmann::json parent_js(*parent_jsptr);
auto path = sd_gui_utils::normalizePath(this->config->model + "/" + js["name"].get<std::string>());

wxFileName path = wxFileName(this->config->model + wxFileName::GetPathSeparators() + js["name"].get<std::string>());

if (parent_js.contains("type") && !parent_js["type"].is_null()) {
std::string type = parent_js["type"].get<std::string>();
if (type == CivitAi::ModelTypesNames[CivitAi::ModelTypes::LORA]) {
ditem->type = CivitAi::ModelTypes::LORA;
path = sd_gui_utils::normalizePath(this->config->lora + "/" + js["name"].get<std::string>());
path = wxFileName(this->config->lora + wxFileName::GetPathSeparators() + js["name"].get<std::string>());
} else if (type == CivitAi::ModelTypesNames[CivitAi::ModelTypes::Checkpoint]) {
ditem->type = CivitAi::ModelTypes::Checkpoint;
path = sd_gui_utils::normalizePath(this->config->model + "/" + js["name"].get<std::string>());
path = wxFileName(this->config->model + wxFileName::GetPathSeparators() + js["name"].get<std::string>());
} else if (type == CivitAi::ModelTypesNames[CivitAi::ModelTypes::TextualInversion]) {
ditem->type = CivitAi::ModelTypes::TextualInversion;
path = sd_gui_utils::normalizePath(this->config->embedding + "/" + js["name"].get<std::string>());
path = wxFileName(this->config->embedding + wxFileName::GetPathSeparators() + js["name"].get<std::string>());
} else {
// no type
delete ditem;
Expand All @@ -130,10 +131,10 @@ void MainWindowCivitAiWindow::m_model_downloadOnButtonClick(wxCommandEvent& even
// example: https://civitai.com/api/v1/models/1102
if (js.contains("type")) {
if (js["type"].get<std::string>() == "LORA") {
path = sd_gui_utils::normalizePath(this->config->lora + "/" + js["name"].get<std::string>());
path = wxFileName(this->config->lora + wxFileName::GetPathSeparators() + js["name"].get<std::string>());
}
if (js["type"].get<std::string>() == "VAE") {
path = sd_gui_utils::normalizePath(this->config->vae + "/" + js["name"].get<std::string>());
path = wxFileName(this->config->vae + wxFileName::GetPathSeparators() + js["name"].get<std::string>());
}
}

Expand All @@ -145,8 +146,8 @@ void MainWindowCivitAiWindow::m_model_downloadOnButtonClick(wxCommandEvent& even
return;
}

ditem->local_file = path;
ditem->tmp_name = std::filesystem::path(path).replace_extension(".download").string();
ditem->local_file = path.GetAbsolutePath().utf8_string();
ditem->tmp_name = std::filesystem::path(ditem->local_file).replace_extension(".download").string();
ditem->targetSize = js["sizeKB"].get<double>() * 1024;
if (std::filesystem::exists(ditem->local_file) || std::filesystem::exists(ditem->tmp_name)) {
wxMessageDialog dialog(this, wxString::Format(_("The file \n'%s'\n already exists.\nDo you want to overwrite it?"), ditem->local_file), _("Download Model"), wxYES_NO | wxICON_QUESTION);
Expand Down Expand Up @@ -390,7 +391,10 @@ void MainWindowCivitAiWindow::loadImages(nlohmann::json js) {
for (auto img : js["images"]) {
int img_id = img["id"].get<int>();
bool downloaded = false;
std::filesystem::path path(this->config->tmppath + "/" + std::to_string(img_id));

auto _p = this->config->tmppath; //+ wxFileName::GetPathSeparator().GetValue() << std::to_string(img_id);
_p.Append(wxFileName::GetPathSeparators() + std::to_string(img_id));
std::filesystem::path path(_p.utf8_string());

auto png = path.replace_extension("png").string();
auto jpg = path.replace_extension("jpg").string();
Expand Down Expand Up @@ -580,7 +584,7 @@ void MainWindowCivitAiWindow::modelDownloadThread(CivitAi::DownloadItem* item) {
item->error = wxString::Format(_("Download failed: %s"), curl.errorCodeToString());
this->SendThreadEvent("DOWNLOAD_ERROR", item);
return;
}
}
if (item->targetSize != item->downloadedSize) {
item->error = _("Download failed");
this->SendThreadEvent("DOWNLOAD_ERROR", item);
Expand Down
Loading

0 comments on commit d8b532e

Please sign in to comment.