From f5306dc6a9c450f6ada538917bbd9a725a0285d4 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Sun, 20 Jan 2008 06:46:10 +0000 Subject: [PATCH] Re-worked the fonts collector log box to use wx's event system. If this doesn't fix the crashes, I'll try sacrificing a goat. Originally committed to SVN as r1787. --- aegisub/dialog_fonts_collector.cpp | 55 +++++++++++++++++++----------- aegisub/dialog_fonts_collector.h | 9 +++++ 2 files changed, 44 insertions(+), 20 deletions(-) diff --git a/aegisub/dialog_fonts_collector.cpp b/aegisub/dialog_fonts_collector.cpp index bc2411636..b8e8630a7 100644 --- a/aegisub/dialog_fonts_collector.cpp +++ b/aegisub/dialog_fonts_collector.cpp @@ -65,6 +65,12 @@ enum IDs { }; +///////// +// Event +DECLARE_EVENT_TYPE(EVT_ADD_TEXT, -1) +DEFINE_EVENT_TYPE(EVT_ADD_TEXT) + + /////////////// // Constructor DialogFontsCollector::DialogFontsCollector(wxWindow *parent) @@ -160,12 +166,18 @@ BEGIN_EVENT_TABLE(DialogFontsCollector, wxDialog) EVT_BUTTON(BROWSE_BUTTON,DialogFontsCollector::OnBrowse) EVT_BUTTON(wxID_CLOSE,DialogFontsCollector::OnClose) EVT_RADIOBOX(RADIO_BOX,DialogFontsCollector::OnRadio) + EVT_COMMAND(0,EVT_ADD_TEXT,DialogFontsCollector::OnAddText) END_EVENT_TABLE() //////////////////// // Start processing void DialogFontsCollector::OnStart(wxCommandEvent &event) { + // Clear + LogBox->SetReadOnly(false); + LogBox->ClearAll(); + LogBox->SetReadOnly(true); + // Action being done int action = CollectAction->GetSelection(); @@ -317,6 +329,23 @@ void DialogFontsCollector::Update(int value) { } +//////////// +// Add text +void DialogFontsCollector::OnAddText(wxCommandEvent &event) { + ColourString *str = (ColourString*) event.GetClientData(); + LogBox->SetReadOnly(false); + int pos = LogBox->GetLength(); + LogBox->AppendText(str->text); + if (str->colour) { + LogBox->StartStyling(pos,31); + LogBox->SetStyling(str->text.Length(),str->colour); + } + delete str; + LogBox->GotoPos(pos); + LogBox->SetReadOnly(true); +} + + /////////////////////// // Collect font files void FontsCollectorThread::CollectFontData () { @@ -354,13 +383,6 @@ wxThread::ExitCode FontsCollectorThread::Entry() { /////////// // Collect void FontsCollectorThread::Collect() { - // Clear log box - wxMutexGuiEnter(); - collector->LogBox->SetReadOnly(false); - collector->LogBox->ClearAll(); - collector->LogBox->SetReadOnly(true); - wxMutexGuiLeave(); - // Set destination folder int oper = collector->CollectAction->GetSelection(); destFolder = collector->DestBox->GetValue(); @@ -588,19 +610,12 @@ void FontsCollectorThread::AddFont(wxString fontname,int mode) { /////////////// // Append text void FontsCollectorThread::AppendText(wxString text,int colour) { - wxStyledTextCtrl *LogBox = collector->LogBox; - wxMutexGuiEnter(); - LogBox->SetReadOnly(false); - int pos = LogBox->GetLength(); - LogBox->AppendText(text); - if (colour) { - LogBox->StartStyling(pos,31); - LogBox->SetStyling(text.Length(),colour); - } - LogBox->GotoPos(pos); - LogBox->SetReadOnly(true); - //wxSafeYield(); - wxMutexGuiLeave(); + ColourString *str = new ColourString; + str->text = text; + str->colour = colour; + wxCommandEvent event(EVT_ADD_TEXT,0); + event.SetClientData(str); + collector->AddPendingEvent(event); } diff --git a/aegisub/dialog_fonts_collector.h b/aegisub/dialog_fonts_collector.h index d4e7b0c71..ff3ee3064 100644 --- a/aegisub/dialog_fonts_collector.h +++ b/aegisub/dialog_fonts_collector.h @@ -105,6 +105,7 @@ private: void OnClose(wxCommandEvent &event); void OnBrowse(wxCommandEvent &event); void OnRadio(wxCommandEvent &event); + void OnAddText(wxCommandEvent &event); void Update(int value=-1); public: @@ -113,3 +114,11 @@ public: DECLARE_EVENT_TABLE() }; + + +////////////////////////////////////// +// Helper class to pass strings along +struct ColourString { + wxString text; + int colour; +};