Fossil SCM
Make the Basic/Advanced menu controls on timelines a setting that persists in the display preferences cookie.
Commit
259074d364c11415f84027baaee5bc6ba92ff98feec54378feb1afe67e9b387a
Parent
0a1f4ed6aa92f13…
2 files changed
+6
-32
+35
-14
+6
-32
| --- src/style.c | ||
| +++ src/style.c | ||
| @@ -46,29 +46,26 @@ | ||
| 46 | 46 | } aSubmenu[30]; |
| 47 | 47 | static int nSubmenu = 0; /* Number of buttons */ |
| 48 | 48 | static struct SubmenuCtrl { |
| 49 | 49 | const char *zName; /* Form query parameter */ |
| 50 | 50 | const char *zLabel; /* Label. Might be NULL for FF_MULTI */ |
| 51 | - unsigned char eType; /* FF_ENTRY, FF_MULTI, FF_BINARY */ | |
| 52 | - unsigned char eVisible; /* STYLE_NORMAL, STYLE_VISIBLE, .... */ | |
| 51 | + unsigned char eType; /* FF_ENTRY, FF_MULTI, FF_CHECKBOX */ | |
| 52 | + unsigned char eVisible; /* STYLE_NORMAL or STYLE_DISABLED */ | |
| 53 | 53 | short int iSize; /* Width for FF_ENTRY. Count for FF_MULTI */ |
| 54 | 54 | const char *const *azChoice; /* value/display pairs for FF_MULTI */ |
| 55 | 55 | const char *zFalse; /* FF_BINARY label when false */ |
| 56 | 56 | const char *zJS; /* Javascript to run on toggle */ |
| 57 | 57 | } aSubmenuCtrl[20]; |
| 58 | 58 | static int nSubmenuCtrl = 0; |
| 59 | 59 | #define FF_ENTRY 1 /* Text entry box */ |
| 60 | 60 | #define FF_MULTI 2 /* Combobox. Multiple choices. */ |
| 61 | -#define FF_BINARY 3 /* Control binary query parameter */ | |
| 62 | -#define FF_CHECKBOX 4 /* Check-box with JS */ | |
| 63 | -#define FF_JSBUTTON 5 /* Run JS when clicked */ | |
| 61 | +#define FF_BINARY 3 /* Control for binary query parameter */ | |
| 62 | +#define FF_CHECKBOX 4 /* Check-box */ | |
| 64 | 63 | |
| 65 | 64 | #if INTERFACE |
| 66 | 65 | #define STYLE_NORMAL 0 /* Normal display of control */ |
| 67 | 66 | #define STYLE_DISABLED 1 /* Control is disabled */ |
| 68 | -#define STYLE_CLUTTER 2 /* Only visible in "Advanced" display */ | |
| 69 | -#define STYLE_BASIC 4 /* Only visible in "Basic" display */ | |
| 70 | 67 | #endif /* INTERFACE */ |
| 71 | 68 | |
| 72 | 69 | /* |
| 73 | 70 | ** Remember that the header has been generated. The footer is omitted |
| 74 | 71 | ** if an error occurs before the header. |
| @@ -242,22 +239,10 @@ | ||
| 242 | 239 | aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible; |
| 243 | 240 | aSubmenuCtrl[nSubmenuCtrl].zJS = zJS; |
| 244 | 241 | aSubmenuCtrl[nSubmenuCtrl].eType = FF_CHECKBOX; |
| 245 | 242 | nSubmenuCtrl++; |
| 246 | 243 | } |
| 247 | -void style_submenu_jsbutton( | |
| 248 | - const char *zLabel, /* Label to display on the submenu */ | |
| 249 | - int eVisible, /* Visible or disabled */ | |
| 250 | - const char *zJS /* Javascript to run when clicked */ | |
| 251 | -){ | |
| 252 | - assert( nSubmenuCtrl < count(aSubmenuCtrl) ); | |
| 253 | - aSubmenuCtrl[nSubmenuCtrl].zLabel = zLabel; | |
| 254 | - aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible; | |
| 255 | - aSubmenuCtrl[nSubmenuCtrl].zJS = zJS; | |
| 256 | - aSubmenuCtrl[nSubmenuCtrl].eType = FF_JSBUTTON; | |
| 257 | - nSubmenuCtrl++; | |
| 258 | -} | |
| 259 | 244 | void style_submenu_binary( |
| 260 | 245 | const char *zName, /* Query parameter name */ |
| 261 | 246 | const char *zTrue, /* Label to show when parameter is true */ |
| 262 | 247 | const char *zFalse, /* Label to show when the parameter is false */ |
| 263 | 248 | int eVisible /* Visible or disabled */ |
| @@ -577,16 +562,10 @@ | ||
| 577 | 562 | if( aSubmenuCtrl[i].eVisible & STYLE_DISABLED ){ |
| 578 | 563 | zDisabled = " disabled"; |
| 579 | 564 | }else if( zQPN ){ |
| 580 | 565 | cgi_tag_query_parameter(zQPN); |
| 581 | 566 | } |
| 582 | - if( aSubmenuCtrl[i].eVisible & STYLE_CLUTTER ){ | |
| 583 | - zXtraClass = " clutter"; | |
| 584 | - } | |
| 585 | - if( aSubmenuCtrl[i].eVisible & STYLE_BASIC ){ | |
| 586 | - zXtraClass = " anticlutter"; | |
| 587 | - } | |
| 588 | 567 | switch( aSubmenuCtrl[i].eType ){ |
| 589 | 568 | case FF_ENTRY: |
| 590 | 569 | @ <span class='submenuctrl%s(zXtraClass)'>\ |
| 591 | 570 | @ %h(aSubmenuCtrl[i].zLabel)\ |
| 592 | 571 | @ <input type='text' name='%s(zQPN)' value='%h(PD(zQPN, ""))' \ |
| @@ -623,11 +602,12 @@ | ||
| 623 | 602 | } |
| 624 | 603 | break; |
| 625 | 604 | } |
| 626 | 605 | case FF_BINARY: { |
| 627 | 606 | int isTrue = PB(zQPN); |
| 628 | - @ <select class='submenuctrl%s(zXtraClass)' size='1' name='%s(zQPN)' \ | |
| 607 | + @ <select class='submenuctrl%s(zXtraClass)' size='1' \ | |
| 608 | + @ name='%s(zQPN)' \ | |
| 629 | 609 | @ onchange='gebi("f01").submit();'%s(zDisabled)> |
| 630 | 610 | @ <option value='1'\ |
| 631 | 611 | if( isTrue ){ |
| 632 | 612 | @ selected\ |
| 633 | 613 | } |
| @@ -652,16 +632,10 @@ | ||
| 652 | 632 | @ onchange='gebi("f01").submit();'%s(zDisabled)>\ |
| 653 | 633 | } |
| 654 | 634 | @ %h(aSubmenuCtrl[i].zLabel)</label> |
| 655 | 635 | break; |
| 656 | 636 | } |
| 657 | - case FF_JSBUTTON: { | |
| 658 | - @ <a class="label%s(zXtraClass)" \ | |
| 659 | - @ onclick='%s(aSubmenuCtrl[i].zJS)'%s(zDisabled)>\ | |
| 660 | - @ %s(aSubmenuCtrl[i].zLabel)</a> | |
| 661 | - break; | |
| 662 | - } | |
| 663 | 637 | } |
| 664 | 638 | } |
| 665 | 639 | @ </div> |
| 666 | 640 | if( nSubmenuCtrl ){ |
| 667 | 641 | cgi_query_parameters_to_hidden(); |
| 668 | 642 |
| --- src/style.c | |
| +++ src/style.c | |
| @@ -46,29 +46,26 @@ | |
| 46 | } aSubmenu[30]; |
| 47 | static int nSubmenu = 0; /* Number of buttons */ |
| 48 | static struct SubmenuCtrl { |
| 49 | const char *zName; /* Form query parameter */ |
| 50 | const char *zLabel; /* Label. Might be NULL for FF_MULTI */ |
| 51 | unsigned char eType; /* FF_ENTRY, FF_MULTI, FF_BINARY */ |
| 52 | unsigned char eVisible; /* STYLE_NORMAL, STYLE_VISIBLE, .... */ |
| 53 | short int iSize; /* Width for FF_ENTRY. Count for FF_MULTI */ |
| 54 | const char *const *azChoice; /* value/display pairs for FF_MULTI */ |
| 55 | const char *zFalse; /* FF_BINARY label when false */ |
| 56 | const char *zJS; /* Javascript to run on toggle */ |
| 57 | } aSubmenuCtrl[20]; |
| 58 | static int nSubmenuCtrl = 0; |
| 59 | #define FF_ENTRY 1 /* Text entry box */ |
| 60 | #define FF_MULTI 2 /* Combobox. Multiple choices. */ |
| 61 | #define FF_BINARY 3 /* Control binary query parameter */ |
| 62 | #define FF_CHECKBOX 4 /* Check-box with JS */ |
| 63 | #define FF_JSBUTTON 5 /* Run JS when clicked */ |
| 64 | |
| 65 | #if INTERFACE |
| 66 | #define STYLE_NORMAL 0 /* Normal display of control */ |
| 67 | #define STYLE_DISABLED 1 /* Control is disabled */ |
| 68 | #define STYLE_CLUTTER 2 /* Only visible in "Advanced" display */ |
| 69 | #define STYLE_BASIC 4 /* Only visible in "Basic" display */ |
| 70 | #endif /* INTERFACE */ |
| 71 | |
| 72 | /* |
| 73 | ** Remember that the header has been generated. The footer is omitted |
| 74 | ** if an error occurs before the header. |
| @@ -242,22 +239,10 @@ | |
| 242 | aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible; |
| 243 | aSubmenuCtrl[nSubmenuCtrl].zJS = zJS; |
| 244 | aSubmenuCtrl[nSubmenuCtrl].eType = FF_CHECKBOX; |
| 245 | nSubmenuCtrl++; |
| 246 | } |
| 247 | void style_submenu_jsbutton( |
| 248 | const char *zLabel, /* Label to display on the submenu */ |
| 249 | int eVisible, /* Visible or disabled */ |
| 250 | const char *zJS /* Javascript to run when clicked */ |
| 251 | ){ |
| 252 | assert( nSubmenuCtrl < count(aSubmenuCtrl) ); |
| 253 | aSubmenuCtrl[nSubmenuCtrl].zLabel = zLabel; |
| 254 | aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible; |
| 255 | aSubmenuCtrl[nSubmenuCtrl].zJS = zJS; |
| 256 | aSubmenuCtrl[nSubmenuCtrl].eType = FF_JSBUTTON; |
| 257 | nSubmenuCtrl++; |
| 258 | } |
| 259 | void style_submenu_binary( |
| 260 | const char *zName, /* Query parameter name */ |
| 261 | const char *zTrue, /* Label to show when parameter is true */ |
| 262 | const char *zFalse, /* Label to show when the parameter is false */ |
| 263 | int eVisible /* Visible or disabled */ |
| @@ -577,16 +562,10 @@ | |
| 577 | if( aSubmenuCtrl[i].eVisible & STYLE_DISABLED ){ |
| 578 | zDisabled = " disabled"; |
| 579 | }else if( zQPN ){ |
| 580 | cgi_tag_query_parameter(zQPN); |
| 581 | } |
| 582 | if( aSubmenuCtrl[i].eVisible & STYLE_CLUTTER ){ |
| 583 | zXtraClass = " clutter"; |
| 584 | } |
| 585 | if( aSubmenuCtrl[i].eVisible & STYLE_BASIC ){ |
| 586 | zXtraClass = " anticlutter"; |
| 587 | } |
| 588 | switch( aSubmenuCtrl[i].eType ){ |
| 589 | case FF_ENTRY: |
| 590 | @ <span class='submenuctrl%s(zXtraClass)'>\ |
| 591 | @ %h(aSubmenuCtrl[i].zLabel)\ |
| 592 | @ <input type='text' name='%s(zQPN)' value='%h(PD(zQPN, ""))' \ |
| @@ -623,11 +602,12 @@ | |
| 623 | } |
| 624 | break; |
| 625 | } |
| 626 | case FF_BINARY: { |
| 627 | int isTrue = PB(zQPN); |
| 628 | @ <select class='submenuctrl%s(zXtraClass)' size='1' name='%s(zQPN)' \ |
| 629 | @ onchange='gebi("f01").submit();'%s(zDisabled)> |
| 630 | @ <option value='1'\ |
| 631 | if( isTrue ){ |
| 632 | @ selected\ |
| 633 | } |
| @@ -652,16 +632,10 @@ | |
| 652 | @ onchange='gebi("f01").submit();'%s(zDisabled)>\ |
| 653 | } |
| 654 | @ %h(aSubmenuCtrl[i].zLabel)</label> |
| 655 | break; |
| 656 | } |
| 657 | case FF_JSBUTTON: { |
| 658 | @ <a class="label%s(zXtraClass)" \ |
| 659 | @ onclick='%s(aSubmenuCtrl[i].zJS)'%s(zDisabled)>\ |
| 660 | @ %s(aSubmenuCtrl[i].zLabel)</a> |
| 661 | break; |
| 662 | } |
| 663 | } |
| 664 | } |
| 665 | @ </div> |
| 666 | if( nSubmenuCtrl ){ |
| 667 | cgi_query_parameters_to_hidden(); |
| 668 |
| --- src/style.c | |
| +++ src/style.c | |
| @@ -46,29 +46,26 @@ | |
| 46 | } aSubmenu[30]; |
| 47 | static int nSubmenu = 0; /* Number of buttons */ |
| 48 | static struct SubmenuCtrl { |
| 49 | const char *zName; /* Form query parameter */ |
| 50 | const char *zLabel; /* Label. Might be NULL for FF_MULTI */ |
| 51 | unsigned char eType; /* FF_ENTRY, FF_MULTI, FF_CHECKBOX */ |
| 52 | unsigned char eVisible; /* STYLE_NORMAL or STYLE_DISABLED */ |
| 53 | short int iSize; /* Width for FF_ENTRY. Count for FF_MULTI */ |
| 54 | const char *const *azChoice; /* value/display pairs for FF_MULTI */ |
| 55 | const char *zFalse; /* FF_BINARY label when false */ |
| 56 | const char *zJS; /* Javascript to run on toggle */ |
| 57 | } aSubmenuCtrl[20]; |
| 58 | static int nSubmenuCtrl = 0; |
| 59 | #define FF_ENTRY 1 /* Text entry box */ |
| 60 | #define FF_MULTI 2 /* Combobox. Multiple choices. */ |
| 61 | #define FF_BINARY 3 /* Control for binary query parameter */ |
| 62 | #define FF_CHECKBOX 4 /* Check-box */ |
| 63 | |
| 64 | #if INTERFACE |
| 65 | #define STYLE_NORMAL 0 /* Normal display of control */ |
| 66 | #define STYLE_DISABLED 1 /* Control is disabled */ |
| 67 | #endif /* INTERFACE */ |
| 68 | |
| 69 | /* |
| 70 | ** Remember that the header has been generated. The footer is omitted |
| 71 | ** if an error occurs before the header. |
| @@ -242,22 +239,10 @@ | |
| 239 | aSubmenuCtrl[nSubmenuCtrl].eVisible = eVisible; |
| 240 | aSubmenuCtrl[nSubmenuCtrl].zJS = zJS; |
| 241 | aSubmenuCtrl[nSubmenuCtrl].eType = FF_CHECKBOX; |
| 242 | nSubmenuCtrl++; |
| 243 | } |
| 244 | void style_submenu_binary( |
| 245 | const char *zName, /* Query parameter name */ |
| 246 | const char *zTrue, /* Label to show when parameter is true */ |
| 247 | const char *zFalse, /* Label to show when the parameter is false */ |
| 248 | int eVisible /* Visible or disabled */ |
| @@ -577,16 +562,10 @@ | |
| 562 | if( aSubmenuCtrl[i].eVisible & STYLE_DISABLED ){ |
| 563 | zDisabled = " disabled"; |
| 564 | }else if( zQPN ){ |
| 565 | cgi_tag_query_parameter(zQPN); |
| 566 | } |
| 567 | switch( aSubmenuCtrl[i].eType ){ |
| 568 | case FF_ENTRY: |
| 569 | @ <span class='submenuctrl%s(zXtraClass)'>\ |
| 570 | @ %h(aSubmenuCtrl[i].zLabel)\ |
| 571 | @ <input type='text' name='%s(zQPN)' value='%h(PD(zQPN, ""))' \ |
| @@ -623,11 +602,12 @@ | |
| 602 | } |
| 603 | break; |
| 604 | } |
| 605 | case FF_BINARY: { |
| 606 | int isTrue = PB(zQPN); |
| 607 | @ <select class='submenuctrl%s(zXtraClass)' size='1' \ |
| 608 | @ name='%s(zQPN)' \ |
| 609 | @ onchange='gebi("f01").submit();'%s(zDisabled)> |
| 610 | @ <option value='1'\ |
| 611 | if( isTrue ){ |
| 612 | @ selected\ |
| 613 | } |
| @@ -652,16 +632,10 @@ | |
| 632 | @ onchange='gebi("f01").submit();'%s(zDisabled)>\ |
| 633 | } |
| 634 | @ %h(aSubmenuCtrl[i].zLabel)</label> |
| 635 | break; |
| 636 | } |
| 637 | } |
| 638 | } |
| 639 | @ </div> |
| 640 | if( nSubmenuCtrl ){ |
| 641 | cgi_query_parameters_to_hidden(); |
| 642 |
+35
-14
| --- src/timeline.c | ||
| +++ src/timeline.c | ||
| @@ -1318,10 +1318,11 @@ | ||
| 1318 | 1318 | ** mionly Limit rel to show ancestors but not descendants |
| 1319 | 1319 | ** ms=MATCHSTYLE Set tag match style to EXACT, GLOB, LIKE, REGEXP |
| 1320 | 1320 | ** u=USER Only show items associated with USER |
| 1321 | 1321 | ** y=TYPE 'ci', 'w', 't', 'e', or 'all'. |
| 1322 | 1322 | ** ss=VIEWSTYLE c: "Compact" v: "Verbose" m: "Modern" j: "Columnar" |
| 1323 | +** advm Use the "Advanced" or "Busy" menu design. | |
| 1323 | 1324 | ** ng No Graph. |
| 1324 | 1325 | ** nd Do not highlight the focus check-in |
| 1325 | 1326 | ** v Show details of files changed |
| 1326 | 1327 | ** f=CHECKIN Show family (immediate parents and children) of CHECKIN |
| 1327 | 1328 | ** from=CHECKIN Path from... |
| @@ -1396,10 +1397,11 @@ | ||
| 1396 | 1397 | const char *z; |
| 1397 | 1398 | char *zOlderButton = 0; /* URL for Older button at the bottom */ |
| 1398 | 1399 | char *zNewerButton = 0; /* URL for Newer button at the top */ |
| 1399 | 1400 | int selectedRid = -9999999; /* Show a highlight on this RID */ |
| 1400 | 1401 | int disableY = 0; /* Disable type selector on submenu */ |
| 1402 | + int advancedMenu = 0; /* Use the advanced menu design */ | |
| 1401 | 1403 | |
| 1402 | 1404 | /* Set number of rows to display */ |
| 1403 | 1405 | cookie_read_parameter("n","n"); |
| 1404 | 1406 | z = P("n"); |
| 1405 | 1407 | if( z==0 ) z = db_get("timeline-default-length",0); |
| @@ -1418,10 +1420,12 @@ | ||
| 1418 | 1420 | nEntry = 50; |
| 1419 | 1421 | } |
| 1420 | 1422 | cgi_replace_query_parameter("n",z); |
| 1421 | 1423 | cookie_write_parameter("n","n",0); |
| 1422 | 1424 | tmFlags |= timeline_ss_submenu(); |
| 1425 | + cookie_link_parameter("advm","advm","0"); | |
| 1426 | + advancedMenu = atoi(PD("advm","0")); | |
| 1423 | 1427 | |
| 1424 | 1428 | /* To view the timeline, must have permission to read project data. |
| 1425 | 1429 | */ |
| 1426 | 1430 | pd_rid = name_to_typed_rid(P("dp"),"ci"); |
| 1427 | 1431 | if( pd_rid ){ |
| @@ -1474,11 +1478,13 @@ | ||
| 1474 | 1478 | /* For exact maching, inhibit links to the selected tag. */ |
| 1475 | 1479 | zThisTag = zTagName; |
| 1476 | 1480 | } |
| 1477 | 1481 | |
| 1478 | 1482 | /* Display a checkbox to enable/disable display of related check-ins. */ |
| 1479 | - style_submenu_checkbox("rel", "Related", STYLE_CLUTTER, 0); | |
| 1483 | + if( advancedMenu ){ | |
| 1484 | + style_submenu_checkbox("rel", "Related", 0, 0); | |
| 1485 | + } | |
| 1480 | 1486 | |
| 1481 | 1487 | /* Construct the tag match expression. */ |
| 1482 | 1488 | zTagSql = tagMatchExpression(matchStyle, zTagName, &zMatchDesc, &zError); |
| 1483 | 1489 | } |
| 1484 | 1490 | |
| @@ -1562,11 +1568,13 @@ | ||
| 1562 | 1568 | }else{ |
| 1563 | 1569 | bisectOnly = 0; |
| 1564 | 1570 | } |
| 1565 | 1571 | |
| 1566 | 1572 | style_header("Timeline"); |
| 1567 | - style_submenu_element("Help", "%R/help?cmd=/timeline"); | |
| 1573 | + if( advancedMenu ){ | |
| 1574 | + style_submenu_element("Help", "%R/help?cmd=/timeline"); | |
| 1575 | + } | |
| 1568 | 1576 | login_anonymous_available(); |
| 1569 | 1577 | timeline_temp_table(); |
| 1570 | 1578 | blob_zero(&sql); |
| 1571 | 1579 | blob_zero(&desc); |
| 1572 | 1580 | blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1); |
| @@ -1607,11 +1615,13 @@ | ||
| 1607 | 1615 | blob_append(&sql, ")", -1); |
| 1608 | 1616 | path_reset(); |
| 1609 | 1617 | addFileGlobExclusion(zChng, &sql); |
| 1610 | 1618 | tmFlags |= TIMELINE_DISJOINT; |
| 1611 | 1619 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 1612 | - style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c')|STYLE_CLUTTER,0); | |
| 1620 | + if( advancedMenu ){ | |
| 1621 | + style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); | |
| 1622 | + } | |
| 1613 | 1623 | blob_appendf(&desc, "%d check-ins going from ", |
| 1614 | 1624 | db_int(0, "SELECT count(*) FROM timeline")); |
| 1615 | 1625 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom); |
| 1616 | 1626 | blob_append(&desc, " to ", -1); |
| 1617 | 1627 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo); |
| @@ -1657,12 +1667,14 @@ | ||
| 1657 | 1667 | if( p_rid ){ |
| 1658 | 1668 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 1659 | 1669 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); |
| 1660 | 1670 | } |
| 1661 | 1671 | } |
| 1662 | - style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c')|STYLE_CLUTTER, 0); | |
| 1663 | - style_submenu_entry("n","Max:",4,STYLE_CLUTTER); | |
| 1672 | + if( advancedMenu ){ | |
| 1673 | + style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); | |
| 1674 | + } | |
| 1675 | + style_submenu_entry("n","Max:",4,0); | |
| 1664 | 1676 | timeline_y_submenu(1); |
| 1665 | 1677 | }else if( f_rid && g.perm.Read ){ |
| 1666 | 1678 | /* If f= is present, ignore all other parameters other than n= */ |
| 1667 | 1679 | char *zUuid; |
| 1668 | 1680 | db_multi_exec( |
| @@ -1677,12 +1689,14 @@ | ||
| 1677 | 1689 | if( useDividers ) selectedRid = f_rid; |
| 1678 | 1690 | blob_appendf(&desc, "Parents and children of check-in "); |
| 1679 | 1691 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid); |
| 1680 | 1692 | blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%!S", zUuid), zUuid); |
| 1681 | 1693 | tmFlags |= TIMELINE_DISJOINT; |
| 1682 | - style_submenu_checkbox("unhide", "Unhide", STYLE_CLUTTER, 0); | |
| 1683 | - style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c')|STYLE_CLUTTER, 0); | |
| 1694 | + if( advancedMenu ){ | |
| 1695 | + style_submenu_checkbox("unhide", "Unhide", 0, 0); | |
| 1696 | + style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); | |
| 1697 | + } | |
| 1684 | 1698 | }else{ |
| 1685 | 1699 | /* Otherwise, a timeline based on a span of time */ |
| 1686 | 1700 | int n; |
| 1687 | 1701 | const char *zEType = "timeline item"; |
| 1688 | 1702 | char *zDate; |
| @@ -1960,29 +1974,36 @@ | ||
| 1960 | 1974 | ){ |
| 1961 | 1975 | zNewerButton = fossil_strdup(url_render(&url, "a", zDate, "b", 0)); |
| 1962 | 1976 | } |
| 1963 | 1977 | free(zDate); |
| 1964 | 1978 | } |
| 1965 | - if( zType[0]=='a' || zType[0]=='c' ){ | |
| 1966 | - style_submenu_checkbox("unhide", "Unhide", STYLE_CLUTTER, 0); | |
| 1979 | + if( advancedMenu ){ | |
| 1980 | + if( zType[0]=='a' || zType[0]=='c' ){ | |
| 1981 | + style_submenu_checkbox("unhide", "Unhide", 0, 0); | |
| 1982 | + } | |
| 1983 | + style_submenu_checkbox("v", "Files",(zType[0]!='a' && zType[0]!='c'),0); | |
| 1967 | 1984 | } |
| 1968 | - style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c')|STYLE_CLUTTER,0); | |
| 1969 | 1985 | style_submenu_entry("n","Max:",4,0); |
| 1970 | 1986 | timeline_y_submenu(disableY); |
| 1971 | - style_submenu_entry("t", "Tag Filter:", -8, STYLE_CLUTTER); | |
| 1972 | - style_submenu_multichoice("ms", count(azMatchStyles)/2, azMatchStyles, STYLE_CLUTTER); | |
| 1987 | + if( advancedMenu ){ | |
| 1988 | + style_submenu_entry("t", "Tag Filter:", -8, 0); | |
| 1989 | + style_submenu_multichoice("ms", count(azMatchStyles)/2,azMatchStyles,0); | |
| 1990 | + } | |
| 1973 | 1991 | } |
| 1974 | 1992 | blob_zero(&cond); |
| 1975 | 1993 | } |
| 1976 | 1994 | if( PB("showsql") ){ |
| 1977 | 1995 | @ <pre>%h(blob_sql_text(&sql))</pre> |
| 1978 | 1996 | } |
| 1979 | 1997 | if( search_restrict(SRCH_CKIN)!=0 ){ |
| 1980 | 1998 | style_submenu_element("Search", "%R/search?y=c"); |
| 1981 | 1999 | } |
| 1982 | - style_submenu_jsbutton("Advanced", STYLE_BASIC, "reclutter()"); | |
| 1983 | - style_submenu_jsbutton("Basic", STYLE_CLUTTER, "declutter()"); | |
| 2000 | + if( advancedMenu ){ | |
| 2001 | + style_submenu_element("Basic", url_render(&url, "advm", "0", 0, 0)); | |
| 2002 | + }else{ | |
| 2003 | + style_submenu_element("Advanced", url_render(&url, "advm", "1", 0, 0)); | |
| 2004 | + } | |
| 1984 | 2005 | if( PB("showid") ) tmFlags |= TIMELINE_SHOWRID; |
| 1985 | 2006 | if( useDividers && zMark && zMark[0] ){ |
| 1986 | 2007 | double r = symbolic_name_to_mtime(zMark); |
| 1987 | 2008 | if( r>0.0 ) selectedRid = timeline_add_divider(r); |
| 1988 | 2009 | } |
| 1989 | 2010 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -1318,10 +1318,11 @@ | |
| 1318 | ** mionly Limit rel to show ancestors but not descendants |
| 1319 | ** ms=MATCHSTYLE Set tag match style to EXACT, GLOB, LIKE, REGEXP |
| 1320 | ** u=USER Only show items associated with USER |
| 1321 | ** y=TYPE 'ci', 'w', 't', 'e', or 'all'. |
| 1322 | ** ss=VIEWSTYLE c: "Compact" v: "Verbose" m: "Modern" j: "Columnar" |
| 1323 | ** ng No Graph. |
| 1324 | ** nd Do not highlight the focus check-in |
| 1325 | ** v Show details of files changed |
| 1326 | ** f=CHECKIN Show family (immediate parents and children) of CHECKIN |
| 1327 | ** from=CHECKIN Path from... |
| @@ -1396,10 +1397,11 @@ | |
| 1396 | const char *z; |
| 1397 | char *zOlderButton = 0; /* URL for Older button at the bottom */ |
| 1398 | char *zNewerButton = 0; /* URL for Newer button at the top */ |
| 1399 | int selectedRid = -9999999; /* Show a highlight on this RID */ |
| 1400 | int disableY = 0; /* Disable type selector on submenu */ |
| 1401 | |
| 1402 | /* Set number of rows to display */ |
| 1403 | cookie_read_parameter("n","n"); |
| 1404 | z = P("n"); |
| 1405 | if( z==0 ) z = db_get("timeline-default-length",0); |
| @@ -1418,10 +1420,12 @@ | |
| 1418 | nEntry = 50; |
| 1419 | } |
| 1420 | cgi_replace_query_parameter("n",z); |
| 1421 | cookie_write_parameter("n","n",0); |
| 1422 | tmFlags |= timeline_ss_submenu(); |
| 1423 | |
| 1424 | /* To view the timeline, must have permission to read project data. |
| 1425 | */ |
| 1426 | pd_rid = name_to_typed_rid(P("dp"),"ci"); |
| 1427 | if( pd_rid ){ |
| @@ -1474,11 +1478,13 @@ | |
| 1474 | /* For exact maching, inhibit links to the selected tag. */ |
| 1475 | zThisTag = zTagName; |
| 1476 | } |
| 1477 | |
| 1478 | /* Display a checkbox to enable/disable display of related check-ins. */ |
| 1479 | style_submenu_checkbox("rel", "Related", STYLE_CLUTTER, 0); |
| 1480 | |
| 1481 | /* Construct the tag match expression. */ |
| 1482 | zTagSql = tagMatchExpression(matchStyle, zTagName, &zMatchDesc, &zError); |
| 1483 | } |
| 1484 | |
| @@ -1562,11 +1568,13 @@ | |
| 1562 | }else{ |
| 1563 | bisectOnly = 0; |
| 1564 | } |
| 1565 | |
| 1566 | style_header("Timeline"); |
| 1567 | style_submenu_element("Help", "%R/help?cmd=/timeline"); |
| 1568 | login_anonymous_available(); |
| 1569 | timeline_temp_table(); |
| 1570 | blob_zero(&sql); |
| 1571 | blob_zero(&desc); |
| 1572 | blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1); |
| @@ -1607,11 +1615,13 @@ | |
| 1607 | blob_append(&sql, ")", -1); |
| 1608 | path_reset(); |
| 1609 | addFileGlobExclusion(zChng, &sql); |
| 1610 | tmFlags |= TIMELINE_DISJOINT; |
| 1611 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 1612 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c')|STYLE_CLUTTER,0); |
| 1613 | blob_appendf(&desc, "%d check-ins going from ", |
| 1614 | db_int(0, "SELECT count(*) FROM timeline")); |
| 1615 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom); |
| 1616 | blob_append(&desc, " to ", -1); |
| 1617 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo); |
| @@ -1657,12 +1667,14 @@ | |
| 1657 | if( p_rid ){ |
| 1658 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 1659 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); |
| 1660 | } |
| 1661 | } |
| 1662 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c')|STYLE_CLUTTER, 0); |
| 1663 | style_submenu_entry("n","Max:",4,STYLE_CLUTTER); |
| 1664 | timeline_y_submenu(1); |
| 1665 | }else if( f_rid && g.perm.Read ){ |
| 1666 | /* If f= is present, ignore all other parameters other than n= */ |
| 1667 | char *zUuid; |
| 1668 | db_multi_exec( |
| @@ -1677,12 +1689,14 @@ | |
| 1677 | if( useDividers ) selectedRid = f_rid; |
| 1678 | blob_appendf(&desc, "Parents and children of check-in "); |
| 1679 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid); |
| 1680 | blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%!S", zUuid), zUuid); |
| 1681 | tmFlags |= TIMELINE_DISJOINT; |
| 1682 | style_submenu_checkbox("unhide", "Unhide", STYLE_CLUTTER, 0); |
| 1683 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c')|STYLE_CLUTTER, 0); |
| 1684 | }else{ |
| 1685 | /* Otherwise, a timeline based on a span of time */ |
| 1686 | int n; |
| 1687 | const char *zEType = "timeline item"; |
| 1688 | char *zDate; |
| @@ -1960,29 +1974,36 @@ | |
| 1960 | ){ |
| 1961 | zNewerButton = fossil_strdup(url_render(&url, "a", zDate, "b", 0)); |
| 1962 | } |
| 1963 | free(zDate); |
| 1964 | } |
| 1965 | if( zType[0]=='a' || zType[0]=='c' ){ |
| 1966 | style_submenu_checkbox("unhide", "Unhide", STYLE_CLUTTER, 0); |
| 1967 | } |
| 1968 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c')|STYLE_CLUTTER,0); |
| 1969 | style_submenu_entry("n","Max:",4,0); |
| 1970 | timeline_y_submenu(disableY); |
| 1971 | style_submenu_entry("t", "Tag Filter:", -8, STYLE_CLUTTER); |
| 1972 | style_submenu_multichoice("ms", count(azMatchStyles)/2, azMatchStyles, STYLE_CLUTTER); |
| 1973 | } |
| 1974 | blob_zero(&cond); |
| 1975 | } |
| 1976 | if( PB("showsql") ){ |
| 1977 | @ <pre>%h(blob_sql_text(&sql))</pre> |
| 1978 | } |
| 1979 | if( search_restrict(SRCH_CKIN)!=0 ){ |
| 1980 | style_submenu_element("Search", "%R/search?y=c"); |
| 1981 | } |
| 1982 | style_submenu_jsbutton("Advanced", STYLE_BASIC, "reclutter()"); |
| 1983 | style_submenu_jsbutton("Basic", STYLE_CLUTTER, "declutter()"); |
| 1984 | if( PB("showid") ) tmFlags |= TIMELINE_SHOWRID; |
| 1985 | if( useDividers && zMark && zMark[0] ){ |
| 1986 | double r = symbolic_name_to_mtime(zMark); |
| 1987 | if( r>0.0 ) selectedRid = timeline_add_divider(r); |
| 1988 | } |
| 1989 |
| --- src/timeline.c | |
| +++ src/timeline.c | |
| @@ -1318,10 +1318,11 @@ | |
| 1318 | ** mionly Limit rel to show ancestors but not descendants |
| 1319 | ** ms=MATCHSTYLE Set tag match style to EXACT, GLOB, LIKE, REGEXP |
| 1320 | ** u=USER Only show items associated with USER |
| 1321 | ** y=TYPE 'ci', 'w', 't', 'e', or 'all'. |
| 1322 | ** ss=VIEWSTYLE c: "Compact" v: "Verbose" m: "Modern" j: "Columnar" |
| 1323 | ** advm Use the "Advanced" or "Busy" menu design. |
| 1324 | ** ng No Graph. |
| 1325 | ** nd Do not highlight the focus check-in |
| 1326 | ** v Show details of files changed |
| 1327 | ** f=CHECKIN Show family (immediate parents and children) of CHECKIN |
| 1328 | ** from=CHECKIN Path from... |
| @@ -1396,10 +1397,11 @@ | |
| 1397 | const char *z; |
| 1398 | char *zOlderButton = 0; /* URL for Older button at the bottom */ |
| 1399 | char *zNewerButton = 0; /* URL for Newer button at the top */ |
| 1400 | int selectedRid = -9999999; /* Show a highlight on this RID */ |
| 1401 | int disableY = 0; /* Disable type selector on submenu */ |
| 1402 | int advancedMenu = 0; /* Use the advanced menu design */ |
| 1403 | |
| 1404 | /* Set number of rows to display */ |
| 1405 | cookie_read_parameter("n","n"); |
| 1406 | z = P("n"); |
| 1407 | if( z==0 ) z = db_get("timeline-default-length",0); |
| @@ -1418,10 +1420,12 @@ | |
| 1420 | nEntry = 50; |
| 1421 | } |
| 1422 | cgi_replace_query_parameter("n",z); |
| 1423 | cookie_write_parameter("n","n",0); |
| 1424 | tmFlags |= timeline_ss_submenu(); |
| 1425 | cookie_link_parameter("advm","advm","0"); |
| 1426 | advancedMenu = atoi(PD("advm","0")); |
| 1427 | |
| 1428 | /* To view the timeline, must have permission to read project data. |
| 1429 | */ |
| 1430 | pd_rid = name_to_typed_rid(P("dp"),"ci"); |
| 1431 | if( pd_rid ){ |
| @@ -1474,11 +1478,13 @@ | |
| 1478 | /* For exact maching, inhibit links to the selected tag. */ |
| 1479 | zThisTag = zTagName; |
| 1480 | } |
| 1481 | |
| 1482 | /* Display a checkbox to enable/disable display of related check-ins. */ |
| 1483 | if( advancedMenu ){ |
| 1484 | style_submenu_checkbox("rel", "Related", 0, 0); |
| 1485 | } |
| 1486 | |
| 1487 | /* Construct the tag match expression. */ |
| 1488 | zTagSql = tagMatchExpression(matchStyle, zTagName, &zMatchDesc, &zError); |
| 1489 | } |
| 1490 | |
| @@ -1562,11 +1568,13 @@ | |
| 1568 | }else{ |
| 1569 | bisectOnly = 0; |
| 1570 | } |
| 1571 | |
| 1572 | style_header("Timeline"); |
| 1573 | if( advancedMenu ){ |
| 1574 | style_submenu_element("Help", "%R/help?cmd=/timeline"); |
| 1575 | } |
| 1576 | login_anonymous_available(); |
| 1577 | timeline_temp_table(); |
| 1578 | blob_zero(&sql); |
| 1579 | blob_zero(&desc); |
| 1580 | blob_append(&sql, "INSERT OR IGNORE INTO timeline ", -1); |
| @@ -1607,11 +1615,13 @@ | |
| 1615 | blob_append(&sql, ")", -1); |
| 1616 | path_reset(); |
| 1617 | addFileGlobExclusion(zChng, &sql); |
| 1618 | tmFlags |= TIMELINE_DISJOINT; |
| 1619 | db_multi_exec("%s", blob_sql_text(&sql)); |
| 1620 | if( advancedMenu ){ |
| 1621 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 1622 | } |
| 1623 | blob_appendf(&desc, "%d check-ins going from ", |
| 1624 | db_int(0, "SELECT count(*) FROM timeline")); |
| 1625 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h", zFrom), zFrom); |
| 1626 | blob_append(&desc, " to ", -1); |
| 1627 | blob_appendf(&desc, "%z[%h]</a>", href("%R/info/%h",zTo), zTo); |
| @@ -1657,12 +1667,14 @@ | |
| 1667 | if( p_rid ){ |
| 1668 | /* If both p= and d= are set, we don't have the uuid of d yet. */ |
| 1669 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", d_rid); |
| 1670 | } |
| 1671 | } |
| 1672 | if( advancedMenu ){ |
| 1673 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 1674 | } |
| 1675 | style_submenu_entry("n","Max:",4,0); |
| 1676 | timeline_y_submenu(1); |
| 1677 | }else if( f_rid && g.perm.Read ){ |
| 1678 | /* If f= is present, ignore all other parameters other than n= */ |
| 1679 | char *zUuid; |
| 1680 | db_multi_exec( |
| @@ -1677,12 +1689,14 @@ | |
| 1689 | if( useDividers ) selectedRid = f_rid; |
| 1690 | blob_appendf(&desc, "Parents and children of check-in "); |
| 1691 | zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", f_rid); |
| 1692 | blob_appendf(&desc, "%z[%S]</a>", href("%R/info/%!S", zUuid), zUuid); |
| 1693 | tmFlags |= TIMELINE_DISJOINT; |
| 1694 | if( advancedMenu ){ |
| 1695 | style_submenu_checkbox("unhide", "Unhide", 0, 0); |
| 1696 | style_submenu_checkbox("v", "Files", (zType[0]!='a' && zType[0]!='c'),0); |
| 1697 | } |
| 1698 | }else{ |
| 1699 | /* Otherwise, a timeline based on a span of time */ |
| 1700 | int n; |
| 1701 | const char *zEType = "timeline item"; |
| 1702 | char *zDate; |
| @@ -1960,29 +1974,36 @@ | |
| 1974 | ){ |
| 1975 | zNewerButton = fossil_strdup(url_render(&url, "a", zDate, "b", 0)); |
| 1976 | } |
| 1977 | free(zDate); |
| 1978 | } |
| 1979 | if( advancedMenu ){ |
| 1980 | if( zType[0]=='a' || zType[0]=='c' ){ |
| 1981 | style_submenu_checkbox("unhide", "Unhide", 0, 0); |
| 1982 | } |
| 1983 | style_submenu_checkbox("v", "Files",(zType[0]!='a' && zType[0]!='c'),0); |
| 1984 | } |
| 1985 | style_submenu_entry("n","Max:",4,0); |
| 1986 | timeline_y_submenu(disableY); |
| 1987 | if( advancedMenu ){ |
| 1988 | style_submenu_entry("t", "Tag Filter:", -8, 0); |
| 1989 | style_submenu_multichoice("ms", count(azMatchStyles)/2,azMatchStyles,0); |
| 1990 | } |
| 1991 | } |
| 1992 | blob_zero(&cond); |
| 1993 | } |
| 1994 | if( PB("showsql") ){ |
| 1995 | @ <pre>%h(blob_sql_text(&sql))</pre> |
| 1996 | } |
| 1997 | if( search_restrict(SRCH_CKIN)!=0 ){ |
| 1998 | style_submenu_element("Search", "%R/search?y=c"); |
| 1999 | } |
| 2000 | if( advancedMenu ){ |
| 2001 | style_submenu_element("Basic", url_render(&url, "advm", "0", 0, 0)); |
| 2002 | }else{ |
| 2003 | style_submenu_element("Advanced", url_render(&url, "advm", "1", 0, 0)); |
| 2004 | } |
| 2005 | if( PB("showid") ) tmFlags |= TIMELINE_SHOWRID; |
| 2006 | if( useDividers && zMark && zMark[0] ){ |
| 2007 | double r = symbolic_name_to_mtime(zMark); |
| 2008 | if( r>0.0 ) selectedRid = timeline_add_divider(r); |
| 2009 | } |
| 2010 |