visual currency converter [fltk]

Bjarne Stroustrup “Programming Principles and Practice Using C++”
Chapter 16 Exercise 8
Using GUI library called FLTK (Fast Light Tool Kit, “full tick”).

Output:

[code language=”cpp”]
// Philipp Siedler
// Bjarne Stroustrup’s PP
// Chapter 16 Exercise 8

#define _USE_MATH_DEFINES
#include "Simple_window.h"
#include "Graph.h"
#include <cmath>
#include "GUI.h"
#include <time.h>

// layout
constexpr int xmax = 400;
constexpr int ymax = 400;

enum currencies
{
euro = 0, pound
};

struct application_window : Window {
application_window(Point xy, int w, int h, const string& title, const string& conversion_rate_file_location);

private:

//————- DATA

currencies from;
currencies to;

// data
float conversion_rate;

// methods
float get_conversion(const string& crfl);

//————- DATA END

//————- LAYOUT

// quit button
Button quit_button;

// convert button
Button convert_button;

// menu button
Button from_menu_button;
Button to_menu_button;

// menu
Menu from_menu;
Menu to_menu;

// in
In_box value_in;
Out_box value_out;
Out_box value_in_currency;
Out_box value_out_currency;

// actions invoked by callbacks
void quit() { hide(); }

void convert();

void hide_from_menu() { from_menu.hide(); from_menu_button.show(); }
void hide_to_menu() { to_menu.hide(); to_menu_button.show(); }

void from_menu_pressed() { from_menu_button.hide(); from_menu.show(); }
void to_menu_pressed() { to_menu_button.hide(); to_menu.show(); }

void from_euro_pressed() { hide_from_menu(); value_in_currency.put("euro"); from = euro; }
void from_pound_pressed() { hide_from_menu(); value_in_currency.put("pound"); from = pound; }

void to_euro_pressed() { hide_to_menu(); value_out_currency.put("euro"); to = euro; }
void to_pound_pressed() { hide_to_menu(); value_out_currency.put("pound"); to = pound; }

// callback functions
static void cb_quit(Address, Address pw) { reference_to<application_window>(pw).quit(); }

static void cb_convert(Address, Address pw) { reference_to<application_window>(pw).convert(); }

static void cb_from_menu(Address, Address pw) { reference_to<application_window>(pw).from_menu_pressed(); }
static void cb_from_euro(Address, Address pw) { reference_to<application_window>(pw).from_euro_pressed(); }
static void cb_from_pound(Address, Address pw) { reference_to<application_window>(pw).from_pound_pressed(); }

static void cb_to_menu(Address, Address pw) { reference_to<application_window>(pw).to_menu_pressed(); }
static void cb_to_euro(Address, Address pw) { reference_to<application_window>(pw).to_euro_pressed(); }
static void cb_to_pound(Address, Address pw) { reference_to<application_window>(pw).to_pound_pressed(); }

//————- LAYOUT END
};

application_window::application_window(Point xy, int w, int h, const string& title, const string& conversion_rate_file_location)
: Window(xy, w, h, title)
, quit_button(Point(x_max() – 70, 0), 70, 20, "Quit", cb_quit)
, convert_button(Point(x_max() – 70, 20), 70, 20, "Convert", cb_convert)
, from_menu_button(Point(0, 20), 70, 20, "From", cb_from_menu)
, to_menu_button(Point(x_max() / 2, 20), 70, 20, "To", cb_to_menu)
, from_menu(Point(0, 20), 70, 20, Menu::vertical, "From")
, to_menu(Point(x_max() / 2, 20), 70, 20, Menu::vertical, "To")
, value_in(Point(0, 60), 70, 20, "enter value")
, value_out(Point(x_max() / 2, 60), 70, 20, "")
, value_in_currency(Point(70, 60), 70, 20, "")
, value_out_currency(Point(x_max() / 2 + 70, 60), 70, 20, "")
{
conversion_rate = get_conversion(conversion_rate_file_location);

from = euro;
to = euro;

attach(quit_button);
attach(convert_button);
attach(from_menu_button);
attach(to_menu_button);

attach(value_in);
attach(value_out);

attach(value_in_currency);
attach(value_out_currency);

value_in_currency.put("euro");
value_out_currency.put("euro");

from_menu.attach(new Button(Point(0, 0), 0, 0, "euro", cb_from_euro));
from_menu.attach(new Button(Point(0, 0), 0, 0, "pound", cb_from_pound));

to_menu.attach(new Button(Point(0, 0), 0, 0, "euro", cb_to_euro));
to_menu.attach(new Button(Point(0, 0), 0, 0, "pound", cb_to_pound));

attach(to_menu);
attach(from_menu);

to_menu.hide();
from_menu.hide();
}

float application_window::get_conversion(const string& crfl)
{
string iname = crfl;
ifstream ist(iname);

float rate;
if (!ist) { error("File could not be read: ", iname); }
else { ist >> rate; }

return rate;
}

void application_window::convert()
{
float input = strtof((value_in.get_string()).c_str(), 0);

if (from == euro && to == pound)
{
input *= conversion_rate;

ostringstream ss;
ss << input;
string s(ss.str());

value_out.put(s);
}
else if (from == pound && to == euro)
{
input *= 1.0 + (1.0 – conversion_rate);

ostringstream ss;
ss << input;
string s(ss.str());

value_out.put(s);
}
else
{
ostringstream ss;
ss << input;
string s(ss.str());

value_out.put(s);
}
}

int main()
try
{
application_window win(Point(100, 100), xmax, ymax + 20, "currency converter", "Data/conversion_rate.txt");
return gui_main();
}
catch (exception& e) {
cerr << "error: " << e.what() << ‘\n’;
keep_window_open();
return 1;
}
catch (…) {
cerr << "Unknown exception!\n";
keep_window_open();
return 2;
}
[/code]

Input:
Text file: Data/conversion_rate.txt
0.87

Leave a Reply