664 ToolbarMusicClick, |
664 ToolbarMusicClick, |
665 ToolbarNewspaperClick, |
665 ToolbarNewspaperClick, |
666 ToolbarHelpClick, |
666 ToolbarHelpClick, |
667 }; |
667 }; |
668 |
668 |
669 static void MainToolbarWndProc(Window *w, WindowEvent *e) |
669 struct MainToolbarWindow : Window { |
670 { |
670 MainToolbarWindow(const WindowDesc *desc) : Window(desc) |
671 switch (e->event) { |
671 { |
672 case WE_PAINT: |
672 this->SetWidgetDisabledState(0, _networking && !_network_server); // if not server, disable pause button |
673 /* Draw brown-red toolbar bg. */ |
673 this->SetWidgetDisabledState(1, _networking); // if networking, disable fast-forward button |
674 GfxFillRect(0, 0, w->width - 1, w->height - 1, 0xB2); |
674 |
675 GfxFillRect(0, 0, w->width - 1, w->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT)); |
675 CLRBITS(this->flags4, WF_WHITE_BORDER_MASK); |
676 |
676 |
677 /* If spectator, disable all construction buttons |
677 PositionMainToolbar(this); |
678 * ie : Build road, rail, ships, airports and landscaping |
678 DoZoomInOutWindow(ZOOM_NONE, this); |
679 * Since enabled state is the default, just disable when needed */ |
679 this->FindWindowPlacementAndResize(desc); |
680 w->SetWidgetsDisabledState(_current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END); |
680 } |
681 /* disable company list drop downs, if there are no companies */ |
681 |
682 w->SetWidgetsDisabledState(ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END); |
682 virtual void OnPaint() |
683 |
683 { |
684 w->SetWidgetDisabledState(19, !CanBuildVehicleInfrastructure(VEH_TRAIN)); |
684 /* Draw brown-red toolbar bg. */ |
685 w->SetWidgetDisabledState(22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT)); |
685 GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2); |
686 |
686 GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT)); |
687 w->DrawWidgets(); |
687 |
688 break; |
688 /* If spectator, disable all construction buttons |
689 |
689 * ie : Build road, rail, ships, airports and landscaping |
690 case WE_CLICK: |
690 * Since enabled state is the default, just disable when needed */ |
691 if (_game_mode != GM_MENU && !w->IsWidgetDisabled(e->we.click.widget)) _toolbar_button_procs[e->we.click.widget](w); |
691 this->SetWidgetsDisabledState(_current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END); |
692 break; |
692 /* disable company list drop downs, if there are no companies */ |
693 |
693 this->SetWidgetsDisabledState(ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END); |
694 case WE_KEYPRESS: |
694 |
695 switch (e->we.keypress.keycode) { |
695 this->SetWidgetDisabledState(19, !CanBuildVehicleInfrastructure(VEH_TRAIN)); |
696 case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break; |
696 this->SetWidgetDisabledState(22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT)); |
697 case WKC_F2: ShowGameOptions(); break; |
697 |
698 case WKC_F3: MenuClickSaveLoad(0); break; |
698 this->DrawWidgets(); |
699 case WKC_F4: ShowSmallMap(); break; |
699 } |
700 case WKC_F5: ShowTownDirectory(); break; |
700 |
701 case WKC_F6: ShowSubsidiesList(); break; |
701 virtual void OnClick(Point pt, int widget) |
702 case WKC_F7: ShowPlayerStations(_local_player); break; |
702 { |
703 case WKC_F8: ShowPlayerFinances(_local_player); break; |
703 if (_game_mode != GM_MENU && !this->IsWidgetDisabled(widget)) _toolbar_button_procs[widget](this); |
704 case WKC_F9: ShowPlayerCompany(_local_player); break; |
704 } |
705 case WKC_F10: ShowOperatingProfitGraph(); break; |
705 |
706 case WKC_F11: ShowCompanyLeagueTable(); break; |
706 virtual EventState OnKeyPress(uint16 key, uint16 keycode) |
707 case WKC_F12: ShowBuildIndustryWindow(); break; |
707 { |
708 case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, VEH_TRAIN); break; |
708 switch (keycode) { |
709 case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break; |
709 case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break; |
710 case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break; |
710 case WKC_F2: ShowGameOptions(); break; |
711 case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break; |
711 case WKC_F3: MenuClickSaveLoad(0); break; |
712 case WKC_NUM_PLUS: // Fall through |
712 case WKC_F4: ShowSmallMap(); break; |
713 case WKC_EQUALS: // Fall through |
713 case WKC_F5: ShowTownDirectory(); break; |
714 case WKC_SHIFT | WKC_EQUALS: // Fall through |
714 case WKC_F6: ShowSubsidiesList(); break; |
715 case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break; |
715 case WKC_F7: ShowPlayerStations(_local_player); break; |
716 case WKC_NUM_MINUS: // Fall through |
716 case WKC_F8: ShowPlayerFinances(_local_player); break; |
717 case WKC_MINUS: // Fall through |
717 case WKC_F9: ShowPlayerCompany(_local_player); break; |
718 case WKC_SHIFT | WKC_MINUS: // Fall through |
718 case WKC_F10: ShowOperatingProfitGraph(); break; |
719 case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break; |
719 case WKC_F11: ShowCompanyLeagueTable(); break; |
720 case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break; |
720 case WKC_F12: ShowBuildIndustryWindow(); break; |
721 case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break; |
721 case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, VEH_TRAIN); break; |
722 case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break; |
722 case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break; |
723 case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break; |
723 case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break; |
724 case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break; |
724 case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break; |
725 case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break; |
725 case WKC_NUM_PLUS: // Fall through |
726 case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break; |
726 case WKC_EQUALS: // Fall through |
727 case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break; |
727 case WKC_SHIFT | WKC_EQUALS: // Fall through |
728 case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break; |
728 case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(this); break; |
729 case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail |
729 case WKC_NUM_MINUS: // Fall through |
730 case 'L': ShowTerraformToolbar(); break; |
730 case WKC_MINUS: // Fall through |
731 case 'M': ShowSmallMap(); break; |
731 case WKC_SHIFT | WKC_MINUS: // Fall through |
732 case 'V': ShowExtraViewPortWindow(); break; |
732 case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break; |
733 default: return; |
733 case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break; |
|
734 case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break; |
|
735 case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break; |
|
736 case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break; |
|
737 case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break; |
|
738 case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break; |
|
739 case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break; |
|
740 case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break; |
|
741 case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break; |
|
742 case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail |
|
743 case 'L': ShowTerraformToolbar(); break; |
|
744 case 'M': ShowSmallMap(); break; |
|
745 case 'V': ShowExtraViewPortWindow(); break; |
|
746 default: return ES_NOT_HANDLED; |
|
747 } |
|
748 return ES_HANDLED; |
|
749 } |
|
750 |
|
751 virtual void OnPlaceObject(Point pt, TileIndex tile) |
|
752 { |
|
753 _place_proc(tile); |
|
754 } |
|
755 |
|
756 virtual void OnPlaceObjectAbort() |
|
757 { |
|
758 this->RaiseWidget(25); |
|
759 this->SetDirty(); |
|
760 } |
|
761 |
|
762 virtual void OnTick() |
|
763 { |
|
764 if (this->IsWidgetLowered(0) != !!_pause_game) { |
|
765 this->ToggleWidgetLoweredState(0); |
|
766 this->InvalidateWidget(0); |
|
767 } |
|
768 |
|
769 if (this->IsWidgetLowered(1) != !!_fast_forward) { |
|
770 this->ToggleWidgetLoweredState(1); |
|
771 this->InvalidateWidget(1); |
|
772 } |
|
773 } |
|
774 |
|
775 virtual void OnResize(Point new_size, Point delta) |
|
776 { |
|
777 /* There are 27 buttons plus some spacings if the space allows it */ |
|
778 uint button_width; |
|
779 uint spacing; |
|
780 if (this->width >= 27 * 22) { |
|
781 button_width = 22; |
|
782 spacing = this->width - (27 * button_width); |
|
783 } else { |
|
784 button_width = this->width / 27; |
|
785 spacing = 0; |
|
786 } |
|
787 uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 }; |
|
788 |
|
789 for (uint i = 0, x = 0, j = 0; i < 27; i++) { |
|
790 if (extra_spacing_at[j] == i) { |
|
791 j++; |
|
792 uint add = spacing / (lengthof(extra_spacing_at) - j); |
|
793 spacing -= add; |
|
794 x += add; |
734 } |
795 } |
735 e->we.keypress.cont = false; |
796 |
736 break; |
797 this->widget[i].left = x; |
737 |
798 x += (spacing != 0) ? button_width : (this->width - x) / (27 - i); |
738 case WE_PLACE_OBJ: |
799 this->widget[i].right = x - 1; |
739 _place_proc(e->we.place.tile); |
800 } |
740 break; |
801 } |
741 |
802 |
742 case WE_ABORT_PLACE_OBJ: |
803 virtual void OnTimeout() |
743 w->RaiseWidget(25); |
804 { |
744 w->SetDirty(); |
805 for (uint i = 2; i < this->widget_count; i++) { |
745 break; |
806 if (this->IsWidgetLowered(i)) { |
746 |
807 this->RaiseWidget(i); |
747 case WE_TICK: |
808 this->InvalidateWidget(i); |
748 if (w->IsWidgetLowered(0) != !!_pause_game) { |
|
749 w->ToggleWidgetLoweredState(0); |
|
750 w->InvalidateWidget(0); |
|
751 } |
809 } |
752 |
810 } |
753 if (w->IsWidgetLowered(1) != !!_fast_forward) { |
811 } |
754 w->ToggleWidgetLoweredState(1); |
812 |
755 w->InvalidateWidget(1); |
813 virtual void OnInvalidateData(int data) |
756 } |
814 { |
757 break; |
815 if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18); |
758 |
816 } |
759 case WE_RESIZE: { |
817 }; |
760 /* There are 27 buttons plus some spacings if the space allows it */ |
|
761 uint button_width; |
|
762 uint spacing; |
|
763 if (w->width >= 27 * 22) { |
|
764 button_width = 22; |
|
765 spacing = w->width - (27 * button_width); |
|
766 } else { |
|
767 button_width = w->width / 27; |
|
768 spacing = 0; |
|
769 } |
|
770 uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 }; |
|
771 |
|
772 for (uint i = 0, x = 0, j = 0; i < 27; i++) { |
|
773 if (extra_spacing_at[j] == i) { |
|
774 j++; |
|
775 uint add = spacing / (lengthof(extra_spacing_at) - j); |
|
776 spacing -= add; |
|
777 x += add; |
|
778 } |
|
779 |
|
780 w->widget[i].left = x; |
|
781 x += (spacing != 0) ? button_width : (w->width - x) / (27 - i); |
|
782 w->widget[i].right = x - 1; |
|
783 } |
|
784 } break; |
|
785 |
|
786 case WE_TIMEOUT: |
|
787 for (uint i = 2; i < w->widget_count; i++) { |
|
788 if (w->IsWidgetLowered(i)) { |
|
789 w->RaiseWidget(i); |
|
790 w->InvalidateWidget(i); |
|
791 } |
|
792 } |
|
793 break; |
|
794 |
|
795 case WE_INVALIDATE_DATA: |
|
796 if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18); |
|
797 break; |
|
798 } |
|
799 } |
|
800 |
818 |
801 static const Widget _toolb_normal_widgets[] = { |
819 static const Widget _toolb_normal_widgets[] = { |
802 { WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, |
820 { WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, |
803 { WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, |
821 { WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, |
804 { WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, |
822 { WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, |
874 ToolbarMusicClick, |
892 ToolbarMusicClick, |
875 NULL, |
893 NULL, |
876 ToolbarHelpClick, |
894 ToolbarHelpClick, |
877 }; |
895 }; |
878 |
896 |
879 static void ScenEditToolbarWndProc(Window *w, WindowEvent *e) |
897 struct ScenarioEditorToolbarWindow : Window { |
880 { |
898 ScenarioEditorToolbarWindow(const WindowDesc *desc) : Window(desc) |
881 switch (e->event) { |
899 { |
882 case WE_PAINT: |
900 CLRBITS(this->flags4, WF_WHITE_BORDER_MASK); |
883 w->SetWidgetDisabledState(6, _patches_newgame.starting_year <= MIN_YEAR); |
901 |
884 w->SetWidgetDisabledState(7, _patches_newgame.starting_year >= MAX_YEAR); |
902 PositionMainToolbar(this); |
885 |
903 DoZoomInOutWindow(ZOOM_NONE, this); |
886 /* Draw brown-red toolbar bg. */ |
904 this->FindWindowPlacementAndResize(desc); |
887 GfxFillRect(0, 0, w->width - 1, w->height - 1, 0xB2); |
905 } |
888 GfxFillRect(0, 0, w->width - 1, w->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT)); |
906 |
889 |
907 virtual void OnPaint() |
890 w->DrawWidgets(); |
908 { |
891 |
909 this->SetWidgetDisabledState(6, _patches_newgame.starting_year <= MIN_YEAR); |
892 SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1)); |
910 this->SetWidgetDisabledState(7, _patches_newgame.starting_year >= MAX_YEAR); |
893 DrawStringCenteredTruncated(w->widget[6].right, w->widget[7].left, 6, STR_00AF, TC_FROMSTRING); |
911 |
894 |
912 /* Draw brown-red toolbar bg. */ |
895 /* We hide this panel when the toolbar space gets too small */ |
913 GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB2); |
896 if (w->widget[4].left != w->widget[4].right) { |
914 GfxFillRect(0, 0, this->width - 1, this->height - 1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT)); |
897 DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 1, STR_0221_OPENTTD, TC_FROMSTRING); |
915 |
898 DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING); |
916 this->DrawWidgets(); |
|
917 |
|
918 SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1)); |
|
919 DrawStringCenteredTruncated(this->widget[6].right, this->widget[7].left, 6, STR_00AF, TC_FROMSTRING); |
|
920 |
|
921 /* We hide this panel when the toolbar space gets too small */ |
|
922 if (this->widget[4].left != this->widget[4].right) { |
|
923 DrawStringCenteredTruncated(this->widget[4].left + 1, this->widget[4].right - 1, 1, STR_0221_OPENTTD, TC_FROMSTRING); |
|
924 DrawStringCenteredTruncated(this->widget[4].left + 1, this->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING); |
|
925 } |
|
926 } |
|
927 |
|
928 virtual void OnClick(Point pt, int widget) |
|
929 { |
|
930 if (_game_mode == GM_MENU) return; |
|
931 _scen_toolbar_button_procs[widget](this); |
|
932 } |
|
933 |
|
934 virtual EventState OnKeyPress(uint16 key, uint16 keycode) |
|
935 { |
|
936 switch (keycode) { |
|
937 case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(this); break; |
|
938 case WKC_F2: ShowGameOptions(); break; |
|
939 case WKC_F3: MenuClickSaveLoad(0); break; |
|
940 case WKC_F4: ToolbarScenGenLand(this); break; |
|
941 case WKC_F5: ToolbarScenGenTown(this); break; |
|
942 case WKC_F6: ToolbarScenGenIndustry(this); break; |
|
943 case WKC_F7: ToolbarScenBuildRoad(this); break; |
|
944 case WKC_F8: ToolbarScenPlantTrees(this); break; |
|
945 case WKC_F9: ToolbarScenPlaceSign(this); break; |
|
946 case WKC_F10: ShowMusicWindow(); break; |
|
947 case WKC_F11: PlaceLandBlockInfo(); break; |
|
948 case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break; |
|
949 case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break; |
|
950 |
|
951 /* those following are all fall through */ |
|
952 case WKC_NUM_PLUS: |
|
953 case WKC_EQUALS: |
|
954 case WKC_SHIFT | WKC_EQUALS: |
|
955 case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(this); break; |
|
956 |
|
957 /* those following are all fall through */ |
|
958 case WKC_NUM_MINUS: |
|
959 case WKC_MINUS: |
|
960 case WKC_SHIFT | WKC_MINUS: |
|
961 case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(this); break; |
|
962 |
|
963 case 'L': ShowEditorTerraformToolbar(); break; |
|
964 case 'M': ShowSmallMap(); break; |
|
965 case 'V': ShowExtraViewPortWindow(); break; |
|
966 default: return ES_NOT_HANDLED; |
|
967 } |
|
968 return ES_HANDLED; |
|
969 } |
|
970 |
|
971 virtual void OnPlaceObject(Point pt, TileIndex tile) |
|
972 { |
|
973 _place_proc(tile); |
|
974 } |
|
975 |
|
976 virtual void OnPlaceObjectAbort() |
|
977 { |
|
978 this->RaiseWidget(25); |
|
979 this->SetDirty(); |
|
980 } |
|
981 |
|
982 virtual void OnResize(Point new_size, Point delta) |
|
983 { |
|
984 /* There are 15 buttons plus some spacings if the space allows it. |
|
985 * Furthermore there are two panels of which one is non - essential |
|
986 * and that one can be removed is the space is too small. */ |
|
987 uint buttons_width; |
|
988 uint spacing; |
|
989 |
|
990 static int normal_min_width = (15 * 22) + (2 * 130); |
|
991 static int one_less_panel_min_width = (15 * 22) + 130; |
|
992 |
|
993 if (this->width >= one_less_panel_min_width) { |
|
994 buttons_width = 15 * 22; |
|
995 spacing = this->width - ((this->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width); |
|
996 } else { |
|
997 buttons_width = this->width - 130; |
|
998 spacing = 0; |
|
999 } |
|
1000 uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 }; |
|
1001 |
|
1002 /* Yes, it defines about 27 widgets for this toolbar */ |
|
1003 for (uint i = 0, x = 0, j = 0, b = 0; i < 27; i++) { |
|
1004 switch (i) { |
|
1005 case 4: |
|
1006 this->widget[i].left = x; |
|
1007 if (this->width < normal_min_width) { |
|
1008 this->widget[i].right = x; |
|
1009 j++; |
|
1010 continue; |
|
1011 } |
|
1012 |
|
1013 x += 130; |
|
1014 this->widget[i].right = x - 1; |
|
1015 break; |
|
1016 |
|
1017 case 5: { |
|
1018 int offset = x - this->widget[i].left; |
|
1019 this->widget[i + 1].left += offset; |
|
1020 this->widget[i + 1].right += offset; |
|
1021 this->widget[i + 2].left += offset; |
|
1022 this->widget[i + 2].right += offset; |
|
1023 this->widget[i].left = x; |
|
1024 x += 130; |
|
1025 this->widget[i].right = x - 1; |
|
1026 i += 2; |
|
1027 } break; |
|
1028 |
|
1029 default: |
|
1030 if (this->widget[i].bottom == 0) continue; |
|
1031 |
|
1032 this->widget[i].left = x; |
|
1033 x += buttons_width / (15 - b); |
|
1034 this->widget[i].right = x - 1; |
|
1035 buttons_width -= buttons_width / (15 - b); |
|
1036 b++; |
|
1037 break; |
899 } |
1038 } |
900 |
1039 |
901 break; |
1040 if (extra_spacing_at[j] == i) { |
902 |
1041 j++; |
903 case WE_CLICK: |
1042 uint add = spacing / (lengthof(extra_spacing_at) - j); |
904 if (_game_mode == GM_MENU) return; |
1043 spacing -= add; |
905 _scen_toolbar_button_procs[e->we.click.widget](w); |
1044 x += add; |
906 break; |
|
907 |
|
908 case WE_KEYPRESS: |
|
909 switch (e->we.keypress.keycode) { |
|
910 case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break; |
|
911 case WKC_F2: ShowGameOptions(); break; |
|
912 case WKC_F3: MenuClickSaveLoad(0); break; |
|
913 case WKC_F4: ToolbarScenGenLand(w); break; |
|
914 case WKC_F5: ToolbarScenGenTown(w); break; |
|
915 case WKC_F6: ToolbarScenGenIndustry(w); break; |
|
916 case WKC_F7: ToolbarScenBuildRoad(w); break; |
|
917 case WKC_F8: ToolbarScenPlantTrees(w); break; |
|
918 case WKC_F9: ToolbarScenPlaceSign(w); break; |
|
919 case WKC_F10: ShowMusicWindow(); break; |
|
920 case WKC_F11: PlaceLandBlockInfo(); break; |
|
921 case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break; |
|
922 case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break; |
|
923 |
|
924 /* those following are all fall through */ |
|
925 case WKC_NUM_PLUS: |
|
926 case WKC_EQUALS: |
|
927 case WKC_SHIFT | WKC_EQUALS: |
|
928 case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break; |
|
929 |
|
930 /* those following are all fall through */ |
|
931 case WKC_NUM_MINUS: |
|
932 case WKC_MINUS: |
|
933 case WKC_SHIFT | WKC_MINUS: |
|
934 case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break; |
|
935 |
|
936 case 'L': ShowEditorTerraformToolbar(); break; |
|
937 case 'M': ShowSmallMap(); break; |
|
938 case 'V': ShowExtraViewPortWindow(); break; |
|
939 default: return; |
|
940 } |
1045 } |
941 e->we.keypress.cont = false; |
1046 } |
942 break; |
1047 } |
943 |
1048 |
944 case WE_PLACE_OBJ: |
1049 virtual void OnTick() |
945 _place_proc(e->we.place.tile); |
1050 { |
946 break; |
1051 if (this->IsWidgetLowered(0) != !!_pause_game) { |
947 |
1052 this->ToggleWidgetLoweredState(0); |
948 case WE_ABORT_PLACE_OBJ: |
1053 this->SetDirty(); |
949 w->RaiseWidget(25); |
1054 } |
950 w->SetDirty(); |
1055 |
951 break; |
1056 if (this->IsWidgetLowered(1) != !!_fast_forward) { |
952 |
1057 this->ToggleWidgetLoweredState(1); |
953 case WE_RESIZE: { |
1058 this->SetDirty(); |
954 /* There are 15 buttons plus some spacings if the space allows it. |
1059 } |
955 * Furthermore there are two panels of which one is non - essential |
1060 } |
956 * and that one can be removed is the space is too small. */ |
1061 |
957 uint buttons_width; |
1062 virtual void OnInvalidateData(int data) |
958 uint spacing; |
1063 { |
959 |
1064 if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(this, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18); |
960 static int normal_min_width = (15 * 22) + (2 * 130); |
1065 } |
961 static int one_less_panel_min_width = (15 * 22) + 130; |
1066 }; |
962 |
|
963 if (w->width >= one_less_panel_min_width) { |
|
964 buttons_width = 15 * 22; |
|
965 spacing = w->width - ((w->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width); |
|
966 } else { |
|
967 buttons_width = w->width - 130; |
|
968 spacing = 0; |
|
969 } |
|
970 uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 }; |
|
971 |
|
972 /* Yes, it defines about 27 widgets for this toolbar */ |
|
973 for (uint i = 0, x = 0, j = 0, b = 0; i < 27; i++) { |
|
974 switch (i) { |
|
975 case 4: |
|
976 w->widget[i].left = x; |
|
977 if (w->width < normal_min_width) { |
|
978 w->widget[i].right = x; |
|
979 j++; |
|
980 continue; |
|
981 } |
|
982 |
|
983 x += 130; |
|
984 w->widget[i].right = x - 1; |
|
985 break; |
|
986 |
|
987 case 5: { |
|
988 int offset = x - w->widget[i].left; |
|
989 w->widget[i + 1].left += offset; |
|
990 w->widget[i + 1].right += offset; |
|
991 w->widget[i + 2].left += offset; |
|
992 w->widget[i + 2].right += offset; |
|
993 w->widget[i].left = x; |
|
994 x += 130; |
|
995 w->widget[i].right = x - 1; |
|
996 i += 2; |
|
997 } break; |
|
998 |
|
999 default: |
|
1000 if (w->widget[i].bottom == 0) continue; |
|
1001 |
|
1002 w->widget[i].left = x; |
|
1003 x += buttons_width / (15 - b); |
|
1004 w->widget[i].right = x - 1; |
|
1005 buttons_width -= buttons_width / (15 - b); |
|
1006 b++; |
|
1007 break; |
|
1008 } |
|
1009 |
|
1010 if (extra_spacing_at[j] == i) { |
|
1011 j++; |
|
1012 uint add = spacing / (lengthof(extra_spacing_at) - j); |
|
1013 spacing -= add; |
|
1014 x += add; |
|
1015 } |
|
1016 } |
|
1017 } break; |
|
1018 |
|
1019 case WE_TICK: |
|
1020 if (w->IsWidgetLowered(0) != !!_pause_game) { |
|
1021 w->ToggleWidgetLoweredState(0); |
|
1022 w->SetDirty(); |
|
1023 } |
|
1024 |
|
1025 if (w->IsWidgetLowered(1) != !!_fast_forward) { |
|
1026 w->ToggleWidgetLoweredState(1); |
|
1027 w->SetDirty(); |
|
1028 } |
|
1029 break; |
|
1030 |
|
1031 case WE_INVALIDATE_DATA: |
|
1032 HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 9, 10); |
|
1033 break; |
|
1034 } |
|
1035 } |
|
1036 |
1067 |
1037 static const Widget _toolb_scen_widgets[] = { |
1068 static const Widget _toolb_scen_widgets[] = { |
1038 { WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, |
1069 { WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME}, |
1039 { WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, |
1070 { WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD}, |
1040 { WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, |
1071 { WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS}, |