Browse Source

Added more classes and methods needed by ourbiz sample.

mingodad 13 years ago
parent
commit
e3574848f8

+ 88 - 24
ext/sq_fltk.cpp

@@ -18,6 +18,7 @@
 #include <FL/Fl_Menu_Item.H>
 #include <FL/Fl_Menu_.H>
 #include <FL/Fl_Menu_Bar.H>
+#include <FL/Fl_Menu_Button.H>
 #include <FL/Fl_Choice.H>
 #include <FL/Fl_Input_.H>
 #include <FL/Fl_Input.H>
@@ -62,6 +63,7 @@ CREATE_TAG(Fl_Return_Button);
 CREATE_TAG(Fl_Round_Button);
 CREATE_TAG(Fl_Menu_);
 CREATE_TAG(Fl_Menu_Bar);
+CREATE_TAG(Fl_Menu_Button);
 CREATE_TAG(Fl_Menu_Item);
 CREATE_TAG(Fl_Choice);
 CREATE_TAG(Fl_Input_);
@@ -745,11 +747,30 @@ static SQInteger _Fl_Menu__copy(HSQUIRRELVM v)
     //self->copy(&menu_items);
     return 0;
 }
+
+static SQInteger _Fl_Menu__add(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    SETUP_FL_MENU_(v);
+    SQ_GET_STRING(v, 2, label);
+    self->add(label);
+    return 0;
+}
+
+static SQInteger _Fl_Menu__value(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    SETUP_FL_MENU_(v);
+    sq_pushinteger(v, self->value());
+    return 1;
+}
 
 #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Menu__##name,nparams,pmask}
 static SQRegFunction fl_menu__obj_funcs[]={
 	_DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
 	_DECL_FUNC(copy,-2,_SC("xa.")),
+	_DECL_FUNC(add,2,_SC("xs")),
+	_DECL_FUNC(value,1,_SC("x")),
 	{0,0}
 };
 #undef _DECL_FUNC
@@ -762,6 +783,31 @@ static SQRegFunction fl_menu_bar_obj_funcs[]={
 };
 #undef _DECL_FUNC
 
+FLTK_CONSTRUCTOR(Fl_Menu_Button);
+#define SETUP_FL_MENU_BUTTON(v) SETUP_FL_KLASS(v, Fl_Menu_Button)
+
+static SQInteger _Fl_Menu_Button_popup(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS(v);
+    SETUP_FL_MENU_BUTTON(v);
+    if(_top_ > 1){
+        SQ_GET_INTEGER(v, 2, x);
+        SQ_GET_INTEGER(v, 3, y);
+        self->popup(x, y);
+    }
+    else self->popup();
+	return 0;
+}
+
+
+#define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Menu_Button_##name,nparams,pmask}
+static SQRegFunction fl_menu_button_obj_funcs[]={
+	_DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
+	_DECL_FUNC(popup,-1,_SC("xnn")),
+	{0,0}
+};
+#undef _DECL_FUNC
+
 FLTK_CONSTRUCTOR(Fl_Choice);
 #define _DECL_FUNC(name,nparams,pmask) {_SC(#name),_Fl_Choice_##name,nparams,pmask}
 static SQRegFunction fl_choice_obj_funcs[]={
@@ -1266,7 +1312,6 @@ class Flv_Data_Table : public Flv_Table
 public:
     int selection_count, _draw_offset;
     bool _forPrint;
-    Fl_Menu_Button *_popup_menu;
 
     Flv_Data_Table(int X, int Y, int W=340, int H=202, const char *L=0):
         Flv_Table(X, Y, W, H, L)
@@ -1274,7 +1319,6 @@ public:
         _draw_offset = 5;
         selection_count = 0;
         _forPrint = false;
-        _popup_menu = 0;
 
         callback_when( FLVEcb_ROW_CHANGED | FLVEcb_CLICKED);
         selection_color(FL_BLUE);
@@ -1293,9 +1337,22 @@ public:
         col_style.get(-1).align(FL_ALIGN_CLIP);
     }
     void resize(int x, int y, int w, int h)
-    {
-        Flv_Table::resize(x, y, w, h);
-        //calc_cols();
+    {
+        bool done = false;
+        HSQUIRRELVM v = (HSQUIRRELVM) Fl::user_data;
+        SQInteger top = sq_gettop(v);
+        if(sq_get_fl_virtual(v, this, "resize") == SQ_OK){
+            sq_push(v, -2); //this
+            sq_pushinteger(v, x);
+            sq_pushinteger(v, y);
+            sq_pushinteger(v, w);
+            sq_pushinteger(v, h);
+            if(sq_call(v, 5, SQFalse, SQTrue) == SQ_OK){
+                    done = true;
+            }
+        }
+        sq_settop(v, top);
+        if(!done) Flv_Table::resize(x, y, w, h);
     }
 
     void textsize(Fl_Fontsize s)
@@ -1430,11 +1487,7 @@ public:
             {
             case FL_LEFT_MOUSE:
                 take_focus();
-                break;
-            case FL_RIGHT_MOUSE:
-                show_popup_menu();
-                return 1;
-                break;
+                break;
             }
         }
         break;
@@ -1463,20 +1516,6 @@ public:
         return Flv_Table::handle(event);
     }
 
-    void show_popup_menu()
-    {
-        if(_popup_menu) _popup_menu->popup();
-    }
-
-    void set_popup_menu(Fl_Menu_Button *popup)
-    {
-        _popup_menu=popup;
-    }
-    Fl_Menu_Button *get_popup_menu()
-    {
-        return _popup_menu;
-    }
-
     virtual Fl_Color get_multi_select_color()
     {
         return fl_color_average(FL_RED, FL_WHITE, 0.5);;
@@ -1532,6 +1571,18 @@ static SQInteger _Flv_Data_Table_handle(HSQUIRRELVM v)
     return 1;
 }
 
+static SQInteger _Flv_Data_Table_resize(HSQUIRRELVM v)
+{
+    SQ_FUNC_VARS_NO_TOP(v);
+    SETUP_FLV_DATA_TABLE(v);
+    SQ_GET_INTEGER(v, 2, x);
+    SQ_GET_INTEGER(v, 3, y);
+    SQ_GET_INTEGER(v, 4, w);
+    SQ_GET_INTEGER(v, 5, h);
+    ((Flv_Data_Table*)self)->Flv_Table::resize(x, y, w, h);
+    return 0;
+}
+
 static SQInteger _Flv_Data_Table_draw_offset(HSQUIRRELVM v)
 {
     SQ_FUNC_VARS(v);
@@ -1551,6 +1602,7 @@ FLTK_CONSTRUCTOR(Flv_Data_Table);
 static SQRegFunction flv_data_table_obj_funcs[]={
 	_DECL_FUNC(constructor,-5,FLTK_constructor_Mask),
 	_DECL_FUNC(handle,2,_SC("xi")),
+	_DECL_FUNC(resize,5,_SC("xnnnn")),
 	_DECL_FUNC(draw_offset, -1,_SC("xn")),
 	{0,0}
 };
@@ -2285,6 +2337,18 @@ SQRESULT sqext_register_fltklib(HSQUIRRELVM v)
 	PUSH_FL_CLASS(Fl_Menu_, Fl_Widget, fl_menu__obj_funcs);
 	PUSH_FL_CLASS(Fl_Menu_Bar, Fl_Menu_, fl_menu_bar_obj_funcs);
 	PUSH_FL_CLASS(Fl_Choice, Fl_Menu_, fl_choice_obj_funcs);
+	sq_pushnewclass(v, FLTK_TAG(Fl_Menu_Button), FLTK_TAG(Fl_Menu_), (void*)FLTK_TAG(Fl_Menu_Button),
+                 fl_menu_button_obj_funcs, SQTrue);
+#define POPUP_INT_CONST(key) INT_CONST_PREFIX(Fl_Menu_Button::, key)
+
+	POPUP_INT_CONST(POPUP1);
+	POPUP_INT_CONST(POPUP2);
+	POPUP_INT_CONST(POPUP12);
+	POPUP_INT_CONST(POPUP3);
+	POPUP_INT_CONST(POPUP13);
+	POPUP_INT_CONST(POPUP23);
+	POPUP_INT_CONST(POPUP123);
+	sq_poptop(v); //remove Fl_Menu_Button
 
 	//Fl_Input_ class
 	PUSH_FL_CLASS(Fl_Input_, Fl_Widget, fl_input__obj_funcs);

+ 1 - 1
ourbiz/edit-entity-window.nut

@@ -62,7 +62,7 @@ class EditEntitiesWindow extends MyBaseWindow {
 	print_progress=null;
 	
 	constructor(){
-		base.constructor(10, 50, 800, 560, "Edit Entity");
+		base.constructor(-1, -1, 800, 560, "Edit Entity");
 		//clear_flag(GROUP_RELATIVE);
 begin();
 this->box(FL_FLAT_BOX);

+ 1 - 1
ourbiz/edit-order-window.nut

@@ -175,7 +175,7 @@ class EditOrderWindow extends MyBaseWindow {
 	btnRefreshTotals=null;
 	
 constructor() {
-	base.constructor(10, 50, 800, 560, _tr("Edit Order"));
+	base.constructor(-1, -1, 800, 560, _tr("Edit Order"));
 begin();
 this->box(FL_FLAT_BOX);
 this->color(FL_BACKGROUND_COLOR);

+ 1 - 1
ourbiz/edit-product-window.nut

@@ -152,7 +152,7 @@ class EditProductWindow extends MyBaseWindow {
 	db_products_group_id=null;
 	
 constructor() {
-	base.constructor(10, 50, 800, 560, _tr("Edit Products"));
+	base.constructor(-1, -1, 800, 560, _tr("Edit Products"));
 begin();
 this->box(FL_FLAT_BOX);
 this->color(FL_BACKGROUND_COLOR);

+ 1 - 1
ourbiz/list-search-window.nut

@@ -77,7 +77,7 @@ class ListSearch extends MyBaseWindow {
 	pack_search_options2=null;
 
 constructor() {
-	base.constructor(10, 50, 800, 560, _tr("List Search"));
+	base.constructor(-1, -1, 800, 560, _tr("List Search"));
 begin();
 this->box(FL_FLAT_BOX);
 this->color(FL_BACKGROUND_COLOR);

+ 74 - 8
ourbiz/ourbiz-fltk.nut

@@ -5,11 +5,31 @@ appServer.connect("localhost", 8855);
 
 function _tr(str){ return str;}
 
+function create_popup_menu_for (wgt, yOffset=0, options=null){
+	local parent = wgt->parent();
+	if(!parent){
+		parent = wgt->as_group();
+		if(!parent) return null;
+	}
+	local o = new Fl_Menu_Button(wgt->x(), wgt->y()+yOffset, wgt->w(), wgt->h()-yOffset);
+	o->labelsize(wgt->labelsize());
+	o->textsize(wgt->labelsize());
+
+	if(options) for(local i=0, len= options.size(); i < len; ++i) o->add(opt[i]);
+	o->type(Fl_Menu_Button.POPUP3);
+
+	if(parent) parent->add(o);
+	else if(wgt->as_group()) wgt->as_group()->add(o);
+	return o;
+}
+
+
 class MyBaseWindow extends Fl_Window {
 	childWindows=null;
 
 	constructor(px, py, pw, ph, pl) {
-		base.constructor(px, py, pw, ph, pl);
+		if(px < 0) base.constructor(pw, ph, pl);
+		else base.constructor(px, py, pw, ph, pl);
 		childWindows = {};
 	}
 
@@ -36,13 +56,9 @@ class Fl_Data_Table extends Flv_Data_Table {
 		_cols_info = [];
 		_data = [];
 	}
-	function fill_grid_from_table(tbl){
-		//SafeCursorWait cursor_wait;
-		row(-1);
-		clear_data_rows();
-		local key = format("%s_get_list", tbl);
-		appServer[key](_data);
-		recalc_data();
+	function resize(ax, ay, aw, ah){
+		base.resize(ax, ay, aw, ah);
+		calc_cols();
 	}
 
 	function clear_data_rows(){
@@ -171,6 +187,13 @@ class Fl_Data_Table extends Flv_Data_Table {
 		    cs.width(col_width);
 		}
 	}
+	function get_selection(ar_out, withIds=false){
+	}
+	function clear_selection(){
+	}
+	function get_row_id(arow){
+		return _data[arow][0];
+	}
 }
 
 dofile("search-options.nut");
@@ -184,6 +207,7 @@ dofile("list-search-window.nut");
 
 class MyListSearchWindow extends ListSearch {
 	_search_options = null;
+	_sab = null;
 
 	constructor(){
 		base.constructor();
@@ -357,6 +381,7 @@ class OrdersListSearch extends MyListSearchWindow {
 	_search_by_date = null;
 	_search_by_total = null;
 	_search_wp = null;
+	_popup = null;
 
 	constructor() {
 		base.constructor();
@@ -380,6 +405,7 @@ class OrdersListSearch extends MyListSearchWindow {
 		_search_wp = create_search_by2("WP");
 		_search_by_entities->setonly();
 		fill_grid();
+		mk_popup();
 	}
 	
 	function get_search_data(data){
@@ -396,6 +422,46 @@ class OrdersListSearch extends MyListSearchWindow {
 		local pr = sender.parent_root();
 		local win = pr.showChildWindow("Order Edit", EditOrderWindow);
 	}
+	function mk_popup()
+	{
+		_popup = create_popup_menu_for(grid, grid->global_style().height());
+		_popup.callback(on_popupmenu_cb);
+
+		_popup->add(_tr("Copy"));
+		_popup->add(_tr("Copy grouping"));
+		_popup->add(_tr("Clear selection"));
+	}
+	
+	function on_popupmenu_cb(sender, udata){
+		//printf("%p : %d : %s\n", sender, popup->value(),
+		//       popup->menu_at(popup->value())->label());
+		local pr = sender.parent_root();
+		local row = pr->grid->row();
+		if(row < 0) return;
+		switch(pr->_popup->value()){
+			case 0:{
+				local vi = [];
+				pr->grid->get_selection(vi, true);
+				if(vi.size() == 0) vi.push(pr->grid->get_row_id(row));
+				pr->copy_order(vi, false, pr->_sab);
+			}
+			break;
+			case 1:{
+			    local vi = [];
+			    pr->grid->get_selection(vi, true);
+			    pr->copy_order(vi, true, pr->_sab);
+			}
+			break;
+			case 2:{
+			    pr->grid->clear_selection();
+			    pr->grid->redraw();
+			}
+			break;
+		}
+	}
+	
+	function copy_order(ar_ids, grouping, sab){
+	}
 }
 
 class PaymentsListSearch extends ListSearch {

+ 1 - 1
ourbiz/sales-tax-window.nut

@@ -13,7 +13,7 @@ class SalesTaxRatesEditWindow extends MyBaseWindow {
 	db_map = null;
 	
 constructor() {
-	base.constructor(10, 50, 500, 385, _tr("Sales Tax Rates List / Edit"));
+	base.constructor(-1, -1, 500, 385, _tr("Sales Tax Rates List / Edit"));
 	db_map = {};
 	
 	dbAction = new Fl_Button(0, 0, 100, 25, _tr("Action"));