Enhance usability of the Tools' Enable/Disable button.

This commit is contained in:
Hombrenatureh.510
2015-03-16 20:18:32 +01:00
parent 052935f587
commit 6be8af55e8
22 changed files with 399 additions and 278 deletions

View File

@@ -401,108 +401,6 @@ bool ExpanderBox::on_expose_event(GdkEventExpose* event) {
return retVal;
}
void MyExpander::init() {
inconsistentPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderInconsistent.png"));
enabledPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderEnabled.png"));
disabledPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderDisabled.png"));
openedPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderOpened.png"));
closedPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderClosed.png"));
}
MyExpander::MyExpander(bool useEnabled, Gtk::Widget* titleWidget) :
enabled(false), inconsistent(false), flushEvent(false), expBox(NULL),
child(NULL), headerWidget(NULL), statusImage(NULL),
label(NULL), useEnabled(useEnabled)
{
set_spacing(options.slimUI ? 0 : 2);
set_name("MyExpander");
set_can_focus(false);
headerHBox = Gtk::manage( new Gtk::HBox());
headerHBox->set_can_focus(false);
if (useEnabled) {
statusImage = Gtk::manage(new Gtk::Image(disabledPBuf));
Gtk::EventBox *imageEvBox = Gtk::manage(new Gtk::EventBox());
imageEvBox->add(*statusImage);
imageEvBox->set_above_child(true);
imageEvBox->signal_button_release_event().connect( sigc::mem_fun(this, & MyExpander::on_enabled_change) );
headerHBox->pack_start(*imageEvBox, Gtk::PACK_SHRINK, 0);
}
else {
statusImage = Gtk::manage(new Gtk::Image(openedPBuf));
headerHBox->pack_start(*statusImage, Gtk::PACK_SHRINK, 0);
}
statusImage->set_can_focus(false);
if (titleWidget) {
headerHBox->pack_start(*titleWidget, Gtk::PACK_EXPAND_WIDGET, 0);
headerWidget = titleWidget;
}
titleEvBox = Gtk::manage(new Gtk::EventBox());
titleEvBox->set_name("MyExpanderTitle");
titleEvBox->add(*headerHBox);
titleEvBox->set_above_child(false); // this is the key! By making it below the child, they will get the events first.
titleEvBox->set_can_focus(false);
pack_start(*titleEvBox, Gtk::PACK_EXPAND_WIDGET, 0);
updateStyle();
titleEvBox->signal_button_release_event().connect( sigc::mem_fun(this, & MyExpander::on_toggle) );
titleEvBox->signal_enter_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave), false);
titleEvBox->signal_leave_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave), false);
}
MyExpander::MyExpander(bool useEnabled, Glib::ustring titleLabel) :
enabled(false), inconsistent(false), flushEvent(false), expBox(NULL),
child(NULL), headerWidget(NULL), statusImage(NULL),
label(NULL), useEnabled(useEnabled)
{
set_spacing(options.slimUI ? 0 : 2);
set_name("MyExpander");
set_can_focus(false);
headerHBox = Gtk::manage( new Gtk::HBox());
headerHBox->set_can_focus(false);
if (useEnabled) {
statusImage = Gtk::manage(new Gtk::Image(disabledPBuf));
Gtk::EventBox *imageEvBox = Gtk::manage(new Gtk::EventBox());
imageEvBox->add(*statusImage);
imageEvBox->set_above_child(true);
imageEvBox->signal_button_release_event().connect( sigc::mem_fun(this, & MyExpander::on_enabled_change) );
headerHBox->pack_start(*imageEvBox, Gtk::PACK_SHRINK, 0);
}
else {
statusImage = Gtk::manage(new Gtk::Image(openedPBuf));
headerHBox->pack_start(*statusImage, Gtk::PACK_SHRINK, 0);
}
statusImage->set_can_focus(false);
Glib::ustring str("-");
if (!titleLabel.empty())
str = titleLabel;
label = Gtk::manage(new Gtk::Label());
label->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
label->set_markup(Glib::ustring("<b>") + escapeHtmlChars(titleLabel) + Glib::ustring("</b>"));
headerHBox->pack_start(*label, Gtk::PACK_EXPAND_WIDGET, 0);
titleEvBox = Gtk::manage(new Gtk::EventBox());
titleEvBox->set_name("MyExpanderTitle");
titleEvBox->add(*headerHBox);
titleEvBox->set_above_child(false); // this is the key! By make it below the child, they will get the events first.
titleEvBox->set_can_focus(false);
pack_start(*titleEvBox, Gtk::PACK_EXPAND_WIDGET, 0);
updateStyle();
titleEvBox->signal_button_release_event().connect( sigc::mem_fun(this, & MyExpander::on_toggle));
titleEvBox->signal_enter_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave), false);
titleEvBox->signal_leave_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave), false);
}
ExpanderBox::ExpanderBox( Gtk::Container *p):pC(p) {
set_name ("ExpanderBox");
updateStyle();
@@ -529,7 +427,113 @@ void ExpanderBox::hideBox() {
Gtk::EventBox::hide();
}
bool MyExpander::on_enter_leave (GdkEventCrossing* event) {
void MyExpander::init() {
inconsistentPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderInconsistent.png"));
enabledPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderEnabled.png"));
disabledPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderDisabled.png"));
openedPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderOpened.png"));
closedPBuf = Gdk::Pixbuf::create_from_file(RTImage::findIconAbsolutePath("expanderClosed.png"));
}
MyExpander::MyExpander(bool useEnabled, Gtk::Widget* titleWidget) :
enabled(false), inconsistent(false), flushEvent(false), expBox(NULL),
child(NULL), headerWidget(NULL), statusImage(NULL),
label(NULL), useEnabled(useEnabled)
{
set_spacing(options.slimUI ? 0 : 2);
set_name("MyExpander");
set_can_focus(false);
headerHBox = Gtk::manage( new Gtk::HBox());
headerHBox->set_can_focus(false);
if (useEnabled) {
statusImage = Gtk::manage(new Gtk::Image(disabledPBuf));
imageEvBox = Gtk::manage(new Gtk::EventBox());
imageEvBox->add(*statusImage);
imageEvBox->set_above_child(true);
imageEvBox->signal_button_release_event().connect( sigc::mem_fun(this, & MyExpander::on_enabled_change) );
imageEvBox->signal_enter_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_enable), false );
imageEvBox->signal_leave_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_enable), false );
headerHBox->pack_start(*imageEvBox, Gtk::PACK_SHRINK, 0);
}
else {
statusImage = Gtk::manage(new Gtk::Image(openedPBuf));
headerHBox->pack_start(*statusImage, Gtk::PACK_SHRINK, 0);
}
statusImage->set_can_focus(false);
if (titleWidget) {
headerHBox->pack_start(*titleWidget, Gtk::PACK_EXPAND_WIDGET, 0);
headerWidget = titleWidget;
}
titleEvBox = Gtk::manage(new Gtk::EventBox());
titleEvBox->set_name("MyExpanderTitle");
titleEvBox->add(*headerHBox);
titleEvBox->set_above_child(false); // this is the key! By making it below the child, they will get the events first.
titleEvBox->set_can_focus(false);
pack_start(*titleEvBox, Gtk::PACK_EXPAND_WIDGET, 0);
updateStyle();
titleEvBox->signal_button_release_event().connect( sigc::mem_fun(this, & MyExpander::on_toggle) );
titleEvBox->signal_enter_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_title), false);
titleEvBox->signal_leave_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_title), false);
}
MyExpander::MyExpander(bool useEnabled, Glib::ustring titleLabel) :
enabled(false), inconsistent(false), flushEvent(false), expBox(NULL),
child(NULL), headerWidget(NULL), statusImage(NULL),
label(NULL), useEnabled(useEnabled)
{
set_spacing(options.slimUI ? 0 : 2);
set_name("MyExpander");
set_can_focus(false);
headerHBox = Gtk::manage( new Gtk::HBox());
headerHBox->set_can_focus(false);
if (useEnabled) {
statusImage = Gtk::manage(new Gtk::Image(disabledPBuf));
imageEvBox = Gtk::manage(new Gtk::EventBox());
imageEvBox->add(*statusImage);
imageEvBox->set_above_child(true);
imageEvBox->signal_button_release_event().connect( sigc::mem_fun(this, & MyExpander::on_enabled_change) );
imageEvBox->signal_enter_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_enable), false );
imageEvBox->signal_leave_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_enable), false );
headerHBox->pack_start(*imageEvBox, Gtk::PACK_SHRINK, 0);
}
else {
statusImage = Gtk::manage(new Gtk::Image(openedPBuf));
headerHBox->pack_start(*statusImage, Gtk::PACK_SHRINK, 0);
}
statusImage->set_can_focus(false);
Glib::ustring str("-");
if (!titleLabel.empty())
str = titleLabel;
label = Gtk::manage(new Gtk::Label());
label->set_alignment(Gtk::ALIGN_LEFT, Gtk::ALIGN_CENTER);
label->set_markup(Glib::ustring("<b>") + escapeHtmlChars(titleLabel) + Glib::ustring("</b>"));
headerHBox->pack_start(*label, Gtk::PACK_EXPAND_WIDGET, 0);
titleEvBox = Gtk::manage(new Gtk::EventBox());
titleEvBox->set_name("MyExpanderTitle");
titleEvBox->add(*headerHBox);
titleEvBox->set_above_child(false); // this is the key! By make it below the child, they will get the events first.
titleEvBox->set_can_focus(false);
pack_start(*titleEvBox, Gtk::PACK_EXPAND_WIDGET, 0);
updateStyle();
titleEvBox->signal_button_release_event().connect( sigc::mem_fun(this, & MyExpander::on_toggle));
titleEvBox->signal_enter_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_title), false);
titleEvBox->signal_leave_notify_event().connect( sigc::mem_fun(this, & MyExpander::on_enter_leave_title), false);
}
bool MyExpander::on_enter_leave_title (GdkEventCrossing* event) {
if (is_sensitive()) {
if (event->type == GDK_ENTER_NOTIFY) {
titleEvBox->set_state(Gtk::STATE_PRELIGHT);
@@ -543,6 +547,20 @@ bool MyExpander::on_enter_leave (GdkEventCrossing* event) {
return true;
}
bool MyExpander::on_enter_leave_enable (GdkEventCrossing* event) {
if (is_sensitive()) {
if (event->type == GDK_ENTER_NOTIFY) {
imageEvBox->set_state(Gtk::STATE_PRELIGHT);
queue_draw();
}
else if (event->type == GDK_LEAVE_NOTIFY) {
imageEvBox->set_state(Gtk::STATE_NORMAL);
queue_draw();
}
}
return true;
}
void MyExpander::updateStyle() {
headerHBox->set_spacing(options.slimUI ? 2 : 5);
headerHBox->set_border_width(options.slimUI ? 1 : 2);