123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- #include <LibGUI/GVariant.h>
- GVariant::GVariant()
- {
- m_value.as_string = nullptr;
- }
- GVariant::~GVariant()
- {
- switch (m_type) {
- case Type::String:
- AK::release_if_not_null(m_value.as_string);
- break;
- case Type::Bitmap:
- AK::release_if_not_null(m_value.as_bitmap);
- break;
- case Type::Icon:
- AK::release_if_not_null(m_value.as_icon);
- break;
- default:
- break;
- }
- }
- GVariant::GVariant(int value)
- : m_type(Type::Int)
- {
- m_value.as_int = value;
- }
- GVariant::GVariant(float value)
- : m_type(Type::Float)
- {
- m_value.as_float = value;
- }
- GVariant::GVariant(bool value)
- : m_type(Type::Bool)
- {
- m_value.as_bool = value;
- }
- GVariant::GVariant(const String& value)
- : m_type(Type::String)
- {
- m_value.as_string = const_cast<StringImpl*>(value.impl());
- AK::retain_if_not_null(m_value.as_string);
- }
- GVariant::GVariant(const GraphicsBitmap& value)
- : m_type(Type::Bitmap)
- {
- m_value.as_bitmap = const_cast<GraphicsBitmap*>(&value);
- AK::retain_if_not_null(m_value.as_bitmap);
- }
- GVariant::GVariant(const GIcon& value)
- : m_type(Type::Icon)
- {
- m_value.as_icon = &const_cast<GIconImpl&>(value.impl());
- AK::retain_if_not_null(m_value.as_icon);
- }
- GVariant::GVariant(Color color)
- : m_type(Type::Color)
- {
- m_value.as_color = color.value();
- }
- GVariant::GVariant(const GVariant& other)
- : m_type(other.m_type)
- {
- switch (m_type) {
- case Type::Bool:
- m_value.as_bool = other.m_value.as_bool;
- break;
- case Type::Int:
- m_value.as_int = other.m_value.as_int;
- break;
- case Type::Float:
- m_value.as_float = other.m_value.as_float;
- break;
- case Type::String:
- m_value.as_string = other.m_value.as_string;
- AK::retain_if_not_null(m_value.as_bitmap);
- break;
- case Type::Bitmap:
- m_value.as_bitmap = other.m_value.as_bitmap;
- AK::retain_if_not_null(m_value.as_bitmap);
- break;
- case Type::Icon:
- m_value.as_icon = other.m_value.as_icon;
- AK::retain_if_not_null(m_value.as_icon);
- break;
- case Type::Color:
- m_value.as_color = other.m_value.as_color;
- break;
- case Type::Invalid:
- break;
- }
- }
- bool GVariant::operator==(const GVariant& other) const
- {
- if (m_type != other.m_type)
- return to_string() == other.to_string();
- switch (m_type) {
- case Type::Bool:
- return as_bool() == other.as_bool();
- case Type::Int:
- return as_int() == other.as_int();
- case Type::Float:
- return as_float() == other.as_float();
- case Type::String:
- return as_string() == other.as_string();
- case Type::Bitmap:
- return m_value.as_bitmap == other.m_value.as_bitmap;
- case Type::Icon:
- return m_value.as_icon == other.m_value.as_icon;
- case Type::Color:
- return m_value.as_color == other.m_value.as_color;
- case Type::Invalid:
- break;
- }
- ASSERT_NOT_REACHED();
- }
- bool GVariant::operator<(const GVariant& other) const
- {
- if (m_type != other.m_type)
- return to_string() < other.to_string();
- switch (m_type) {
- case Type::Bool:
- return as_bool() < other.as_bool();
- case Type::Int:
- return as_int() < other.as_int();
- case Type::Float:
- return as_float() < other.as_float();
- case Type::String:
- return as_string() < other.as_string();
- case Type::Bitmap:
- // FIXME: Maybe compare bitmaps somehow differently?
- return m_value.as_bitmap < other.m_value.as_bitmap;
- case Type::Icon:
- // FIXME: Maybe compare icons somehow differently?
- return m_value.as_icon < other.m_value.as_icon;
- case Type::Color:
- return m_value.as_color < other.m_value.as_color;
- case Type::Invalid:
- break;
- }
- ASSERT_NOT_REACHED();
- }
- String GVariant::to_string() const
- {
- switch (m_type) {
- case Type::Bool:
- return as_bool() ? "True" : "False";
- case Type::Int:
- return String::format("%d", as_int());
- case Type::Float:
- return String::format("%f", (double)as_float());
- case Type::String:
- return as_string();
- case Type::Bitmap:
- return "[GraphicsBitmap]";
- case Type::Icon:
- return "[GIcon]";
- case Type::Color:
- return as_color().to_string();
- case Type::Invalid:
- break;
- }
- ASSERT_NOT_REACHED();
- }
|