/***********************************************************************
* fmessagebox.h - Widget FMessageBox (a text message window) *
* *
* This file is part of the FINAL CUT widget toolkit *
* *
* Copyright 2014-2020 Markus Gans *
* *
* FINAL CUT is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License as *
* published by the Free Software Foundation; either version 3 of *
* the License, or (at your option) any later version. *
* *
* FINAL CUT is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this program. If not, see *
* . *
***********************************************************************/
/* Inheritance diagram
* ═══════════════════
*
* ▕▔▔▔▔▔▔▔▔▔▏ ▕▔▔▔▔▔▔▔▔▔▏
* ▕ FVTerm ▏ ▕ FObject ▏
* ▕▁▁▁▁▁▁▁▁▁▏ ▕▁▁▁▁▁▁▁▁▁▏
* ▲ ▲
* │ │
* └─────┬─────┘
* │
* ▕▔▔▔▔▔▔▔▔▔▏
* ▕ FWidget ▏
* ▕▁▁▁▁▁▁▁▁▁▏
* ▲
* │
* ▕▔▔▔▔▔▔▔▔▔▏
* ▕ FWindow ▏
* ▕▁▁▁▁▁▁▁▁▁▏
* ▲
* │
* ▕▔▔▔▔▔▔▔▔▔▏
* ▕ FDialog ▏
* ▕▁▁▁▁▁▁▁▁▁▏
* ▲
* │
* ▕▔▔▔▔▔▔▔▔▔▔▔▔▔▏
* ▕ FMessageBox ▏
* ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▏
*/
#ifndef FMESSAGEBOX_H
#define FMESSAGEBOX_H
#if !defined (USE_FINAL_H) && !defined (COMPILE_FINAL_CUT)
#error "Only can be included directly."
#endif
#include
#include "final/fdialog.h"
#include "final/fwidgetcolors.h"
namespace finalcut
{
// class forward declaration
class FButton;
//----------------------------------------------------------------------
// class FMessageBox
//----------------------------------------------------------------------
class FMessageBox : public FDialog
{
public:
// Enumeration
enum ButtonType
{
Reject = 0,
Ok = 1,
Cancel = 2,
Yes = 3,
No = 4,
Abort = 5,
Retry = 6,
Ignore = 7
};
// Constructors
explicit FMessageBox (FWidget* = nullptr);
FMessageBox (const FMessageBox&); // copy constructor
FMessageBox ( const FString&, const FString&
, ButtonType, ButtonType, ButtonType
, FWidget* = nullptr );
// Destructor
~FMessageBox() override;
// copy assignment operator (=)
FMessageBox& operator = (const FMessageBox&);
// Accessor
FString getClassName() const override;
FString getTitlebarText() const;
FString getHeadline() const;
FString getText() const override;
// Mutator
void setTitlebarText (const FString&);
void setHeadline (const FString&);
bool setCenterText(bool);
bool setCenterText();
bool unsetCenterText();
void setText (const FString&) override;
// Methods
template
static int info ( FWidget*
, const FString&
, const messageType&
, ButtonType = FMessageBox::Ok
, ButtonType = FMessageBox::Reject
, ButtonType = FMessageBox::Reject );
template
static int error ( FWidget*
, const messageType&
, ButtonType = FMessageBox::Ok
, ButtonType = FMessageBox::Reject
, ButtonType = FMessageBox::Reject );
protected:
// Method
void adjustSize() override;
// Callback method
void cb_processClick (ButtonType);
private:
// Constants
static constexpr std::size_t MAX_BUTTONS = 3;
// Methods
void init();
void allocation();
void deallocation();
void initCallbacks();
void calculateDimensions();
void draw() override;
void resizeButtons() const;
void adjustButtons();
// Data members
FString headline_text{};
FString text{};
FStringList text_components{};
FButton* button[MAX_BUTTONS]{nullptr};
std::size_t max_line_width{0};
FColor emphasis_color{getColorTheme()->dialog_emphasis_fg};
ButtonType button_digit[MAX_BUTTONS]{FMessageBox::Reject};
std::size_t num_buttons{0};
std::size_t text_num_lines{0};
bool center_text{false};
};
// FMessageBox inline functions
//----------------------------------------------------------------------
inline FString FMessageBox::getClassName() const
{ return "FMessageBox"; }
//----------------------------------------------------------------------
inline FString FMessageBox::getTitlebarText() const
{
const FString& title = FDialog::getText(); // initialize text
return title;
}
//----------------------------------------------------------------------
inline FString FMessageBox::getHeadline() const
{ return headline_text; }
//----------------------------------------------------------------------
inline FString FMessageBox::getText() const
{ return text; }
//----------------------------------------------------------------------
inline void FMessageBox::setTitlebarText (const FString& txt)
{ return FDialog::setText(txt); }
//----------------------------------------------------------------------
inline bool FMessageBox::setCenterText(bool enable)
{ return (center_text = enable); }
//----------------------------------------------------------------------
inline bool FMessageBox::setCenterText()
{ return setCenterText(true); }
//----------------------------------------------------------------------
inline bool FMessageBox::unsetCenterText()
{ return setCenterText(false); }
//----------------------------------------------------------------------
template
int FMessageBox::info ( FWidget* parent
, const FString& caption
, const messageType& message
, ButtonType button0
, ButtonType button1
, ButtonType button2 )
{
FMessageBox mbox ( caption
, FString() << message
, button0, button1, button2
, parent );
const int reply = mbox.exec();
return reply;
}
//----------------------------------------------------------------------
template
int FMessageBox::error ( FWidget* parent
, const messageType& message
, ButtonType button0
, ButtonType button1
, ButtonType button2 )
{
const FString caption{"Error message"};
FMessageBox mbox ( caption
, FString() << message
, button0, button1, button2
, parent );
FTerm::beep();
mbox.setHeadline("Warning:");
mbox.setCenterText();
const auto& wc = getColorTheme();
mbox.setForegroundColor(wc->error_box_fg);
mbox.setBackgroundColor(wc->error_box_bg);
mbox.emphasis_color = wc->error_box_emphasis_fg;
const int reply = mbox.exec();
return reply;
}
} // namespace finalcut
#endif // FMESSAGEBOX_H