summaryrefslogtreecommitdiff
path: root/fluid
diff options
context:
space:
mode:
Diffstat (limited to 'fluid')
-rw-r--r--fluid/nodes/Menu_Node.cxx5
-rw-r--r--fluid/nodes/Widget_Node.cxx3
-rw-r--r--fluid/nodes/Widget_Node.h6
-rw-r--r--fluid/panels/widget_panel.cxx47
-rw-r--r--fluid/panels/widget_panel.fl59
5 files changed, 98 insertions, 22 deletions
diff --git a/fluid/nodes/Menu_Node.cxx b/fluid/nodes/Menu_Node.cxx
index f5555644c..342fcf014 100644
--- a/fluid/nodes/Menu_Node.cxx
+++ b/fluid/nodes/Menu_Node.cxx
@@ -128,7 +128,7 @@ void Input_Choice_Node::build_menu() {
}
m->shortcut(((Fl_Button*)(i->o))->shortcut());
m->callback(nullptr,(void*)i);
- m->flags = i->flags();
+ m->flags = i->flags() & ~FL_MENU_HEADLINE;
m->labelfont(i->o->labelfont());
m->labelsize(i->o->labelsize());
m->labelcolor(i->o->labelcolor());
@@ -467,6 +467,7 @@ int Menu_Item_Node::flags() {
else i |= FL_SUBMENU_POINTER;
}
if (hotspot()) i |= FL_MENU_DIVIDER;
+ if (menu_headline()) i |= FL_MENU_HEADLINE;
return i;
}
@@ -697,7 +698,7 @@ void Menu_Base_Node::build_menu() {
}
m->shortcut(((Fl_Button*)(i->o))->shortcut());
m->callback(nullptr,(void*)i);
- m->flags = i->flags() | i->o->type();
+ m->flags = (i->flags() | i->o->type()) & ~FL_MENU_HEADLINE;
m->labelfont(i->o->labelfont());
m->labelsize(i->o->labelsize());
m->labelcolor(i->o->labelcolor());
diff --git a/fluid/nodes/Widget_Node.cxx b/fluid/nodes/Widget_Node.cxx
index 2082941ce..3d076b29b 100644
--- a/fluid/nodes/Widget_Node.cxx
+++ b/fluid/nodes/Widget_Node.cxx
@@ -2007,6 +2007,7 @@ void Widget_Node::write_properties(fld::io::Project_Writer &f) {
if (!o->active()) f.write_string("deactivate");
if (resizable()) f.write_string("resizable");
if (hotspot()) f.write_string(is_a(Type::Menu_Item) ? "divider" : "hotspot");
+ if (menu_headline()) f.write_string("headline");
for (int n=0; n < NUM_EXTRA_CODE; n++) if (extra_code(n)) {
f.write_indent(level+1);
f.write_string("code%d",n);
@@ -2179,6 +2180,8 @@ void Widget_Node::read_property(fld::io::Project_Reader &f, const char *c) {
resizable(1);
} else if (!strcmp(c,"hotspot") || !strcmp(c, "divider")) {
hotspot(1);
+ } else if (!strcmp(c,"headline")) {
+ menu_headline(true);
} else if (!strcmp(c,"class")) {
subclass(f.read_word());
} else if (!strcmp(c,"shortcut")) {
diff --git a/fluid/nodes/Widget_Node.h b/fluid/nodes/Widget_Node.h
index 261005590..fd0b7ddbe 100644
--- a/fluid/nodes/Widget_Node.h
+++ b/fluid/nodes/Widget_Node.h
@@ -51,6 +51,8 @@ class Widget_Node : public Node
const char *inactive_name_;
uchar hotspot_;
+ bool menu_headline_ { false };
+
protected:
/// This variable is set for visible windows in batch mode.
@@ -97,11 +99,15 @@ public:
void image_name(const char *);
const char *inactive_name() const {return inactive_name_;}
void inactive_name(const char *);
+ // Note: hotspot is misused by menu items to indicate a divider
uchar hotspot() const {return hotspot_;}
void hotspot(uchar v) {hotspot_ = v;}
uchar resizable() const;
void resizable(uchar v);
+ bool menu_headline() const { return menu_headline_; }
+ void menu_headline(bool v) { menu_headline_ = v; }
+
virtual int textstuff(int what, Fl_Font &, int &, Fl_Color &);
virtual Fl_Menu_Item *subtypes();
diff --git a/fluid/panels/widget_panel.cxx b/fluid/panels/widget_panel.cxx
index 86bff8e62..049667d69 100644
--- a/fluid/panels/widget_panel.cxx
+++ b/fluid/panels/widget_panel.cxx
@@ -620,7 +620,7 @@ static void cb_Browse1(Fl_Button* o, void* v) {
Fl_Group *wp_gui_alignment=(Fl_Group *)0;
Fl_Menu_Item menu_[] = {
- {" Image Alignment ", 0, 0, (void*)((fl_intptr_t)0xFFFFFFFF), 1, (uchar)FL_NORMAL_LABEL, 2, 10, 0},
+ {" Image Alignment ", 0, 0, (void*)((fl_intptr_t)-1), 1024, (uchar)FL_NORMAL_LABEL, 1, 10, 0},
{"image over text", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_IMAGE_OVER_TEXT), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
{"text over image", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TEXT_OVER_IMAGE), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
{"text next to image", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TEXT_NEXT_TO_IMAGE), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
@@ -630,7 +630,7 @@ Fl_Menu_Item menu_[] = {
};
Fl_Menu_Item menu_1[] = {
- {" Inside && Outside ", 0, 0, (void*)((fl_intptr_t)0xFFFFFFFF), 1, (uchar)FL_NORMAL_LABEL, 2, 10, 0},
+ {" Inside && Outside ", 0, 0, (void*)((fl_intptr_t)-1), 1024, (uchar)FL_NORMAL_LABEL, 1, 10, 0},
{"top left", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TOP_LEFT), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
{"top", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TOP), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
{"top right", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_TOP_RIGHT), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
@@ -640,7 +640,7 @@ Fl_Menu_Item menu_1[] = {
{"bottom left", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_BOTTOM_LEFT), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
{"bottom", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_BOTTOM), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
{"bottom right", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_BOTTOM_RIGHT), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
- {" Outside Alignment ", 0, 0, (void*)((fl_intptr_t)0xFFFFFFFF), 1, (uchar)FL_NORMAL_LABEL, 2, 10, 0},
+ {" Outside Alignment ", 0, 0, (void*)((fl_intptr_t)-1), 1024, (uchar)FL_NORMAL_LABEL, 1, 10, 0},
{"left top", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_LEFT_TOP), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
{"right top", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_RIGHT_TOP), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
{"left bottom", 0, 0, (void*)((fl_intptr_t)FL_ALIGN_LEFT_BOTTOM), 0, (uchar)FL_NORMAL_LABEL, 0, 9, 0},
@@ -1454,9 +1454,12 @@ static void cb_Active(Fl_Light_Button* o, void* v) {
static void cb_Resizable(Fl_Light_Button* o, void* v) {
if (v == LOAD) {
- if (current_widget->is_a(Type::Menu_Item)) {o->deactivate(); return;}
+ if (current_widget->is_a(Type::Menu_Item)) {
+ o->hide();
+ return;
+ }
if (numselected > 1) {o->deactivate(); return;}
- o->activate();
+ o->show();
o->value(current_widget->resizable());
} else {
Fluid.proj.undo.checkpoint();
@@ -1465,6 +1468,31 @@ static void cb_Resizable(Fl_Light_Button* o, void* v) {
}
}
+static void cb_Headline(Fl_Light_Button* o, void* v) {
+ if (v == LOAD) {
+ if (!current_widget->is_a(Type::Menu_Item)) {
+ o->hide();
+ return;
+ }
+ o->show();
+ o->value(current_widget->menu_headline());
+ } else {
+ int mod = 0;
+ int n = o->value();
+ for (Widget_Node *q: Fluid.proj.tree.all_selected_widgets()) {
+ if (q->is_a(Type::Menu_Item)) {
+ if (!mod) {
+ mod = 1;
+ Fluid.proj.undo.checkpoint();
+ }
+ q->menu_headline(n);
+ q->redraw();
+ }
+ }
+ if (mod) Fluid.proj.set_modflag(1);
+ }
+}
+
static void cb_Hotspot(Fl_Light_Button* o, void* v) {
if (v == LOAD) {
if (numselected > 1) {o->deactivate(); return;}
@@ -2735,6 +2763,14 @@ Fl_Double_Window* make_widget_panel() {
o->callback((Fl_Callback*)cb_Resizable);
o->when(FL_WHEN_CHANGED);
} // Fl_Light_Button* o
+ { Fl_Light_Button* o = new Fl_Light_Button(225, 260, 75, 20, "Headline");
+ o->tooltip("Make a menu item the headline of a menu\nunselectable, but not grayed out");
+ o->selection_color((Fl_Color)1);
+ o->labelsize(11);
+ o->callback((Fl_Callback*)cb_Headline);
+ o->when(FL_WHEN_CHANGED);
+ o->hide();
+ } // Fl_Light_Button* o
{ Fl_Light_Button* o = new Fl_Light_Button(305, 260, 70, 20, "Hotspot");
o->tooltip("Center the window under this widget.");
o->selection_color((Fl_Color)1);
@@ -2744,7 +2780,6 @@ Fl_Double_Window* make_widget_panel() {
} // Fl_Light_Button* o
{ Fl_Box* o = new Fl_Box(395, 260, 0, 20);
o->labelsize(11);
- Fl_Group::current()->resizable(o);
} // Fl_Box* o
wp_gui_attributes->end();
} // Fl_Group* wp_gui_attributes
diff --git a/fluid/panels/widget_panel.fl b/fluid/panels/widget_panel.fl
index b120ec28f..2c2e75a08 100644
--- a/fluid/panels/widget_panel.fl
+++ b/fluid/panels/widget_panel.fl
@@ -2,6 +2,7 @@
version 1.0500
header_name {.h}
code_name {.cxx}
+include_guard {}
snap {
ver 1
current_suite FLTK
@@ -25,7 +26,7 @@ comment {//
} {in_source in_header
}
-decl {\#include <stdlib.h> // free()} {selected private global
+decl {\#include <stdlib.h> // free()} {private global
}
decl {\#include "panels/widget_panel/Grid_Child_Tab.h"} {public global
@@ -630,13 +631,13 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 15 t
tooltip {Bottom-align the label.} xywh {353 115 20 20} type Toggle selection_color 8 labelsize 11 labelcolor 8 hide
}
Fl_Choice {} {
- callback align_text_image_cb
+ callback align_text_image_cb open
xywh {172 115 116 20} down_box BORDER_BOX labelsize 11 textsize 11
} {
MenuItem {} {
label { Image Alignment }
- user_data {(fl_intptr_t)0xFFFFFFFF}
- xywh {145 145 100 20} labelfont 2 labelsize 10 deactivate
+ user_data {(fl_intptr_t)-1} selected
+ xywh {145 145 100 20} labelfont 1 labelsize 10 headline
}
MenuItem {} {
label {image over text}
@@ -665,13 +666,13 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 15 t
}
}
Fl_Choice {} {
- callback align_position_cb
+ callback align_position_cb open
xywh {293 115 86 20} down_box BORDER_BOX labelsize 11 textsize 11
} {
MenuItem {} {
label { Inside && Outside }
- user_data {(fl_intptr_t)0xFFFFFFFF}
- xywh {135 135 100 20} labelfont 2 labelsize 10 deactivate
+ user_data {(fl_intptr_t)-1}
+ xywh {135 135 100 20} labelfont 1 labelsize 10 headline
}
MenuItem {} {
label {top left}
@@ -720,8 +721,8 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 15 t
}
MenuItem {} {
label { Outside Alignment }
- user_data {(fl_intptr_t)0xFFFFFFFF}
- xywh {125 125 100 20} labelfont 2 labelsize 10 deactivate
+ user_data {(fl_intptr_t)-1}
+ xywh {125 125 100 20} labelfont 1 labelsize 10 headline
}
MenuItem {} {
label {left top}
@@ -756,7 +757,7 @@ Use Ctrl-J for newlines.} xywh {95 40 190 20} labelfont 1 labelsize 11 when 15 t
}
Fl_Group {} {
label {Position:}
- callback position_group_cb
+ callback position_group_cb open
xywh {95 150 314 20} labelfont 1 labelsize 11 align 4
} {
Fl_Input widget_x_input {
@@ -1574,7 +1575,7 @@ Use 'Backspace' key to clear.} xywh {95 210 310 20} box DOWN_BOX color 7 selecti
}
Fl_Group wp_gui_attributes {
label {Attributes:}
- callback propagate_load
+ callback propagate_load open
xywh {95 260 305 20} labelfont 1 labelsize 11 align 4
} {
Fl_Light_Button {} {
@@ -1632,9 +1633,12 @@ Use 'Backspace' key to clear.} xywh {95 210 310 20} box DOWN_BOX color 7 selecti
Fl_Light_Button {} {
label Resizable
callback {if (v == LOAD) {
- if (current_widget->is_a(Type::Menu_Item)) {o->deactivate(); return;}
+ if (current_widget->is_a(Type::Menu_Item)) {
+ o->hide();
+ return;
+ }
if (numselected > 1) {o->deactivate(); return;}
- o->activate();
+ o->show();
o->value(current_widget->resizable());
} else {
Fluid.proj.undo.checkpoint();
@@ -1644,6 +1648,33 @@ Use 'Backspace' key to clear.} xywh {95 210 310 20} box DOWN_BOX color 7 selecti
tooltip {Make the widget resizable.} xywh {225 260 75 20} selection_color 1 labelsize 11 when 1
}
Fl_Light_Button {} {
+ label Headline
+ callback {if (v == LOAD) {
+ if (!current_widget->is_a(Type::Menu_Item)) {
+ o->hide();
+ return;
+ }
+ o->show();
+ o->value(current_widget->menu_headline());
+} else {
+ int mod = 0;
+ int n = o->value();
+ for (Widget_Node *q: Fluid.proj.tree.all_selected_widgets()) {
+ if (q->is_a(Type::Menu_Item)) {
+ if (!mod) {
+ mod = 1;
+ Fluid.proj.undo.checkpoint();
+ }
+ q->menu_headline(n);
+ q->redraw();
+ }
+ }
+ if (mod) Fluid.proj.set_modflag(1);
+}}
+ tooltip {Make a menu item the headline of a menu
+unselectable, but not grayed out} xywh {225 260 75 20} selection_color 1 labelsize 11 when 1 hide
+ }
+ Fl_Light_Button {} {
label Hotspot
callback {if (v == LOAD) {
if (numselected > 1) {o->deactivate(); return;}
@@ -1672,7 +1703,7 @@ Use 'Backspace' key to clear.} xywh {95 210 310 20} box DOWN_BOX color 7 selecti
tooltip {Center the window under this widget.} xywh {305 260 70 20} selection_color 1 labelsize 11 when 1
}
Fl_Box {} {
- xywh {395 260 0 20} labelsize 11 resizable
+ xywh {395 260 0 20} labelsize 11
}
}
Fl_Input wp_gui_tooltip {