瀏覽代碼

LibGUI: Add Yes/No and Yes/No/Cancel MessageBoxes

thatlittlegit 5 年之前
父節點
當前提交
4755f355c6
共有 3 個文件被更改,包括 36 次插入22 次删除
  1. 3 1
      Libraries/LibGUI/Dialog.h
  2. 29 21
      Libraries/LibGUI/MessageBox.cpp
  3. 4 0
      Libraries/LibGUI/MessageBox.h

+ 3 - 1
Libraries/LibGUI/Dialog.h

@@ -36,7 +36,9 @@ public:
     enum ExecResult {
         ExecOK = 0,
         ExecCancel = 1,
-        ExecAborted = 2
+        ExecAborted = 2,
+        ExecYes = 3,
+        ExecNo = 4,
     };
 
     virtual ~Dialog() override;

+ 29 - 21
Libraries/LibGUI/MessageBox.cpp

@@ -74,7 +74,17 @@ bool MessageBox::should_include_ok_button() const
 
 bool MessageBox::should_include_cancel_button() const
 {
-    return m_input_type == InputType::OKCancel;
+    return m_input_type == InputType::OKCancel || m_input_type == InputType::YesNoCancel;
+}
+
+bool MessageBox::should_include_yes_button() const
+{
+    return m_input_type == InputType::YesNo || m_input_type == InputType::YesNoCancel;
+}
+
+bool MessageBox::should_include_no_button() const
+{
+    return should_include_yes_button();
 }
 
 void MessageBox::build()
@@ -114,27 +124,25 @@ void MessageBox::build()
     button_container->layout()->set_spacing(5);
     button_container->layout()->set_margins({ 15, 0, 15, 0 });
 
-    if (should_include_ok_button()) {
-        auto ok_button = Button::construct(button_container);
-        ok_button->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
-        ok_button->set_preferred_size(0, 20);
-        ok_button->set_text("OK");
-        ok_button->on_click = [this](auto&) {
-            dbgprintf("GMessageBox: OK button clicked\n");
-            done(Dialog::ExecOK);
+    auto add_button = [&](String label, Dialog::ExecResult result) {
+        auto button = Button::construct(button_container);
+        button->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
+        button->set_preferred_size(0, 20);
+        button->set_text(label);
+        button->on_click = [=](auto&) {
+            dbg() << "GUI::MessageBox: '" << label << "' button clicked";
+            done(result);
         };
-    }
-
-    if (should_include_cancel_button()) {
-        auto cancel_button = Button::construct(button_container);
-        cancel_button->set_size_policy(SizePolicy::Fill, SizePolicy::Fixed);
-        cancel_button->set_preferred_size(0, 20);
-        cancel_button->set_text("Cancel");
-        cancel_button->on_click = [this](auto&) {
-            dbgprintf("GMessageBox: Cancel button clicked\n");
-            done(Dialog::ExecCancel);
-        };
-    }
+    };
+
+    if (should_include_ok_button())
+        add_button("OK", Dialog::ExecOK);
+    if (should_include_yes_button())
+        add_button("Yes", Dialog::ExecYes);
+    if (should_include_no_button())
+        add_button("No", Dialog::ExecNo);
+    if (should_include_cancel_button())
+        add_button("Cancel", Dialog::ExecCancel);
 
     set_rect(x(), y(), text_width + icon_width + 80, 100);
     set_resizable(false);

+ 4 - 0
Libraries/LibGUI/MessageBox.h

@@ -43,6 +43,8 @@ public:
     enum class InputType {
         OK,
         OKCancel,
+        YesNo,
+        YesNoCancel,
     };
 
     virtual ~MessageBox() override;
@@ -54,6 +56,8 @@ private:
 
     bool should_include_ok_button() const;
     bool should_include_cancel_button() const;
+    bool should_include_yes_button() const;
+    bool should_include_no_button() const;
     void build();
     RefPtr<Gfx::Bitmap> icon() const;