improve inputbox
fix some inputbox issues add a new inputbox::path class
This commit is contained in:
@@ -1,19 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* Filebox
|
||||||
|
* Nana C++ Library(http://www.nanapro.org)
|
||||||
|
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*
|
||||||
|
* @file: nana/gui/filebox.hpp
|
||||||
|
*/
|
||||||
|
|
||||||
#ifndef NANA_GUI_FILEBOX_HPP
|
#ifndef NANA_GUI_FILEBOX_HPP
|
||||||
#define NANA_GUI_FILEBOX_HPP
|
#define NANA_GUI_FILEBOX_HPP
|
||||||
#include <nana/gui/wvl.hpp>
|
#include <nana/gui/basis.hpp>
|
||||||
|
#include <vector>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
namespace nana
|
namespace nana
|
||||||
{ /// Create an Open or Save dialog box to let user select the name of a file.
|
{ /// Create an Open or Save dialog box to let user select the name of a file.
|
||||||
class filebox
|
class filebox
|
||||||
: nana::noncopyable
|
|
||||||
{
|
{
|
||||||
struct implement;
|
struct implement;
|
||||||
public:
|
|
||||||
typedef std::vector<std::pair<nana::string, nana::string>> filters;
|
|
||||||
|
|
||||||
|
filebox(filebox&&) = delete;
|
||||||
|
filebox& operator=(filebox&&) = delete;
|
||||||
|
public:
|
||||||
|
using filters = std::vector<std::pair<nana::string, nana::string>>;
|
||||||
|
|
||||||
|
filebox(bool is_open_mode);
|
||||||
filebox(window owner, bool is_open_mode);
|
filebox(window owner, bool is_open_mode);
|
||||||
|
filebox(const filebox&);
|
||||||
~filebox();
|
~filebox();
|
||||||
|
|
||||||
|
filebox& operator=(const filebox&);
|
||||||
|
|
||||||
|
/// Change owner window
|
||||||
|
void owner(window);
|
||||||
|
|
||||||
/** @brief specify a title for the dialog
|
/** @brief specify a title for the dialog
|
||||||
* @param string a text for title
|
* @param string a text for title
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
#define NANA_GUI_MSGBOX_HPP
|
#define NANA_GUI_MSGBOX_HPP
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <nana/gui/basis.hpp>
|
#include <nana/gui/filebox.hpp>
|
||||||
|
|
||||||
namespace nana
|
namespace nana
|
||||||
{
|
{
|
||||||
@@ -188,7 +188,7 @@ namespace nana
|
|||||||
{
|
{
|
||||||
struct implement;
|
struct implement;
|
||||||
public:
|
public:
|
||||||
path(::nana::string label, ::nana::string init_path = ::nana::string());
|
path(::nana::string label, const ::nana::filebox&);
|
||||||
~path();
|
~path();
|
||||||
|
|
||||||
::nana::string value() const;
|
::nana::string value() const;
|
||||||
@@ -196,7 +196,6 @@ namespace nana
|
|||||||
//Implementation of abstract_content
|
//Implementation of abstract_content
|
||||||
const ::nana::string& label() const override;
|
const ::nana::string& label() const override;
|
||||||
window create(window, unsigned label_px) override;
|
window create(window, unsigned label_px) override;
|
||||||
unsigned fixed_pixels() const override;
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<implement> impl_;
|
std::unique_ptr<implement> impl_;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,16 @@
|
|||||||
#include <nana/gui/filebox.hpp>
|
/*
|
||||||
|
* Filebox
|
||||||
|
* Nana C++ Library(http://www.nanapro.org)
|
||||||
|
* Copyright(C) 2003-2015 Jinhao(cnjinhao@hotmail.com)
|
||||||
|
*
|
||||||
|
* Distributed under the Boost Software License, Version 1.0.
|
||||||
|
* (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
* http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
*
|
||||||
|
* @file: nana/gui/filebox.cpp
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <nana/gui.hpp>
|
||||||
#include <nana/filesystem/fs_utility.hpp>
|
#include <nana/filesystem/fs_utility.hpp>
|
||||||
|
|
||||||
#if defined(NANA_WINDOWS)
|
#if defined(NANA_WINDOWS)
|
||||||
@@ -858,6 +870,11 @@ namespace nana
|
|||||||
std::vector<filter> filters;
|
std::vector<filter> filters;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
filebox::filebox(bool is_openmode)
|
||||||
|
: filebox(nullptr, is_openmode)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
filebox::filebox(window owner, bool open)
|
filebox::filebox(window owner, bool open)
|
||||||
: impl_(new implement)
|
: impl_(new implement)
|
||||||
{
|
{
|
||||||
@@ -874,11 +891,27 @@ namespace nana
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filebox::filebox(const filebox& other)
|
||||||
|
: impl_(new implement(*other.impl_))
|
||||||
|
{}
|
||||||
|
|
||||||
filebox::~filebox()
|
filebox::~filebox()
|
||||||
{
|
{
|
||||||
delete impl_;
|
delete impl_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
filebox& filebox::operator=(const filebox& other)
|
||||||
|
{
|
||||||
|
if (this != &other)
|
||||||
|
*impl_ = *other.impl_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void filebox::owner(window wd)
|
||||||
|
{
|
||||||
|
impl_->owner = wd;
|
||||||
|
}
|
||||||
|
|
||||||
nana::string filebox::title(nana::string s)
|
nana::string filebox::title(nana::string s)
|
||||||
{
|
{
|
||||||
impl_->title.swap(s);
|
impl_->title.swap(s);
|
||||||
|
|||||||
@@ -676,6 +676,9 @@ namespace nana
|
|||||||
|
|
||||||
int inputbox::integer::value() const
|
int inputbox::integer::value() const
|
||||||
{
|
{
|
||||||
|
if (!impl_->spinbox.empty())
|
||||||
|
return impl_->spinbox.to_int();
|
||||||
|
|
||||||
return impl_->value;
|
return impl_->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -751,6 +754,9 @@ namespace nana
|
|||||||
|
|
||||||
double inputbox::real::value() const
|
double inputbox::real::value() const
|
||||||
{
|
{
|
||||||
|
if (!impl_->spinbox.empty())
|
||||||
|
return impl_->spinbox.to_double();
|
||||||
|
|
||||||
return impl_->value;
|
return impl_->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -788,7 +794,7 @@ namespace nana
|
|||||||
|
|
||||||
impl->spinbox.events().destroy.connect_unignorable([impl]
|
impl->spinbox.events().destroy.connect_unignorable([impl]
|
||||||
{
|
{
|
||||||
impl->value = impl->spinbox.to_int();
|
impl->value = impl->spinbox.to_double();
|
||||||
});
|
});
|
||||||
|
|
||||||
return impl->dock;
|
return impl->dock;
|
||||||
@@ -844,6 +850,11 @@ namespace nana
|
|||||||
|
|
||||||
::nana::string inputbox::text::value() const
|
::nana::string inputbox::text::value() const
|
||||||
{
|
{
|
||||||
|
if (!impl_->textbox.empty())
|
||||||
|
return impl_->textbox.caption();
|
||||||
|
else if (!impl_->combox.empty())
|
||||||
|
return impl_->combox.caption();
|
||||||
|
|
||||||
return impl_->value;
|
return impl_->value;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -869,6 +880,7 @@ namespace nana
|
|||||||
impl->textbox.create(impl->dock, rectangle{ static_cast<int>(label_px + 10), 0, 0, 0 });
|
impl->textbox.create(impl->dock, rectangle{ static_cast<int>(label_px + 10), 0, 0, 0 });
|
||||||
impl->textbox.tip_string(impl->tip);
|
impl->textbox.tip_string(impl->tip);
|
||||||
impl->textbox.mask(impl->mask_character);
|
impl->textbox.mask(impl->mask_character);
|
||||||
|
impl->textbox.multi_lines(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -940,16 +952,23 @@ namespace nana
|
|||||||
|
|
||||||
int inputbox::date::year() const
|
int inputbox::date::year() const
|
||||||
{
|
{
|
||||||
|
if (!impl_->wdg_year.empty())
|
||||||
|
return impl_->wdg_year.to_int();
|
||||||
|
|
||||||
return impl_->year;
|
return impl_->year;
|
||||||
}
|
}
|
||||||
|
|
||||||
int inputbox::date::month() const
|
int inputbox::date::month() const
|
||||||
{
|
{
|
||||||
|
if (!impl_->wdg_month.empty())
|
||||||
|
return impl_->wdg_month.option() + 1;
|
||||||
return impl_->month;
|
return impl_->month;
|
||||||
}
|
}
|
||||||
|
|
||||||
int inputbox::date::day() const
|
int inputbox::date::day() const
|
||||||
{
|
{
|
||||||
|
if (!impl_->wdg_day.empty())
|
||||||
|
return impl_->wdg_day.to_int();
|
||||||
return impl_->day;
|
return impl_->day;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1046,6 +1065,87 @@ namespace nana
|
|||||||
}
|
}
|
||||||
//end class date
|
//end class date
|
||||||
|
|
||||||
|
//class path
|
||||||
|
struct inputbox::path::implement
|
||||||
|
{
|
||||||
|
filebox fbox;
|
||||||
|
|
||||||
|
::nana::string value;
|
||||||
|
::nana::string label_text;
|
||||||
|
::nana::panel<false> dock;
|
||||||
|
::nana::label label;
|
||||||
|
::nana::textbox path_edit;
|
||||||
|
::nana::button browse;
|
||||||
|
|
||||||
|
implement(const filebox& fb, ::nana::string&& labelstr)
|
||||||
|
: fbox(fb), label_text(std::move(labelstr))
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
|
inputbox::path::path(::nana::string label, const filebox& fb)
|
||||||
|
: impl_(new implement(fb, std::move(label)))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
//Instance for impl_ because implmenet is incomplete type at the point of declaration
|
||||||
|
inputbox::path::~path(){}
|
||||||
|
|
||||||
|
::nana::string inputbox::path::value() const
|
||||||
|
{
|
||||||
|
if (!impl_->path_edit.empty())
|
||||||
|
return impl_->path_edit.caption();
|
||||||
|
|
||||||
|
return impl_->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Implementation of abstract_content
|
||||||
|
const ::nana::string& inputbox::path::label() const
|
||||||
|
{
|
||||||
|
return impl_->label_text;
|
||||||
|
}
|
||||||
|
|
||||||
|
window inputbox::path::create(window wd, unsigned label_px)
|
||||||
|
{
|
||||||
|
auto impl = impl_.get();
|
||||||
|
impl->dock.create(wd);
|
||||||
|
|
||||||
|
impl->label.create(impl->dock, rectangle{ 0, 0, label_px, 0 });
|
||||||
|
impl->label.text_align(::nana::align::right, ::nana::align_v::center);
|
||||||
|
impl->label.caption(impl->label_text);
|
||||||
|
impl->label.format(true);
|
||||||
|
|
||||||
|
impl->path_edit.create(impl->dock, rectangle{static_cast<int>(label_px + 10), 0, 0, 0});
|
||||||
|
impl->path_edit.caption(impl->fbox.path());
|
||||||
|
impl->path_edit.multi_lines(false);
|
||||||
|
|
||||||
|
impl->browse.create(impl->dock);
|
||||||
|
impl->browse.i18n(i18n_eval("Browse"));
|
||||||
|
impl->browse.events().click([wd, impl]
|
||||||
|
{
|
||||||
|
impl->fbox.owner(wd);
|
||||||
|
if (impl->fbox.show())
|
||||||
|
{
|
||||||
|
impl->value = impl->fbox.file();
|
||||||
|
impl->path_edit.caption(impl->value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
impl->dock.events().resized.connect_unignorable([impl, label_px](const ::nana::arg_resized& arg)
|
||||||
|
{
|
||||||
|
impl->label.size({ label_px, arg.height });
|
||||||
|
impl->path_edit.size({arg.width - label_px - 75, arg.height});
|
||||||
|
impl->browse.move({static_cast<int>(arg.width - 60), 0, 60, arg.height});
|
||||||
|
});
|
||||||
|
|
||||||
|
impl->path_edit.events().destroy.connect_unignorable([impl]
|
||||||
|
{
|
||||||
|
impl->value = impl->path_edit.caption();
|
||||||
|
});
|
||||||
|
|
||||||
|
return impl->dock;
|
||||||
|
}
|
||||||
|
//end class path
|
||||||
|
|
||||||
|
|
||||||
inputbox::inputbox(window owner, ::nana::string desc, ::nana::string title)
|
inputbox::inputbox(window owner, ::nana::string desc, ::nana::string title)
|
||||||
: owner_{ owner },
|
: owner_{ owner },
|
||||||
|
|||||||
Reference in New Issue
Block a user