forked from dolphin-emu/dolphin
		
	
		
			
				
	
	
		
			147 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright 2018 Dolphin Emulator Project
 | 
						|
// Licensed under GPLv2+
 | 
						|
// Refer to the license.txt file included.
 | 
						|
 | 
						|
#include "Updater/UI.h"
 | 
						|
 | 
						|
#include <CommCtrl.h>
 | 
						|
 | 
						|
#include <string>
 | 
						|
 | 
						|
#include "Common/Flag.h"
 | 
						|
#include "Common/StringUtil.h"
 | 
						|
 | 
						|
namespace
 | 
						|
{
 | 
						|
HWND window_handle = nullptr;
 | 
						|
HWND label_handle = nullptr;
 | 
						|
HWND progressbar_handle = nullptr;
 | 
						|
 | 
						|
Common::Flag running;
 | 
						|
Common::Flag request_stop;
 | 
						|
};  // namespace
 | 
						|
 | 
						|
constexpr int PROGRESSBAR_FLAGS = WS_VISIBLE | WS_CHILD | PBS_SMOOTH | PBS_SMOOTHREVERSE;
 | 
						|
 | 
						|
namespace UI
 | 
						|
{
 | 
						|
bool Init()
 | 
						|
{
 | 
						|
  InitCommonControls();
 | 
						|
 | 
						|
  WNDCLASS wndcl = {};
 | 
						|
  wndcl.lpfnWndProc = DefWindowProcW;
 | 
						|
  wndcl.hbrBackground = GetSysColorBrush(COLOR_MENU);
 | 
						|
  wndcl.lpszClassName = L"UPDATER";
 | 
						|
 | 
						|
  if (!RegisterClass(&wndcl))
 | 
						|
    return false;
 | 
						|
 | 
						|
  window_handle =
 | 
						|
      CreateWindow(L"UPDATER", L"Dolphin Updater", WS_VISIBLE | WS_CLIPCHILDREN, CW_USEDEFAULT,
 | 
						|
                   CW_USEDEFAULT, 500, 100, nullptr, nullptr, GetModuleHandle(nullptr), 0);
 | 
						|
 | 
						|
  if (!window_handle)
 | 
						|
    return false;
 | 
						|
 | 
						|
  label_handle = CreateWindow(L"STATIC", NULL, WS_VISIBLE | WS_CHILD, 5, 5, 500, 25, window_handle,
 | 
						|
                              nullptr, nullptr, 0);
 | 
						|
 | 
						|
  if (!label_handle)
 | 
						|
    return false;
 | 
						|
 | 
						|
  // Get the default system font
 | 
						|
  NONCLIENTMETRICS metrics = {};
 | 
						|
  metrics.cbSize = sizeof(NONCLIENTMETRICS);
 | 
						|
 | 
						|
  if (!SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(metrics), &metrics, 0))
 | 
						|
    return false;
 | 
						|
 | 
						|
  SendMessage(label_handle, WM_SETFONT,
 | 
						|
              reinterpret_cast<WPARAM>(CreateFontIndirect(&metrics.lfMessageFont)), 0);
 | 
						|
 | 
						|
  progressbar_handle = CreateWindow(PROGRESS_CLASS, NULL, PROGRESSBAR_FLAGS, 5, 25, 470, 25,
 | 
						|
                                    window_handle, nullptr, nullptr, 0);
 | 
						|
 | 
						|
  if (!progressbar_handle)
 | 
						|
    return false;
 | 
						|
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
void Destroy()
 | 
						|
{
 | 
						|
  DestroyWindow(window_handle);
 | 
						|
  DestroyWindow(label_handle);
 | 
						|
  DestroyWindow(progressbar_handle);
 | 
						|
}
 | 
						|
 | 
						|
void SetMarquee(bool marquee)
 | 
						|
{
 | 
						|
  SetWindowLong(progressbar_handle, GWL_STYLE, PROGRESSBAR_FLAGS | (marquee ? PBS_MARQUEE : 0));
 | 
						|
  SendMessage(progressbar_handle, PBM_SETMARQUEE, marquee, 0);
 | 
						|
}
 | 
						|
 | 
						|
void ResetProgress()
 | 
						|
{
 | 
						|
  SendMessage(progressbar_handle, PBM_SETPOS, 0, 0);
 | 
						|
  SetMarquee(true);
 | 
						|
}
 | 
						|
 | 
						|
void SetProgress(int current, int total)
 | 
						|
{
 | 
						|
  SendMessage(progressbar_handle, PBM_SETRANGE32, 0, total);
 | 
						|
  SendMessage(progressbar_handle, PBM_SETPOS, current, 0);
 | 
						|
}
 | 
						|
 | 
						|
void IncrementProgress(int amount)
 | 
						|
{
 | 
						|
  SendMessage(progressbar_handle, PBM_DELTAPOS, amount, 0);
 | 
						|
}
 | 
						|
 | 
						|
void SetDescription(const std::string& text)
 | 
						|
{
 | 
						|
  SetWindowText(label_handle, UTF8ToUTF16(text).c_str());
 | 
						|
}
 | 
						|
 | 
						|
void MessageLoop()
 | 
						|
{
 | 
						|
  request_stop.Clear();
 | 
						|
  running.Set();
 | 
						|
 | 
						|
  if (!Init())
 | 
						|
  {
 | 
						|
    running.Clear();
 | 
						|
    MessageBox(nullptr, L"Window init failed!", L"", MB_ICONERROR);
 | 
						|
  }
 | 
						|
 | 
						|
  SetMarquee(true);
 | 
						|
 | 
						|
  while (!request_stop.IsSet())
 | 
						|
  {
 | 
						|
    MSG msg;
 | 
						|
    while (PeekMessage(&msg, window_handle, 0, 0, PM_REMOVE))
 | 
						|
    {
 | 
						|
      TranslateMessage(&msg);
 | 
						|
      DispatchMessage(&msg);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  running.Clear();
 | 
						|
 | 
						|
  Destroy();
 | 
						|
}
 | 
						|
 | 
						|
void Stop()
 | 
						|
{
 | 
						|
  if (!running.IsSet())
 | 
						|
    return;
 | 
						|
 | 
						|
  request_stop.Set();
 | 
						|
 | 
						|
  while (running.IsSet())
 | 
						|
  {
 | 
						|
  }
 | 
						|
}
 | 
						|
};  // namespace UI
 |