diff --git a/Makefile b/Makefile index 224072510..0064f9a00 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ OBJS = swad_account.o swad_action.o swad_announcement.o swad_assignment.o swad_a swad_holiday.o \ swad_icon.o swad_ID.o swad_import.o swad_indicator.o swad_info.o swad_institution.o \ swad_layout.o swad_link.o \ - swad_mail.o swad_main.o swad_mark.o swad_message.o \ + swad_mail.o swad_main.o swad_mark.o swad_menu.o swad_message.o \ swad_network.o swad_nickname.o swad_notice.o swad_notification.o \ swad_pagination.o swad_parameter.o swad_password.o swad_photo.o swad_place.o swad_plugin.o swad_preference.o \ swad_QR.o \ diff --git a/css/swad_desktop.css b/css/swad_desktop.css index 53cdf82e3..b316bd0fc 100644 --- a/css/swad_desktop.css +++ b/css/swad_desktop.css @@ -658,15 +658,15 @@ a:hover img.CENTRE_PHOTO_SHOW } /********************************* Menu fonts ********************************/ -.WHITE_MENU_OFF {color:#4D88A1; font-size:11pt; font-weight:bold; line-height:110%;} -.GREY_MENU_OFF {color:#707070; font-size:11pt; font-weight:bold; line-height:110%;} -.BLUE_MENU_OFF {color:#4D88A1; font-size:11pt; font-weight:bold; line-height:110%;} -.YELLOW_MENU_OFF {color:#BD4815; font-size:11pt; font-weight:bold; line-height:110%;} +.WHITE_MENU_OFF {color:#4D88A1; font-size:10pt; font-weight:bold; line-height:110%;} +.GREY_MENU_OFF {color:#707070; font-size:10pt; font-weight:bold; line-height:110%;} +.BLUE_MENU_OFF {color:#4D88A1; font-size:10pt; font-weight:bold; line-height:110%;} +.YELLOW_MENU_OFF {color:#BD4815; font-size:10pt; font-weight:bold; line-height:110%;} -.WHITE_MENU_ON {color:#4D88A1; font-size:11pt; font-weight:bold; line-height:110%;} -.GREY_MENU_ON {color:#606060; font-size:11pt; font-weight:bold; line-height:110%;} -.BLUE_MENU_ON {color:#4D88A1; font-size:11pt; font-weight:bold; line-height:110%;} -.YELLOW_MENU_ON {color:#BD4815; font-size:11pt; font-weight:bold; line-height:110%;} +.WHITE_MENU_ON {color:#4D88A1; font-size:10pt; font-weight:bold; line-height:110%;} +.GREY_MENU_ON {color:#606060; font-size:10pt; font-weight:bold; line-height:110%;} +.BLUE_MENU_ON {color:#4D88A1; font-size:10pt; font-weight:bold; line-height:110%;} +.YELLOW_MENU_ON {color:#BD4815; font-size:10pt; font-weight:bold; line-height:110%;} /********************************* Form fonts ********************************/ .WHITE_FORM {color:#4D88A1; font-size:11pt;} diff --git a/icon/horizontal32x32.gif b/icon/horizontal32x32.gif new file mode 100644 index 000000000..0b2b00685 Binary files /dev/null and b/icon/horizontal32x32.gif differ diff --git a/icon/vertical32x32.gif b/icon/vertical32x32.gif new file mode 100644 index 000000000..ba83f5038 Binary files /dev/null and b/icon/vertical32x32.gif differ diff --git a/sql/cambios.sql b/sql/cambios.sql index 85b976f00..546bb6534 100644 --- a/sql/cambios.sql +++ b/sql/cambios.sql @@ -10441,4 +10441,12 @@ INSERT INTO announcements (Roles,Subject,Content) VALUES ('16','ENCUESTA AN&Oacu SELECT tst_questions.QstCod,tst_questions.AnsType,tst_questions.Shuffle,tst_questions.Stem,tst_questions.Feedback FROM tst_questions,tst_question_tags,tst_tags WHERE tst_questions.CrsCod='5432' AND tst_questions.QstCod NOT IN (SELECT tst_question_tags.QstCod FROM tst_tags,tst_question_tags WHERE tst_tags.CrsCod='5432' AND tst_tags.TagHidden='Y' AND tst_tags.TagCod=tst_question_tags.TagCod) AND tst_questions.QstCod=tst_question_tags.QstCod AND tst_question_tags.TagCod=tst_tags.TagCod AND tst_tags.CrsCod='5432' AND (UNIX_TIMESTAMP(tst_questions.EditTime)>='0' OR UNIX_TIMESTAMP(tst_tags.ChangeTime)>='0') ORDER BY QstCod; +----- 2015-01-01, swad14.51 + +ALTER TABLE usr_data ADD COLUMN Menu TINYINT NOT NULL DEFAULT 0 AFTER Comments; +ALTER TABLE usr_data ADD INDEX (Menu); +UPDATE usr_data SET Menu=1; +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1243','es','N','Cambiar menú'); +ALTER TABLE IP_prefs ADD COLUMN Menu TINYINT NOT NULL DEFAULT 0 AFTER IconSet; + diff --git a/sql/swad.sql b/sql/swad.sql index 5a2c1bfda..46401c34b 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -18,6 +18,7 @@ CREATE TABLE IF NOT EXISTS IP_prefs ( Layout TINYINT NOT NULL DEFAULT 0, Theme CHAR(16) NOT NULL, IconSet CHAR(16) NOT NULL, + Menu TINYINT NOT NULL DEFAULT 0, SideCols TINYINT NOT NULL, PRIMARY KEY(IP), INDEX(UsrCod), @@ -1137,6 +1138,7 @@ CREATE TABLE IF NOT EXISTS usr_data ( OriginPlace VARCHAR(127) NOT NULL, Birthday DATE NOT NULL, Comments TEXT NOT NULL, + Menu TINYINT NOT NULL DEFAULT 0, SideCols TINYINT NOT NULL DEFAULT 3, NotifNtfEvents INT NOT NULL DEFAULT 0, EmailNtfEvents INT NOT NULL DEFAULT 0, @@ -1146,12 +1148,14 @@ CREATE TABLE IF NOT EXISTS usr_data ( INDEX(Theme), INDEX(IconSet), INDEX(Language), - INDEX(SideCols), INDEX(CtyCod), INDEX(InsCtyCod), INDEX(InsCod), INDEX(DptCod), - INDEX(CtrCod)); + INDEX(CtrCod), + INDEX(Menu), + INDEX(SideCols)); +); -- -- Table usr_emails: stores the users' e-mails -- diff --git a/swad_account.c b/swad_account.c index 8db977ec5..091f3c784 100644 --- a/swad_account.c +++ b/swad_account.c @@ -434,12 +434,12 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat) "Layout,Theme,IconSet,Language,PublicPhoto," "CtyCod," "LocalAddress,LocalPhone,FamilyAddress,FamilyPhone,OriginPlace,Birthday,Comments," - "SideCols,NotifNtfEvents,EmailNtfEvents)" + "Menu,SideCols,NotifNtfEvents,EmailNtfEvents)" " VALUES ('%s','%s','%s','%s','%s','%s'," "'%u','%s','%s','%s','%c'," "'%ld'," "'%s','%s','%s','%s','%s','%04u-%02u-%02u','%s'," - "'%u','-1','0')", + "'%u','%u','-1','0')", UsrDat->EncryptedUsrCod, UsrDat->Password, UsrDat->Surname1,UsrDat->Surname2,UsrDat->FirstName, @@ -457,6 +457,7 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat) UsrDat->Birthday.Year,UsrDat->Birthday.Month,UsrDat->Birthday.Day, UsrDat->Comments ? UsrDat->Comments : "", + Mnu_MENU_DEFAULT, Cfg_DEFAULT_COLUMNS); UsrDat->UsrCod = DB_QueryINSERTandReturnCode (Query,"can not create user"); diff --git a/swad_action.c b/swad_action.c index 63034b807..a92b6a730 100644 --- a/swad_action.c +++ b/swad_action.c @@ -1021,6 +1021,7 @@ Profile: 875. ActShoLftCol Show left side column 876. ActShoRgtCol Show right side column 877. ActChgIco Change icon set + ---. ActChgMnu Change menu 879. ActChgNtfPrf Change whether to notify by e-mail new messages 880. ActPrnUsrQR Show my QR code ready to print 881. ActPrnMyTimTbl Show the timetable listo to impresión of all my courses @@ -2243,6 +2244,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActShoLftCol */{ 670,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_ShowLeftCol ,Prf_EditPrefs ,NULL}, /* ActShoRgtCol */{ 671,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_ShowRightCol ,Prf_EditPrefs ,NULL}, /* ActChgIco */{1092,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Ico_ChangeIconSet ,Prf_EditPrefs ,NULL}, + /* ActChgMnu */{1243,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Mnu_ChangeMenu ,Prf_EditPrefs ,NULL}, /* ActChgNtfPrf */{ 775,-1,TabPrf,ActEdiPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Ntf_ChangeNotifyEvents ,Prf_EditPrefs ,NULL}, /* ActPrnUsrQR */{1022,-1,TabPrf,ActFrmUsrAcc ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,QR_PrintQRCode ,NULL}, @@ -3516,6 +3518,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq ActRemIDOth, // #1240 ActNewIDOth, // #1241 ActSeeSyl, // #1242 + ActChgMnu, // #1243 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index 41bb37e73..985b9ba46 100644 --- a/swad_action.h +++ b/swad_action.h @@ -71,9 +71,9 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica /* Related with tabs, menus, etc. */ #define Act_NUM_TABS (1+11) -#define Act_NUM_ACTIONS (7+52+15+39+22+17+206+182+94+168+28+74) +#define Act_NUM_ACTIONS (7+52+15+39+22+17+206+182+94+168+28+75) -#define Act_MAX_ACTION_COD 1242 +#define Act_MAX_ACTION_COD 1243 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20 @@ -1088,31 +1088,32 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica #define ActShoLftCol (ActSeeAllStaCrs+49) #define ActShoRgtCol (ActSeeAllStaCrs+50) #define ActChgIco (ActSeeAllStaCrs+51) -#define ActChgNtfPrf (ActSeeAllStaCrs+52) +#define ActChgMnu (ActSeeAllStaCrs+52) +#define ActChgNtfPrf (ActSeeAllStaCrs+53) -#define ActPrnUsrQR (ActSeeAllStaCrs+53) +#define ActPrnUsrQR (ActSeeAllStaCrs+54) -#define ActPrnMyTimTbl (ActSeeAllStaCrs+54) -#define ActEdiTut (ActSeeAllStaCrs+55) -#define ActChgTut (ActSeeAllStaCrs+56) -#define ActReqRemFilBrf (ActSeeAllStaCrs+57) -#define ActRemFilBrf (ActSeeAllStaCrs+58) -#define ActRemFolBrf (ActSeeAllStaCrs+59) -#define ActCopBrf (ActSeeAllStaCrs+60) -#define ActPasBrf (ActSeeAllStaCrs+61) -#define ActRemTreBrf (ActSeeAllStaCrs+62) -#define ActFrmCreBrf (ActSeeAllStaCrs+63) -#define ActCreFolBrf (ActSeeAllStaCrs+64) -#define ActCreLnkBrf (ActSeeAllStaCrs+65) -#define ActRenFolBrf (ActSeeAllStaCrs+66) -#define ActRcvFilBrfDZ (ActSeeAllStaCrs+67) -#define ActRcvFilBrfCla (ActSeeAllStaCrs+68) -#define ActExpBrf (ActSeeAllStaCrs+69) -#define ActConBrf (ActSeeAllStaCrs+70) -#define ActZIPBrf (ActSeeAllStaCrs+71) -#define ActReqDatBrf (ActSeeAllStaCrs+72) -#define ActChgDatBrf (ActSeeAllStaCrs+73) -#define ActDowBrf (ActSeeAllStaCrs+74) +#define ActPrnMyTimTbl (ActSeeAllStaCrs+55) +#define ActEdiTut (ActSeeAllStaCrs+56) +#define ActChgTut (ActSeeAllStaCrs+57) +#define ActReqRemFilBrf (ActSeeAllStaCrs+58) +#define ActRemFilBrf (ActSeeAllStaCrs+59) +#define ActRemFolBrf (ActSeeAllStaCrs+60) +#define ActCopBrf (ActSeeAllStaCrs+61) +#define ActPasBrf (ActSeeAllStaCrs+62) +#define ActRemTreBrf (ActSeeAllStaCrs+63) +#define ActFrmCreBrf (ActSeeAllStaCrs+64) +#define ActCreFolBrf (ActSeeAllStaCrs+65) +#define ActCreLnkBrf (ActSeeAllStaCrs+66) +#define ActRenFolBrf (ActSeeAllStaCrs+67) +#define ActRcvFilBrfDZ (ActSeeAllStaCrs+68) +#define ActRcvFilBrfCla (ActSeeAllStaCrs+69) +#define ActExpBrf (ActSeeAllStaCrs+70) +#define ActConBrf (ActSeeAllStaCrs+71) +#define ActZIPBrf (ActSeeAllStaCrs+72) +#define ActReqDatBrf (ActSeeAllStaCrs+73) +#define ActChgDatBrf (ActSeeAllStaCrs+74) +#define ActDowBrf (ActSeeAllStaCrs+75) /*****************************************************************************/ /******************************** Public types *******************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 475b9dcdf..a294cf1bb 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -35,11 +35,20 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 14.50.4 (2015/01/01)" +#define Log_PLATFORM_VERSION "SWAD 14.51 (2015/01/01)" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*.h | tail -1 /* + Version 14.51 :Jan 01, 2014 Users can select horizontal or vertical menu. (172958 lines) + 1 change necessary in Makefile: +Add swad_menu.o to list of object files + 4 changes necessary in database: +ALTER TABLE usr_data ADD COLUMN Menu TINYINT NOT NULL DEFAULT 0 AFTER Comments; +ALTER TABLE usr_data ADD INDEX (Menu); +UPDATE usr_data SET Menu=1; +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1243','es','N','Cambiar menú'); + Version 14.50.4 :Jan 01, 2014 Changes in preferences and photos. (172705 lines) Version 14.50.3 :Jan 01, 2014 Changes in layout of preferences. (172691 lines) Version 14.50.2 :Jan 01, 2014 Changes in CSS. (172739 lines) diff --git a/swad_database.c b/swad_database.c index 4e197a11a..f70e122b6 100644 --- a/swad_database.c +++ b/swad_database.c @@ -113,9 +113,10 @@ mysql> DESCRIBE IP_prefs; | Layout | tinyint(4) | NO | | 0 | | | Theme | char(16) | NO | | NULL | | | IconSet | char(16) | NO | | NULL | | +| Menu | tinyint(4) | NO | | 0 | | | SideCols | tinyint(4) | NO | | NULL | | +------------+------------+------+-----+---------+-------+ -7 rows in set (0.00 sec) +8 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS IP_prefs (" "IP CHAR(15) NOT NULL," @@ -124,6 +125,7 @@ mysql> DESCRIBE IP_prefs; "Layout TINYINT NOT NULL DEFAULT 0," "Theme CHAR(16) NOT NULL," "IconSet CHAR(16) NOT NULL," + "Menu TINYINT NOT NULL DEFAULT 0," "SideCols TINYINT NOT NULL," "PRIMARY KEY (IP),INDEX(UsrCod),INDEX(LastChange))"); @@ -2280,11 +2282,12 @@ mysql> DESCRIBE usr_data; | OriginPlace | varchar(127) | NO | | NULL | | | Birthday | date | NO | | NULL | | | Comments | text | NO | | NULL | | +| Menu | tinyint(4) | NO | MUL | 0 | | | SideCols | tinyint(4) | NO | MUL | 3 | | | NotifNtfEvents | int(11) | NO | | 0 | | | EmailNtfEvents | int(11) | NO | | 0 | | +-----------------+---------------------------------+------+-----+---------+----------------+ -33 rows in set (0.00 sec) +34 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS usr_data (" "UsrCod INT NOT NULL AUTO_INCREMENT," @@ -2317,10 +2320,11 @@ mysql> DESCRIBE usr_data; "OriginPlace VARCHAR(127) NOT NULL," "Birthday DATE NOT NULL," "Comments TEXT NOT NULL," + "Menu TINYINT NOT NULL DEFAULT 0," "SideCols TINYINT NOT NULL DEFAULT 3," "NotifNtfEvents INT NOT NULL DEFAULT 0," "EmailNtfEvents INT NOT NULL DEFAULT 0," - "PRIMARY KEY(UsrCod),UNIQUE INDEX(EncryptedUsrCod),INDEX(Layout),INDEX(Theme),INDEX(IconSet),INDEX(Language),INDEX(SideCols),INDEX(CtyCod),INDEX(InsCtyCod),INDEX(InsCod),INDEX(DptCod),INDEX(CtrCod))"); + "PRIMARY KEY(UsrCod),UNIQUE INDEX(EncryptedUsrCod),INDEX(Layout),INDEX(Theme),INDEX(IconSet),INDEX(Language),INDEX(CtyCod),INDEX(InsCtyCod),INDEX(InsCod),INDEX(DptCod),INDEX(CtrCod),INDEX(Menu),INDEX(SideCols))"); /***** Table usr_emails *****/ /* diff --git a/swad_global.c b/swad_global.c index 5087f01d2..fbc916ce0 100644 --- a/swad_global.c +++ b/swad_global.c @@ -130,6 +130,7 @@ void Gbl_InitializeGlobals (void) sprintf (Gbl.Prefs.IconsURL,"%s/%s", Cfg_HTTPS_URL_SWAD_PUBLIC,Cfg_FOLDER_PUBLIC_ICON); Gbl.Prefs.Language = Txt_Current_CGI_SWAD_Language; + Gbl.Prefs.Menu = Mnu_MENU_DEFAULT; // Default menu Gbl.Prefs.SideCols = Cfg_DEFAULT_COLUMNS; // Show both side columns, left and right sprintf (Gbl.Prefs.PathTheme,"%s/%s/%s", Gbl.Prefs.IconsURL, diff --git a/swad_global.h b/swad_global.h index 8476b8092..0bd66beb5 100644 --- a/swad_global.h +++ b/swad_global.h @@ -51,9 +51,10 @@ #include "swad_institution.h" #include "swad_layout.h" #include "swad_link.h" -#include "swad_message.h" #include "swad_mail.h" #include "swad_mark.h" +#include "swad_message.h" +#include "swad_menu.h" #include "swad_password.h" #include "swad_photo.h" #include "swad_place.h" @@ -136,6 +137,7 @@ struct Globals Ico_IconSet_t IconSet; char PathIconSet[PATH_MAX+1]; char IconsURL[PATH_MAX+1]; + Mnu_Menu_t Menu; } Prefs; struct diff --git a/swad_layout.c b/swad_layout.c index 2a65e6ad4..aee22e788 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -63,8 +63,6 @@ const char *Lay_LayoutIcons[Lay_NUM_LAYOUTS] = /****************************** Private constants ****************************/ /*****************************************************************************/ -#define HORIZONTAL_MENU 1 - const char *Lay_TabIcons[Act_NUM_TABS] = { /* TabUnk */ NULL, @@ -109,20 +107,14 @@ static void Lay_DrawTabsDeskTop (void); static void Lay_DrawTabsMobile (void); static bool Lay_CheckIfICanViewTab (Act_Tab_t Tab); static void Lay_DrawBreadcrumb (void); -#ifndef HORIZONTAL_MENU static void Lay_WriteVerticalMenuThisTabDesktop (void); -#endif -#ifdef HORIZONTAL_MENU static void Lay_WriteHorizontalMenuThisTabDesktop (void); -#endif static void Lay_WriteMenuThisTabMobile (void); static void Lay_WriteBreadcrumbHome (void); static void Lay_WriteBreadcrumbTab (void); static void Lay_WriteBreadcrumbAction (void); -#ifndef HORIZONTAL_MENU static void Lay_WriteTitleAction (void); -#endif static void Lay_ShowLeftColumn (void); static void Lay_ShowRightColumn (void); @@ -304,14 +296,14 @@ void Lay_WriteStartOfPage (void) Prf_PutLeftIconToHideShowCols (); fprintf (Gbl.F.Out,""); -#ifndef HORIZONTAL_MENU - /* Tab content, including always vertical menu (left) and always main zone (right) */ - fprintf (Gbl.F.Out,""); - Lay_WriteVerticalMenuThisTabDesktop (); - fprintf (Gbl.F.Out,""); -#endif - + if (Gbl.Prefs.Menu == Mnu_MENU_VERTICAL) + { + /* Tab content, including vertical menu (left) and main zone (right) */ + fprintf (Gbl.F.Out,""); + Lay_WriteVerticalMenuThisTabDesktop (); + fprintf (Gbl.F.Out,""); + } break; case Lay_LAYOUT_MOBILE: /* Tab content */ @@ -335,10 +327,9 @@ void Lay_WriteStartOfPage (void) fprintf (Gbl.F.Out,""); -#ifdef HORIZONTAL_MENU - if (Gbl.Prefs.Layout == Lay_LAYOUT_DESKTOP) + if (Gbl.Prefs.Layout == Lay_LAYOUT_DESKTOP && + Gbl.Prefs.Menu == Mnu_MENU_HORIZONTAL) Lay_WriteHorizontalMenuThisTabDesktop (); -#endif Usr_WarningWhenDegreeTypeDoesntAllowDirectLogin (); @@ -346,12 +337,11 @@ void Lay_WriteStartOfPage (void) if (Gbl.CurrentCrs.Info.ShowMsgMustBeRead) Inf_WriteMsgYouMustReadInfo (); -#ifndef HORIZONTAL_MENU /* Write title of the current action */ if (Gbl.Prefs.Layout == Lay_LAYOUT_DESKTOP && - Act_Actions[Act_Actions[Gbl.CurrentAct].SuperAction].IndexInMenu >= 0) + Gbl.Prefs.Menu == Mnu_MENU_VERTICAL && + Act_Actions[Act_Actions[Gbl.CurrentAct].SuperAction].IndexInMenu >= 0) Lay_WriteTitleAction (); -#endif Gbl.Layout.WritingHTMLStart = false; Gbl.Layout.HTMLStartWritten = true; @@ -1132,7 +1122,6 @@ static void Lay_DrawBreadcrumb (void) /************* Write the menu of current tab (desktop layout) ****************/ /*****************************************************************************/ -#ifndef HORIZONTAL_MENU static void Lay_WriteVerticalMenuThisTabDesktop (void) { extern const char *The_ClassMenuOn[The_NUM_THEMES]; @@ -1220,13 +1209,11 @@ static void Lay_WriteVerticalMenuThisTabDesktop (void) /***** List end *****/ fprintf (Gbl.F.Out,""); } -#endif /*****************************************************************************/ /********** Write horizontal menu of current tab (desktop layout) ************/ /*****************************************************************************/ -#ifdef HORIZONTAL_MENU static void Lay_WriteHorizontalMenuThisTabDesktop (void) { extern const char *The_ClassMenuOn[The_NUM_THEMES]; @@ -1293,7 +1280,6 @@ static void Lay_WriteHorizontalMenuThisTabDesktop (void) fprintf (Gbl.F.Out,"" ""); } -#endif /*****************************************************************************/ /************* Write the menu of current tab (mobile layout) *****************/ @@ -1419,7 +1405,6 @@ static void Lay_WriteBreadcrumbAction (void) /*********** Write icon and title associated to the current action ***********/ /*****************************************************************************/ -#ifndef HORIZONTAL_MENU static void Lay_WriteTitleAction (void) { extern const char *The_ClassTitleAction[The_NUM_THEMES]; @@ -1446,7 +1431,6 @@ static void Lay_WriteTitleAction (void) /***** Container end *****/ fprintf (Gbl.F.Out,""); } -#endif /*****************************************************************************/ /***************************** Show left column ******************************/ diff --git a/swad_preference.c b/swad_preference.c index fc532d594..c27bad1e5 100644 --- a/swad_preference.c +++ b/swad_preference.c @@ -35,6 +35,7 @@ #include "swad_global.h" #include "swad_layout.h" #include "swad_notification.h" +#include "swad_menu.h" #include "swad_parameter.h" #include "swad_preference.h" #include "swad_text.h" @@ -53,6 +54,7 @@ extern struct Globals Gbl; /****************************** Private prototypes ***************************/ /*****************************************************************************/ +static void Prf_PutIconsToSelectSideCols (void); static void Prf_UpdateSideColsOnUsrDataTable (void); /*****************************************************************************/ @@ -85,11 +87,17 @@ void Prf_EditPrefs (void) fprintf (Gbl.F.Out,"" ""); The_PutIconsToSelectTheme (); - fprintf (Gbl.F.Out,"" - ""); - Prf_PutIconsToSelectSideCols (); - fprintf (Gbl.F.Out,"" - "" + fprintf (Gbl.F.Out,""); + if (Gbl.Prefs.Layout == Lay_LAYOUT_DESKTOP) + { + fprintf (Gbl.F.Out,""); + Mnu_PutIconsToSelectMenu (); + fprintf (Gbl.F.Out,"" + ""); + Prf_PutIconsToSelectSideCols (); + fprintf (Gbl.F.Out,""); + } + fprintf (Gbl.F.Out,"" ""); if (Gbl.Usrs.Me.Logged) @@ -118,7 +126,7 @@ void Prf_GetPrefsFromIP (void) if (Gbl.IP[0]) { /***** Get preferences from database *****/ - sprintf (Query,"SELECT Layout,Theme,IconSet,SideCols" + sprintf (Query,"SELECT Layout,Theme,IconSet,Menu,SideCols" " FROM IP_prefs WHERE IP='%s'", Gbl.IP); if ((NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get preferences"))) @@ -141,8 +149,14 @@ void Prf_GetPrefsFromIP (void) /* Get icon set (row[2]) */ Gbl.Prefs.IconSet = Ico_GetIconSetFromStr (row[2]); - /* Get if user wants to show side columns (row[3]) */ - if (sscanf (row[3],"%u",&Gbl.Prefs.SideCols) == 1) + /* Get menu (row[3]) */ + Gbl.Prefs.Menu = Mnu_MENU_DEFAULT; + if (sscanf (row[3],"%u",&UnsignedNum) == 1) + if (UnsignedNum < Mnu_NUM_MENUS) + Gbl.Prefs.Menu = (Lay_Layout_t) UnsignedNum; + + /* Get if user wants to show side columns (row[4]) */ + if (sscanf (row[4],"%u",&Gbl.Prefs.SideCols) == 1) { if (Gbl.Prefs.SideCols > Lay_SHOW_BOTH_COLUMNS) Gbl.Prefs.SideCols = Cfg_DEFAULT_COLUMNS; @@ -164,23 +178,25 @@ void Prf_SetPrefsFromIP (void) char Query[512]; /***** Update preferences from current IP in database *****/ - sprintf (Query,"REPLACE INTO IP_prefs (IP,UsrCod,LastChange,Layout,Theme,IconSet,SideCols)" - " VALUES ('%s','%ld',NOW(),'%u','%s','%s','%u')", + sprintf (Query,"REPLACE INTO IP_prefs (IP,UsrCod,LastChange,Layout,Theme,IconSet,Menu,SideCols)" + " VALUES ('%s','%ld',NOW(),'%u','%s','%s','%u','%u')", Gbl.IP,Gbl.Usrs.Me.UsrDat.UsrCod, (unsigned) Gbl.Prefs.Layout, The_ThemeId[Gbl.Prefs.Theme], Ico_IconSetId[Gbl.Prefs.IconSet], + (unsigned) Gbl.Prefs.Menu, Gbl.Prefs.SideCols); DB_QueryREPLACE (Query,"can not store preferences from current IP address"); /***** If a user is logged, update its preferences in database for all its IP's *****/ if (Gbl.Usrs.Me.Logged) { - sprintf (Query,"UPDATE IP_prefs SET Layout='%u',Theme='%s',IconSet='%s',SideCols='%u'" + sprintf (Query,"UPDATE IP_prefs SET Layout='%u',Theme='%s',IconSet='%s',Menu='%u',SideCols='%u'" " WHERE UsrCod='%ld'", (unsigned) Gbl.Prefs.Layout, The_ThemeId[Gbl.Prefs.Theme], Ico_IconSetId[Gbl.Prefs.IconSet], + (unsigned) Gbl.Prefs.Menu, Gbl.Prefs.SideCols, Gbl.Usrs.Me.UsrDat.UsrCod); DB_QueryUPDATE (Query,"can not update your preferences"); @@ -320,7 +336,7 @@ Txt_Language_t Prf_GetParamLanguage (void) /************ Put icons to select the layout of the side columns *************/ /*****************************************************************************/ -void Prf_PutIconsToSelectSideCols (void) +static void Prf_PutIconsToSelectSideCols (void) { extern const char *Txt_Columns; extern const char *Txt_LAYOUT_SIDE_COLUMNS[4]; diff --git a/swad_preference.h b/swad_preference.h index 7ee903c2c..c0bbfbefe 100644 --- a/swad_preference.h +++ b/swad_preference.h @@ -50,7 +50,6 @@ void Prf_AskChangeLanguage (void); void Prf_ChangeLanguage (void); Txt_Language_t Prf_GetParamLanguage (void); -void Prf_PutIconsToSelectSideCols (void); void Prf_PutLeftIconToHideShowCols (void); void Prf_PutRigthIconToHideShowCols (void); void Prf_ChangeSideCols (void); diff --git a/swad_text.c b/swad_text.c index 0fb0d453a..974ca249f 100644 --- a/swad_text.c +++ b/swad_text.c @@ -75,6 +75,7 @@ #include "swad_forum.h" #include "swad_holiday.h" #include "swad_info.h" +#include "swad_menu.h" #include "swad_notification.h" #include "swad_photo.h" #include "swad_QR.h" @@ -15515,6 +15516,70 @@ const char *Txt_maximum = "máximo"; #endif +const char *Txt_Menu = +#if L==0 + "Menú"; +#elif L==1 + "Menü"; +#elif L==2 + "Menu"; +#elif L==3 + "Menú"; +#elif L==4 + "Menu"; +#elif L==5 + "Menú"; // Okoteve traducción +#elif L==6 + "Menu"; +#elif L==7 + "Menu"; +#elif L==8 + "Menu"; +#endif + +const char *Txt_MENU_NAMES[Mnu_NUM_MENUS] = + { +#if L==0 + "Horitzontal" +#elif L==1 + "Horizontal" +#elif L==2 + "Horizontal" +#elif L==3 + "Horizontal" +#elif L==4 + "Horizontal" +#elif L==5 + "Horizontal" // Okoteve traducción +#elif L==6 + "Orizzontale" +#elif L==7 + "Poziomy" +#elif L==8 + "Horizontal" +#endif + , +#if L==0 + "Vertical" +#elif L==1 + "Vertikal" +#elif L==2 + "Vertical" +#elif L==3 + "Vertical" +#elif L==4 + "Vertical" +#elif L==5 + "Vertical" // Okoteve traducción +#elif L==6 + "Verticale" +#elif L==7 + "Pionowy" +#elif L==8 + "Vertical" +#endif + }; + const char *Txt_MENU_TITLE[Act_NUM_TABS][Act_MAX_OPTIONS_IN_MENU_PER_TAB] = { { diff --git a/swad_user.c b/swad_user.c index f0744d1e7..d92954c56 100644 --- a/swad_user.c +++ b/swad_user.c @@ -266,8 +266,9 @@ void Usr_ResetUsrDataExceptUsrCodAndIDs (struct UsrData *UsrDat) UsrDat->Prefs.Language = Cfg_DEFAULT_LANGUAGE_FOR_NEW_USERS; UsrDat->Prefs.Layout = Lay_LAYOUT_DEFAULT; UsrDat->Prefs.Theme = The_THEME_DEFAULT; - UsrDat->Prefs.SideCols = Cfg_DEFAULT_COLUMNS; UsrDat->Prefs.IconSet = Ico_ICON_SET_DEFAULT; + UsrDat->Prefs.Menu = Mnu_MENU_DEFAULT; + UsrDat->Prefs.SideCols = Cfg_DEFAULT_COLUMNS; UsrDat->Prefs.EmailNtfEvents = 0; // By default, don't notify anything } @@ -394,7 +395,7 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat) "Layout,Theme,IconSet,Language,Photo,PublicPhoto," "CtyCod,InsCtyCod,InsCod,DptCod,CtrCod,Office,OfficePhone," "LocalAddress,LocalPhone,FamilyAddress,FamilyPhone,OriginPlace,Birthday,Comments," - "SideCols,NotifNtfEvents,EmailNtfEvents" + "Menu,SideCols,NotifNtfEvents,EmailNtfEvents" " FROM usr_data WHERE UsrCod='%ld'", UsrDat->UsrCod); NumRows = DB_QuerySELECT (Query,&mysql_res,"can not get user's data"); @@ -494,8 +495,14 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat) "", UsrDat); // Get the comments comunes a todas the courses + /* Get menu */ + UsrDat->Prefs.Menu = Mnu_MENU_DEFAULT; + if (sscanf (row[26],"%u",&UnsignedNum) == 1) + if (UnsignedNum < Mnu_NUM_MENUS) + UsrDat->Prefs.Menu = (Mnu_Menu_t) UnsignedNum; + /* Get if user wants to show side columns */ - if (sscanf (row[26],"%u",&UsrDat->Prefs.SideCols) == 1) + if (sscanf (row[27],"%u",&UsrDat->Prefs.SideCols) == 1) { if (UsrDat->Prefs.SideCols > Lay_SHOW_BOTH_COLUMNS) UsrDat->Prefs.SideCols = Cfg_DEFAULT_COLUMNS; @@ -504,10 +511,10 @@ void Usr_GetUsrDataFromUsrCod (struct UsrData *UsrDat) UsrDat->Prefs.SideCols = Cfg_DEFAULT_COLUMNS; /* Get on which events I want to be notified by e-mail */ - if (sscanf (row[27],"%u",&UsrDat->Prefs.NotifNtfEvents) != 1) + if (sscanf (row[28],"%u",&UsrDat->Prefs.NotifNtfEvents) != 1) UsrDat->Prefs.NotifNtfEvents = (unsigned) -1; // 0xFF..FF - if (sscanf (row[28],"%u",&UsrDat->Prefs.EmailNtfEvents) != 1) + if (sscanf (row[29],"%u",&UsrDat->Prefs.EmailNtfEvents) != 1) UsrDat->Prefs.EmailNtfEvents = 0; if (UsrDat->Prefs.EmailNtfEvents >= (1 << Ntf_NUM_NOTIFY_EVENTS)) // Maximum binary value for NotifyEvents is 000...0011...11 UsrDat->Prefs.EmailNtfEvents = 0; @@ -2191,6 +2198,7 @@ static void Usr_SetUsrRoleAndPrefs (void) Gbl.Prefs.IconsURL,Cfg_ICON_FOLDER_ICON_SETS, Ico_IconSetId[Gbl.Prefs.IconSet]); + Gbl.Prefs.Menu = Gbl.Usrs.Me.UsrDat.Prefs.Menu; Gbl.Prefs.SideCols = Gbl.Usrs.Me.UsrDat.Prefs.SideCols; /***** Get my last data *****/ diff --git a/swad_user.h b/swad_user.h index 1233b8c21..d60dc683f 100644 --- a/swad_user.h +++ b/swad_user.h @@ -36,6 +36,7 @@ #include "swad_degree.h" #include "swad_icon.h" #include "swad_layout.h" +#include "swad_menu.h" #include "swad_nickname.h" #include "swad_role.h" #include "swad_scope.h" @@ -149,8 +150,9 @@ struct UsrData Txt_Language_t Language; Lay_Layout_t Layout; The_Theme_t Theme; - unsigned SideCols; Ico_IconSet_t IconSet; + Mnu_Menu_t Menu; + unsigned SideCols; unsigned NotifNtfEvents; // One bit activated for each type of event unsigned EmailNtfEvents; // One bit activated for each type of event } Prefs;