wxWidgets integration module example

Below you can find source code of a wxwidgets_integration example that showcases usage of the libbase integration module for wxWidgets library. This example is located in the /examples/wxwidgets_integration/ directory in the repository and - if enabled - will be built along the libbase library itself.

CMakeLists.txt
 1add_executable(wxwidgets_integration_example WIN32 "")
 2
 3target_compile_options(wxwidgets_integration_example
 4  PRIVATE
 5    ${LIBBASE_COMPILE_FLAGS}
 6)
 7
 8target_link_libraries(wxwidgets_integration_example
 9  PRIVATE
10    libbase
11    libbase_wx
12)
13
14target_sources(wxwidgets_integration_example
15  PRIVATE
16    app.cc
17    app.h
18    main_frame.cc
19    main_frame.h
20    main.cc
21)
main.cc
1#include "app.h"
2
3#include "wx/app.h"
4
5wxIMPLEMENT_APP(IntegrationExample);
app.h
 1#pragma once
 2
 3#include <memory>
 4
 5#include "base/message_loop/wx/wx_message_loop_attachment.h"
 6#include "base/threading/thread.h"
 7
 8#include "wx/app.h"
 9
10class IntegrationExample : public wxApp {
11 public:
12  bool OnInit() override;
13  int OnExit() override;
14
15 private:
16  std::unique_ptr<base::wx::WxMessageLoopAttachment> message_loop_attachment_;
17  base::Thread worker_thread_;
18};
app.cc
 1#include "app.h"
 2#include "main_frame.h"
 3
 4bool IntegrationExample::OnInit() {
 5  message_loop_attachment_ =
 6      std::make_unique<base::wx::WxMessageLoopAttachment>(this);
 7  worker_thread_.Start();
 8
 9  auto* frame = new MainFrame(worker_thread_.TaskRunner());
10  frame->Show(true);
11  return true;
12}
13
14int IntegrationExample::OnExit() {
15  worker_thread_.Stop();
16  message_loop_attachment_.reset();
17  return 0;
18}
main_frame.h
 1#pragma once
 2
 3#include <memory>
 4
 5#include "base/sequenced_task_runner.h"
 6#include "base/synchronization/waitable_event.h"
 7
 8#include "wx/button.h"
 9#include "wx/frame.h"
10
11class MainFrame : public wxFrame {
12 public:
13  MainFrame(std::shared_ptr<base::SequencedTaskRunner> task_runner);
14
15 private:
16  void OnButtonClicked(wxCommandEvent& event);
17  void ShowMessageBox();
18
19  std::shared_ptr<base::SequencedTaskRunner> task_runner_;
20  wxButton* m_button;
21
22  base::WeakPtr<MainFrame> weak_this_;
23  base::WeakPtrFactory<MainFrame> weak_factory_{this};
24};
main_frame.cc
 1#include "main_frame.h"
 2
 3#include "wx/msgdlg.h"
 4#include "wx/panel.h"
 5
 6MainFrame::MainFrame(std::shared_ptr<base::SequencedTaskRunner> task_runner)
 7    : wxFrame(nullptr,
 8              wxID_ANY,
 9              "wxWidgets integration example",
10              wxDefaultPosition,
11              wxSize(400, 200)),
12      task_runner_(std::move(task_runner)),
13      weak_factory_(this) {
14  weak_this_ = weak_factory_.GetWeakPtr();
15
16  auto* panel = new wxPanel(this, wxID_ANY);
17  m_button = new wxButton(panel, wxID_ANY, "Click Me", wxPoint(150, 70),
18                          wxDefaultSize);
19
20  m_button->Bind(wxEVT_BUTTON, &MainFrame::OnButtonClicked, this);
21}
22
23void MainFrame::OnButtonClicked(wxCommandEvent&) {
24  DCHECK(!task_runner_->RunsTasksInCurrentSequence());
25
26  task_runner_->PostTaskAndReply(
27      FROM_HERE, base::BindOnce([]() {
28        // some work on worker thread
29      }),
30      base::BindOnce(&MainFrame::ShowMessageBox, weak_this_));
31}
32
33void MainFrame::ShowMessageBox() {
34  DCHECK(!task_runner_->RunsTasksInCurrentSequence());
35
36  wxMessageBox("Hello world!", "Message", wxOK | wxICON_INFORMATION);
37}