2024-11-12 14:53:44 -08:00
|
|
|
#include "prefs.h"
|
|
|
|
#include <OptionPopUp.h>
|
|
|
|
#include <options.hpp>
|
|
|
|
#include <backend.hpp>
|
|
|
|
#include <GroupView.h>
|
|
|
|
#include <RadioButton.h>
|
|
|
|
#include <Box.h>
|
|
|
|
#include <map>
|
|
|
|
#include "main_window.h"
|
|
|
|
using namespace Looper::Options;
|
|
|
|
#define CMD_UPDATE_LABEL_SETTING 0x1000
|
|
|
|
#define CMD_FRONTEND 0x1001
|
|
|
|
#define CMD_SET_SETTING 0x1002
|
|
|
|
#define CMD_REVERT 0x1003
|
|
|
|
#define CMD_APPLY 0x1004
|
|
|
|
bool show_icons, show_labels;
|
|
|
|
|
|
|
|
PrefsWindow::PrefsWindow(BLooper *next_handler) : BWindow(BRect(100, 100, 0, 0), "Preferences", B_TITLED_WINDOW, B_AUTO_UPDATE_SIZE_LIMITS) {
|
|
|
|
this->next_handler = next_handler;
|
|
|
|
auto *root_layout = new BGroupLayout(B_VERTICAL);
|
|
|
|
SetLayout(root_layout);
|
|
|
|
root_layout->SetSpacing(0.0);
|
|
|
|
restart_warning = new BStringView("prefs:restart_needed", "A restart is needed to apply some changes.");
|
|
|
|
root_layout->AddView(restart_warning);
|
|
|
|
restart_warning->Hide();
|
|
|
|
frontend_popup = new BOptionPopUp("prefs:frontend", "Frontend", new BMessage(CMD_FRONTEND));
|
|
|
|
auto frontend = get_option<std::string>("ui.frontend", "haiku");
|
|
|
|
for (auto &kv : UIBackend::backends) {
|
|
|
|
UIBackend *backend = kv.second;
|
|
|
|
const char *name = backend->get_name().c_str();
|
|
|
|
frontend_popup->AddOption(name, (int32)backend_ids.size());
|
|
|
|
std::string id = backend->get_id();
|
|
|
|
if (id == frontend) cur_option = (int32)backend_ids.size();
|
|
|
|
backend_ids.push_back(id);
|
|
|
|
}
|
|
|
|
BLayoutItem *frontend_item = root_layout->AddView(frontend_popup);
|
|
|
|
BAlignment align;
|
|
|
|
align.SetVertical(B_ALIGN_TOP);
|
|
|
|
frontend_item->SetExplicitAlignment(align);
|
|
|
|
BBox *box = new BBox("prefs:label_settings_box");
|
|
|
|
box->SetLabel("Labels and Icons");
|
|
|
|
auto *label_settings_group = new BGroupView(B_VERTICAL);
|
|
|
|
BGroupLayout *label_settings_layout = label_settings_group->GroupLayout();
|
|
|
|
BMessage *labels_only_msg = new BMessage(CMD_SET_SETTING);
|
|
|
|
labels_only_msg->AddString("pref_path", "ui.haiku.label_setting");
|
|
|
|
labels_only_msg->AddString("pref_value", "labels");
|
|
|
|
labels_only = new BRadioButton("prefs:labels_only", "Labels Only", labels_only_msg);
|
|
|
|
BMessage *icons_only_msg = new BMessage(CMD_SET_SETTING);
|
|
|
|
icons_only_msg->AddString("pref_path", "ui.haiku.label_setting");
|
|
|
|
icons_only_msg->AddString("pref_value", "icons");
|
|
|
|
icons_only = new BRadioButton("prefs:icons_only", "Icons Only", icons_only_msg);
|
|
|
|
BMessage *both_labels_icons_msg = new BMessage(CMD_SET_SETTING);
|
|
|
|
both_labels_icons_msg->AddString("pref_path", "ui.haiku.label_setting");
|
|
|
|
both_labels_icons_msg->AddString("pref_value", "both");
|
|
|
|
both_labels_icons = new BRadioButton("prefs:both_labels_and_icons", "Both", both_labels_icons_msg);
|
|
|
|
label_settings_layout->AddView(labels_only);
|
|
|
|
label_settings_layout->AddView(icons_only);
|
|
|
|
label_settings_layout->AddView(both_labels_icons);
|
|
|
|
box->AddChild(label_settings_group);
|
|
|
|
root_layout->AddView(box, 3.0);
|
|
|
|
BGroupView *btn_view = new BGroupView(B_HORIZONTAL);
|
|
|
|
BGroupLayout *btn_box = btn_view->GroupLayout();
|
|
|
|
revert_btn = new BButton("prefs:revert", "Revert", new BMessage(CMD_REVERT));
|
|
|
|
apply_btn = new BButton("prefs:apply", "Apply", new BMessage(CMD_APPLY));
|
|
|
|
root_layout->AddView(btn_view);
|
|
|
|
btn_box->AddView(revert_btn);
|
|
|
|
btn_box->AddView(apply_btn);
|
|
|
|
{
|
|
|
|
auto *msg = new BMessage(CMD_REVERT);
|
|
|
|
MessageReceived(msg);
|
|
|
|
delete msg;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool PrefsWindow::QuitRequested() {
|
|
|
|
Hide();
|
|
|
|
return quitting;
|
|
|
|
}
|
|
|
|
void PrefsWindow::set_options_changed(bool changed) {
|
|
|
|
revert_btn->SetEnabled(changed);
|
|
|
|
apply_btn->SetEnabled(changed);
|
|
|
|
}
|
|
|
|
void PrefsWindow::update_label_setting() {
|
|
|
|
|
|
|
|
std::map<std::string, BRadioButton*> label_settings_map({{"labels", labels_only}, {"icons", icons_only}, {"both", both_labels_icons}});
|
|
|
|
auto cur_radio_btn = labels_only;
|
|
|
|
if (!label_settings_map.contains(new_label_setting)) {
|
|
|
|
new_label_setting = "icons";
|
|
|
|
}
|
|
|
|
cur_radio_btn = label_settings_map[new_label_setting];
|
|
|
|
show_icons = new_label_setting != "labels";
|
|
|
|
show_labels = new_label_setting != "icons";
|
|
|
|
cur_radio_btn->SetValue(B_CONTROL_ON);
|
|
|
|
}
|
|
|
|
void PrefsWindow::MessageReceived(BMessage *msg) {
|
|
|
|
if (msg->IsSystem()) return;
|
|
|
|
switch (msg->what) {
|
|
|
|
case CMD_APPLY: {
|
|
|
|
set_options_changed(false);
|
|
|
|
set_option<std::string>("ui.frontend", new_frontend);
|
|
|
|
if (new_frontend != "haiku") restart_warning->Show();
|
|
|
|
else restart_warning->Hide();
|
|
|
|
set_option<std::string>("ui.haiku.label_setting", new_label_setting);
|
|
|
|
update_label_setting();
|
|
|
|
next_handler->PostMessage(CMD_UPDATE_LABEL_SETTING);
|
|
|
|
} break;
|
|
|
|
case CMD_REVERT: {
|
|
|
|
set_options_changed(false);
|
|
|
|
new_label_setting = get_option<std::string>("ui.haiku.label_setting", "icons");
|
2024-11-20 08:15:45 -08:00
|
|
|
new_frontend = get_option<std::string>("ui.frontend", "haiku");
|
2024-11-12 14:53:44 -08:00
|
|
|
if (new_frontend != "haiku") restart_warning->Show();
|
|
|
|
else restart_warning->Hide();
|
|
|
|
for (size_t i = 0; i < backend_ids.size(); i++) {
|
|
|
|
int32 backend_id = (int32)i;
|
|
|
|
if (backend_ids[i] == new_frontend) {
|
|
|
|
frontend_popup->SetValue(backend_id);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
update_label_setting();
|
|
|
|
next_handler->PostMessage(CMD_UPDATE_LABEL_SETTING);
|
|
|
|
} break;
|
|
|
|
case CMD_FRONTEND: {
|
|
|
|
auto option = msg->GetInt32("be:value", cur_option);
|
|
|
|
if (backend_ids.size() < option && option >= 0) {
|
|
|
|
new_frontend = backend_ids[option];
|
|
|
|
}
|
|
|
|
set_options_changed(true);
|
|
|
|
} break;
|
|
|
|
case CMD_SET_SETTING: {
|
|
|
|
const char *setting;
|
|
|
|
if (msg->FindString("pref_path", &setting) == B_OK) {
|
|
|
|
const char *setting_value;
|
|
|
|
int32 setting_value_int32;
|
|
|
|
if (msg->FindString("pref_value", &setting_value) == B_OK) {
|
|
|
|
if (std::string(setting) == "ui.haiku.label_setting") {
|
|
|
|
new_label_setting = setting_value;
|
|
|
|
set_options_changed(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} break;
|
|
|
|
}
|
|
|
|
}
|