dsi2key/server/gui/mainWindow.cpp
2022-11-04 15:10:23 +11:00

612 lines
20 KiB
C++

/*
Main window for DS2Key
*/
#include <windows.h>
#include <commctrl.h>//LPNMLISTVIEW
#include <iostream>
#include <sstream>//std::stringstream
#include "core/core.h"
#include "core/config.h"
#include "common/key.h"
#include "mainWindow.h"
#include "common/misc.h"
namespace D2K {namespace GUI {namespace MainWindow {
GUI::Window window;
GUI::ListView *categoryListView;
GUI::StatusBar *StatusBar;
GUI::TrayIcon *TrayIcon;
namespace MainMenu {
GUI::Menu *menu = new GUI::Menu();
GUI::MenuPopUp *file;
GUI::MenuItem *fileConnect;
GUI::MenuItem *fileDisconnect;
GUI::MenuItem *fileMinimize;
GUI::MenuItem *fileExit;
void fileConnectFunction(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "fileConnectFunction()\n";
UDP::Connect();
CheckMenuRadioItem( (HMENU)GUI::MainWindow::MainMenu::file->GetParentHWND(),
GUI::MainWindow::MainMenu::fileConnect->GetID(),
GUI::MainWindow::MainMenu::fileDisconnect->GetID(),
UDP::IsConnected() ? GUI::MainWindow::MainMenu::fileConnect->GetID() : GUI::MainWindow::MainMenu::fileDisconnect->GetID(),
MF_BYCOMMAND);
//check if connected properly
std::string status = "Connected on Port #" + D2K::ltos(Config::GetPort());
GUI::MainWindow::StatusBar->SetText(UDP::IsConnected() ? status : "Disconnected");
}
void fileDisconnectFunction(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "fileConnectFunction()\n";
UDP::Disconnect();
CheckMenuRadioItem( (HMENU)GUI::MainWindow::MainMenu::file->GetParentHWND(),
GUI::MainWindow::MainMenu::fileConnect->GetID(),
GUI::MainWindow::MainMenu::fileDisconnect->GetID(),
UDP::IsConnected() ? GUI::MainWindow::MainMenu::fileConnect->GetID() : GUI::MainWindow::MainMenu::fileDisconnect->GetID(),
MF_BYCOMMAND);
std::string status = "Connected on Port #" + D2K::ltos(Config::GetPort());
GUI::MainWindow::StatusBar->SetText(UDP::IsConnected() ? status : "Disconnected");
}
void fileMinimizeFunction(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "fileMinimizeFunction()\n";
menu->GetParent()->SetVisible(false);
}
void fileExitFunction(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "fileExitFunction()\n";
//delete GUI::MainWindow::TrayIcon;
//ExitProcess(0);
D2K::g_running = false;
}
void Setup()
{
window.Append(menu);
menu->Append(
file = new GUI::MenuPopUp("&File"));
file->Append(
fileConnect = new GUI::MenuItem("&Connect"), &fileConnectFunction);
file->Append(
fileDisconnect = new GUI::MenuItem("&Disconnect"), &fileDisconnectFunction);
file->Append(
fileMinimize = new GUI::MenuItem("&Minimize"), &fileMinimizeFunction);
file->Append(
fileExit = new GUI::MenuItem("-"));
file->Append(
fileExit = new GUI::MenuItem("E&xit"), &fileExitFunction);
CheckMenuRadioItem( (HMENU)GUI::MainWindow::MainMenu::file->GetParentHWND(),
GUI::MainWindow::MainMenu::fileConnect->GetID(),
GUI::MainWindow::MainMenu::fileDisconnect->GetID(),
UDP::IsConnected() ? GUI::MainWindow::MainMenu::fileConnect->GetID() : GUI::MainWindow::MainMenu::fileDisconnect->GetID(),
MF_BYCOMMAND);
menu->Update();
}
}//namespace MainMenu
namespace Profile {
Label *List[listMax] = { };
Edit *edit1;
RadioButton *radioButton1;
RadioButton *radioButton2;
RadioButton *radioButton3;
CheckButton *checkButton1;
ComboButton *comboButton1;
ListView *listView1;
Button *button1;
Button *button2;
Button *button3;
Button *button4;
Button *button5;
Button *button6;
Button *button7;
bool waiting;
void radioButton1Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "profileRadioButton1Function()\n";
checkButton1->SetEnabled(true);
ProfileData *Profile = g_client_array[comboButton1->GetSelection()]->GetProfileDataPointer();
Profile->m_mouse = "Relative";
}
void radioButton2Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "profileRadioButton2Function()\n";
checkButton1->SetEnabled(true);
ProfileData *Profile = g_client_array[comboButton1->GetSelection()]->GetProfileDataPointer();
Profile->m_mouse = "Absolute";
}
void radioButton3Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "profileRadioButton3Function()\n";
ProfileData *Profile = g_client_array[comboButton1->GetSelection()]->GetProfileDataPointer();
Profile->m_mouse = "Buttons";
checkButton1->SetEnabled(false);
}
void checkButton1Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "checkButton1Function()\n";
}
void comboButton1Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int Profile = comboButton1->GetSelection();
if(g_client_array[Profile] == nullptr) //if profile not active,
g_client_array[Profile] = new D2K::Client(); //create it
ProfileData *pData = g_client_array[Profile]->GetProfileDataPointer();
Config::LoadProfile(pData, Profile); //then load it
//!04-11-16 the following is broken. DUP and TOUCH_11 has crap in the middle of it now.
int rowBase = D2K::KEYS::DUP;//this offsets the difference between our list, and the "kUp" enums
int row = 0;
for(row = 0; row <= D2K::KEYS::TOUCH_11 - rowBase; row++)
{
std::string ButtonString = pData->GetButtonString(rowBase + row);
if(ButtonString != "")
if(ButtonString.substr(0, D2K_COMMAND_LENGTH) == D2K_COMMAND)
ButtonString = ButtonString.substr(D2K_COMMAND_LENGTH);
listView1->SetText(ButtonString, row, 1);
}
for(row; row <= D2K::KEYS::TOUCH_11 - rowBase; row++)
{
std::string ButtonString = pData->GetStringReference(rowBase + row);
if(ButtonString != "")
listView1->SetText(ButtonString, row, 1);
}
for(int i = 0; i <= 11; i++)
{
std::string ButtonString = D2K::ltos(pData->m_touch_x[i]);
listView1->SetText(ButtonString, row++, 1);
}
for(int i = 0; i <= 11; i++)
{
std::string ButtonString = D2K::ltos(pData->m_touch_y[i]);
listView1->SetText(ButtonString, row++, 1);
}
for(int i = 0; i <= 11; i++)
{
std::string ButtonString = D2K::ltos(pData->m_touch_w[i]);
listView1->SetText(ButtonString, row++, 1);
}
for(int i = 0; i <= 11; i++){
std::string ButtonString = D2K::ltos(pData->m_touch_h[i]);
listView1->SetText(ButtonString, row++, 1);
}
radioButton1->SetChecked(false);
radioButton2->SetChecked(false);
radioButton3->SetChecked(false);
checkButton1->SetEnabled(true);
if(pData->m_mouse == "Absolute")
radioButton2->SetChecked(true);
/*else if(pData->m_mouse == "Buttons")
{
radioButton3->SetChecked(true);
checkButton1->SetEnabled(false);
}*/ //disabled
else
radioButton1->SetChecked(true);
}
void listView1Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int selected = listView1->GetSelection();
std::string oldStatus = GUI::MainWindow::StatusBar->GetText();
GUI::MainWindow::StatusBar->SetText("Assign a Key [" + listView1->GetText(selected, 0) + "]");
//disable
GUI::MainWindow::categoryListView->SetEnabled(false);
GUI::MainWindow::Profile::radioButton1->SetEnabled(false);
GUI::MainWindow::Profile::radioButton2->SetEnabled(false);
GUI::MainWindow::Profile::radioButton3->SetEnabled(false);
GUI::MainWindow::Profile::checkButton1->SetEnabled(false);
GUI::MainWindow::Profile::comboButton1->SetEnabled(false);
GUI::MainWindow::Profile::listView1->SetEnabled(false);
GUI::MainWindow::Profile::button1->SetEnabled(false);
GUI::MainWindow::Profile::button2->SetEnabled(false);
GUI::MainWindow::Profile::edit1->SetEnabled(false);
//show
GUI::MainWindow::Profile::edit1->SetVisible(true);
GUI::MainWindow::Profile::button7->SetVisible(true);
GUI::MainWindow::Profile::button3->SetVisible(true);
GUI::MainWindow::Profile::button4->SetVisible(true);
GUI::MainWindow::Profile::button5->SetVisible(true);
GUI::MainWindow::Profile::button6->SetVisible(true);
BYTE keys[256];
waiting = true;
while(waiting)
{
GetKeyboardState((PBYTE)keys);
for(int i = 0; i < 255; i++)
{
if(!waiting)
break;
if(keys[i] > 1)
{
if(i != VK_LBUTTON && i != VK_RBUTTON && i != VK_MBUTTON)
{
listView1->SetText(Key::GetString(i), selected, 1);
g_client_array[GUI::MainWindow::Profile::comboButton1->GetSelection()]->GetProfileDataPointer()->SetVirtualKey(listView1->GetSelection() + 5, i);
waiting = false;
}
}
}
GUI::GetMessages();//Application::processEvents();
}
GUI::MainWindow::StatusBar->SetText(oldStatus);
//enable
GUI::MainWindow::categoryListView->SetEnabled(true);
GUI::MainWindow::Profile::radioButton1->SetEnabled(true);
GUI::MainWindow::Profile::radioButton2->SetEnabled(true);
GUI::MainWindow::Profile::radioButton3->SetEnabled(true);//disabled
GUI::MainWindow::Profile::checkButton1->SetEnabled(true);
GUI::MainWindow::Profile::comboButton1->SetEnabled(true);
GUI::MainWindow::Profile::listView1->SetEnabled(true);
GUI::MainWindow::Profile::button1->SetEnabled(true);
GUI::MainWindow::Profile::button2->SetEnabled(true);
//hide
GUI::MainWindow::Profile::edit1->SetVisible(false);
GUI::MainWindow::Profile::button7->SetVisible(false);
GUI::MainWindow::Profile::button3->SetVisible(false);
GUI::MainWindow::Profile::button4->SetVisible(false);
GUI::MainWindow::Profile::button5->SetVisible(false);
GUI::MainWindow::Profile::button6->SetVisible(false);
}
void button1Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int currentProfile = GUI::MainWindow::Profile::comboButton1->GetSelection();
Config::SaveProfile(
g_client_array[currentProfile]->GetProfileDataPointer(),
currentProfile);
comboButton1Function(hwnd, message, wParam, lParam);
}
void button2Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
comboButton1Function(hwnd, message, wParam, lParam);
}
void button3Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
waiting = false;
}
void button4Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//update listview text
listView1->SetText(Key::GetString(VK_LBUTTON), listView1->GetSelection(), 1);
//update client setting
g_client_array[GUI::MainWindow::Profile::comboButton1->GetSelection()]->GetProfileDataPointer()->SetVirtualKey(listView1->GetSelection() + 3, VK_LBUTTON);
waiting = false;
}
void button5Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//update listview text
listView1->SetText(Key::GetString(VK_MBUTTON), listView1->GetSelection(), 1);
//update client setting
g_client_array[GUI::MainWindow::Profile::comboButton1->GetSelection()]->GetProfileDataPointer()->SetVirtualKey(listView1->GetSelection() + 3, VK_MBUTTON);
waiting = false;
}
void button6Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
//update listview text
listView1->SetText(Key::GetString(VK_RBUTTON), listView1->GetSelection(), 1);
//update client setting
g_client_array[GUI::MainWindow::Profile::comboButton1->GetSelection()]->GetProfileDataPointer()->SetVirtualKey(listView1->GetSelection() + 3, VK_RBUTTON);
waiting = false;
}
void button7Function(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
uint32_t Value = 0x100 + D2K::stol(edit1->GetText());
edit1->SetEnabled(true);
listView1->SetText(Key::GetString(Value), listView1->GetSelection(), 1);
g_client_array[GUI::MainWindow::Profile::comboButton1->GetSelection()]->GetProfileDataPointer()->SetVirtualKey(listView1->GetSelection() + 3, Value);
waiting = false;
}
void Setup()
{
waiting = false;
window.Append(
radioButton1 = new RadioButton("Touchpad (Relative)", x, 10, 120, 16), &radioButton1Function);
window.Append(
radioButton2 = new RadioButton("Touchpad (Absolute)", x + 120 + border, border, 120, 16), &radioButton2Function);
window.Append(
radioButton3 = new RadioButton("Touch Buttons", x + (120 * 2) + border, border, 120, 16), &radioButton3Function);
window.Append(
checkButton1 = new CheckButton("Double tap click", x + (120 * 3) + border, border, 120, 16), &checkButton1Function);
window.Append(
comboButton1 = new ComboButton(x, (border * 2) + 16, width - (border * 2) - x, 250), &comboButton1Function);
for(int i = 0; i <= 255; i++)
{
std::ostringstream stream;
stream << "Profile #" << i;
comboButton1->Append(stream.str().c_str());
}
window.Append(listView1 = new ListView("Name", x, (border * 2) + 16 + 24, 450, 200));
listView1->SetDoubleClick(&listView1Function);
listView1->InsertColumn("Mapping", 1);
listView1->Append("Up");
listView1->Append("Down");
listView1->Append("Left");
listView1->Append("Right");
listView1->Append("A");
listView1->Append("B");
listView1->Append("X");
listView1->Append("Y");
listView1->Append("L");
listView1->Append("R");
listView1->Append("Start");
listView1->Append("Select");
listView1->Append("Lid");
listView1->Append("Blue");
listView1->Append("Yellow");
listView1->Append("Red");
listView1->Append("Green");
listView1->Append("Touch00");
listView1->Append("Touch01");
listView1->Append("Touch02");
listView1->Append("Touch03");
listView1->Append("Touch04");
listView1->Append("Touch05");
listView1->Append("Touch06");
listView1->Append("Touch07");
listView1->Append("Touch08");
listView1->Append("Touch09");
listView1->Append("Touch10");
listView1->Append("Touch11");
listView1->Append("TouchString00");
listView1->Append("TouchString01");
listView1->Append("TouchString02");
listView1->Append("TouchString03");
listView1->Append("TouchString04");
listView1->Append("TouchString05");
listView1->Append("TouchString06");
listView1->Append("TouchString07");
listView1->Append("TouchString08");
listView1->Append("TouchString09");
listView1->Append("TouchString10");
listView1->Append("TouchString11");
listView1->Append("TouchX00");
listView1->Append("TouchX01");
listView1->Append("TouchX02");
listView1->Append("TouchX03");
listView1->Append("TouchX04");
listView1->Append("TouchX05");
listView1->Append("TouchX06");
listView1->Append("TouchX07");
listView1->Append("TouchX08");
listView1->Append("TouchX09");
listView1->Append("TouchX10");
listView1->Append("TouchX11");
listView1->Append("TouchY00");
listView1->Append("TouchY01");
listView1->Append("TouchY02");
listView1->Append("TouchY03");
listView1->Append("TouchY04");
listView1->Append("TouchY05");
listView1->Append("TouchY06");
listView1->Append("TouchY07");
listView1->Append("TouchY08");
listView1->Append("TouchY09");
listView1->Append("TouchY10");
listView1->Append("TouchY11");
listView1->Append("TouchW00");
listView1->Append("TouchW01");
listView1->Append("TouchW02");
listView1->Append("TouchW03");
listView1->Append("TouchW04");
listView1->Append("TouchW05");
listView1->Append("TouchW06");
listView1->Append("TouchW07");
listView1->Append("TouchW08");
listView1->Append("TouchW09");
listView1->Append("TouchW10");
listView1->Append("TouchW11");
listView1->Append("TouchH00");
listView1->Append("TouchH01");
listView1->Append("TouchH02");
listView1->Append("TouchH03");
listView1->Append("TouchH04");
listView1->Append("TouchH05");
listView1->Append("TouchH06");
listView1->Append("TouchH07");
listView1->Append("TouchH08");
listView1->Append("TouchH09");
listView1->Append("TouchH10");
listView1->Append("TouchH11");
listView1->SetHeaderVisible(true);
comboButton1Function((HWND)NULL_VALUE, 0, (WPARAM)NULL_VALUE, (LPARAM)NULL_VALUE);
window.Append(
button1 = new Button("Apply", width - (80 * 2) - (border * 3), 268, 80, 25), &button1Function);
window.Append(
button2 = new Button("Revert", width - 80 - (border * 2), 268, 80, 25), &button2Function);
window.Append(
button3 = new Button("Cancel", x, 268, 80, 25), &button3Function);
button3->SetVisible(false);
window.Append(
button7 = new Button("Joy Button", x + 80 + border, 268, 80 - border, 25), &button7Function);
button7->SetVisible(false);
window.Append(
edit1 = new Edit("", x + (80 * 2) + (border ), 268, 20, 25), &GUI::voidFunction);
edit1->SetStyle(edit1->GetStyle()|ES_NUMBER);
edit1->SetVisible(false);
window.Append(
button4 = new Button("Left Click", width - (80 * 3) - (border * 4), 268, 80, 25), &button4Function);
button4->SetVisible(false);
window.Append(
button5 = new Button("Middle Click", width - (80 * 2) - (border * 3), 268, 80, 25), &button5Function);
button5->SetVisible(false);
window.Append(
button6 = new Button("Right Click", width - 80 - (border * 2), 268, 80, 25), &button6Function);
button6->SetVisible(false);
List[0] = radioButton1;
List[1] = radioButton2;
List[2] = radioButton3;
List[3] = checkButton1;
List[4] = comboButton1;
List[5] = listView1;
List[6] = button1;
List[7] = button2;
}
void SetVisible(bool visible)
{
for(int i = 0; i < listMax; i++)
{
if(List[i] != nullptr)
List[i]->SetVisible(visible);
}
List[2]->SetVisible(false);//hide touch buttons, not needed, temporary
List[3]->SetVisible(false);//hide double tap click button until implemented
}
}//namespace Profile
namespace Settings {
Label *List[listMax] = { };
Label *label;
Edit *edit;
std::string Port = D2K::ltos(D2K::DEFAULT_PORT);
void editFunction(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::string portString = edit->GetText();
int portInt = D2K::stol(portString);
if(portInt > 0 && portInt < 0xFFFF)
Port = portString;
else
edit->SetText(Port);
Config::SetConfigPort(D2K::stol(Port));
Config::Save();
UDP::Connect(Config::GetPort());
std::string status = "Connected on Port #" + D2K::ltos(Config::GetPort());
GUI::MainWindow::StatusBar->SetText(UDP::IsConnected() ? status : "Disconnected");
CheckMenuRadioItem( (HMENU)GUI::MainWindow::MainMenu::file->GetParentHWND(),
GUI::MainWindow::MainMenu::fileConnect->GetID(),
GUI::MainWindow::MainMenu::fileDisconnect->GetID(),
UDP::IsConnected() ? GUI::MainWindow::MainMenu::fileConnect->GetID() : GUI::MainWindow::MainMenu::fileDisconnect->GetID(),
MF_BYCOMMAND);
std::cout << portInt << ":" << Port << "\n";
}
void Setup()
{
Port = D2K::ltos(Config::GetPort());
window.Append(label = new Label("Port", x, 15, 20, 16));
window.Append(
edit = new Edit(Port, x + 30, 10, width - x - 30 - (border * 2), 25), &editFunction);
edit->SetStyle(edit->GetStyle()|ES_NUMBER);
List[0] = label;
List[1] = edit;
}
void SetVisible(bool visible)
{
for(int i = 0; i < listMax; i++)
{
if(List[i] != nullptr)
List[i]->SetVisible(visible);
}
}
}//namespace Settings
namespace About {
Label *List[listMax] = { };
Label *Line1;
Label *Line2;
Label *Line3;
void Setup()
{
window.Append(Line1 = new Label(D2K::VERSION_STRING, 100, 10, 250, 16));
window.Append(Line2 = new Label("Copyright (c) 2006-2013 Derrick (sypherce) Wirth", 100, 30, 250, 16));
window.Append(Line3 = new Label("http://ds2key.1emulation.com/", 100, 50, 250, 16));
List[0] = Line1;
List[1] = Line2;
List[2] = Line3;
}
void SetVisible(bool visible)
{
for(int i = 0; i < listMax; i++)
{
if(About::List[i] != nullptr)
List[i]->SetVisible(visible);
}
}
}//namespace About
void categoryListViewFunction(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
std::cout << "categoryListViewFunction()\n";
int selection = ((LPNMLISTVIEW)lParam)->iItem;
Profile::SetVisible(selection == 0);
Settings::SetVisible(selection == 1);
About::SetVisible(selection == 2);
}
int Setup(HINSTANCE hThisInstance, int nCmdShow)
{
if(!window.Setup(hThisInstance, "DS2Key", D2K::VERSION_STRING, GUI::MainWindow::width, GUI::MainWindow::height))
return 1;
window.Append(
categoryListView = new GUI::ListView("", 10, 10, 80, 268 + 25 - border), &categoryListViewFunction);
categoryListView->Append("Profile");
categoryListView->Append("Settings");
categoryListView->Append("About");
MainMenu::Setup();
Profile::Setup();
Settings::Setup();
About::Setup();
std::string status = "Connected on Port #" + D2K::ltos(Config::GetPort());
window.Append(GUI::MainWindow::StatusBar = new GUI::StatusBar(UDP::IsConnected() ? status : "Disconnected", 0, 0, 120, 120));
window.Append(GUI::MainWindow::TrayIcon = new GUI::TrayIcon("DS2Key"));
window.SetVisible(nCmdShow);
categoryListView->SetSelection(0);
GUI::locked = false;
return 0;
}
}}}//namespace D2K::GUI::MainWindow