Ejemplo n.º 1
0
        internal void SetupControls()
        {
            float offset = 40f;

            // Title Bar
            m_title            = AddUIComponent <UITitleBar>();
            m_title.iconSprite = "InfoIconTrafficCongestion";
            m_title.title      = AVOMod.ModName + " " + AVOMod.Version;

            // Category DropDown
            UILabel label = AddUIComponent <UILabel>();

            label.textScale        = 0.8f;
            label.padding          = new RectOffset(0, 0, 8, 0);
            label.relativePosition = new Vector3(10f, offset);
            label.text             = Translations.Translate("AVO_MOD_MP56");

            m_category       = UIUtils.CreateDropDown(this);
            m_category.width = 175;

            for (int i = 0; i < categoryList.Length; i++)
            {
                m_category.AddItem(categoryList[i]);
            }

            m_category.selectedIndex    = 0;
            m_category.tooltip          = Translations.Translate("AVO_MOD_MP39");
            m_category.relativePosition = label.relativePosition + new Vector3(75f, 0f);

            m_category.eventSelectedIndexChanged += (c, t) =>
            {
                m_category.enabled = false;
                PopulateList();
                m_category.enabled = true;
            };

            // Search
            m_search                  = UIUtils.CreateTextField(this);
            m_search.width            = 145f;
            m_search.height           = 30f;
            m_search.padding          = new RectOffset(6, 6, 6, 6);
            m_search.tooltip          = Translations.Translate("AVO_MOD_MP40");
            m_search.relativePosition = new Vector3(WIDTHLEFT - m_search.width, offset);

            m_search.eventTextChanged += (c, t) => PopulateList();

            label                  = AddUIComponent <UILabel>();
            label.textScale        = 0.8f;
            label.padding          = new RectOffset(0, 0, 8, 0);
            label.relativePosition = m_search.relativePosition - new Vector3(60f, 0f);
            label.text             = Translations.Translate("AVO_MOD_MP55");

            // FastList
            m_fastList = UIFastList.Create <UIVehicleItem>(this);
            m_fastList.backgroundSprite = "UnlockingPanel";
            m_fastList.width            = WIDTHLEFT - 5;
            m_fastList.height           = height - offset - 110;
            m_fastList.canSelect        = true;
            m_fastList.relativePosition = new Vector3(5, offset + 35);

            // Configuration file buttons
            UILabel configLabel = this.AddUIComponent <UILabel>();

            configLabel.text             = Translations.Translate("AVO_MOD_MP41");
            configLabel.textScale        = 0.8f;
            configLabel.relativePosition = new Vector3(16, height - 65);

            m_import                  = UIUtils.CreateButton(this);
            m_import.text             = Translations.Translate("AVO_MOD_MP42");
            m_import.width            = 80;
            m_import.tooltip          = Translations.Translate("AVO_MOD_MP43");
            m_import.relativePosition = new Vector3(10, height - 45);

            m_export                  = UIUtils.CreateButton(this);
            m_export.text             = Translations.Translate("AVO_MOD_MP44");
            m_export.width            = 80;
            m_export.tooltip          = Translations.Translate("AVO_MOD_MP45");
            m_export.relativePosition = new Vector3(95, height - 45);

            m_resetall                  = UIUtils.CreateButton(this);
            m_resetall.text             = Translations.Translate("AVO_MOD_MP46");
            m_resetall.width            = 80;
            m_resetall.tooltip          = Translations.Translate("AVO_MOD_MP47");
            m_resetall.relativePosition = new Vector3(180, height - 45);

            m_autosave                  = AddUIComponent <UILabel>();
            m_autosave.textScale        = 0.6f;
            m_autosave.text             = Translations.Translate("AVO_MOD_MP48");
            m_autosave.relativePosition = new Vector3(275, height - 40);
            m_autosave.autoSize         = true;
            m_autosave.textAlignment    = UIHorizontalAlignment.Center;
            m_autosave.textColor        = Color.green;
            m_autosave.tooltip          = Translations.Translate("AVO_MOD_MP49");
            m_autosave.isVisible        = AdvancedVehicleOptions.AutoSaveVehicleConfig;

            // Preview
            UIPanel panel = AddUIComponent <UIPanel>();

            panel.backgroundSprite = "GenericPanel";
            panel.width            = WIDTHRIGHT - 10;
            panel.height           = HEIGHT - 420;
            panel.relativePosition = new Vector3(WIDTHLEFT + 5, offset);

            m_preview                  = panel.AddUIComponent <UITextureSprite>();
            m_preview.size             = panel.size;
            m_preview.relativePosition = Vector3.zero;

            m_previewRenderer      = gameObject.AddComponent <PreviewRenderer>();
            m_previewRenderer.size = m_preview.size * 2; // Twice the size for anti-aliasing

            m_preview.texture = m_previewRenderer.texture;

            // Follow a vehicle
            if (m_cameraController != null)
            {
                m_followVehicle                  = AddUIComponent <UISprite>();
                m_followVehicle.spriteName       = "LocationMarkerFocused";
                m_followVehicle.width            = m_followVehicle.spriteInfo.width;
                m_followVehicle.height           = m_followVehicle.spriteInfo.height;
                m_followVehicle.tooltip          = Translations.Translate("AVO_MOD_MP50");
                m_followVehicle.relativePosition = new Vector3(panel.relativePosition.x + panel.width - m_followVehicle.width - 5, panel.relativePosition.y + 5);

                m_followVehicle.eventClick += (c, p) => FollowNextVehicle();
            }

            //Remove the followed vehicle
            {
                m_removeVehicle = AddUIComponent <UISprite>();
                m_removeVehicle.Hide();
                m_removeVehicle.spriteName       = "IconPolicyOldTown";
                m_removeVehicle.width            = m_removeVehicle.spriteInfo.width - 12;
                m_removeVehicle.height           = m_removeVehicle.spriteInfo.height - 12;
                m_removeVehicle.tooltip          = Translations.Translate("AVO_MOD_MP51");
                m_removeVehicle.relativePosition = new Vector3(panel.relativePosition.x + panel.width - m_removeVehicle.width - 33, panel.relativePosition.y + 7);

                m_removeVehicle.eventClick += (c, p) => RemoveThisVehicle();
            }

            // Option panel
            m_optionPanel = AddUIComponent <UIOptionPanel>();
            m_optionPanel.relativePosition = new Vector3(WIDTHLEFT, height - 370);

            // Event handlers
            m_fastList.eventSelectedIndexChanged  += OnSelectedItemChanged;
            m_optionPanel.eventEnableCheckChanged += OnEnableStateChanged;

            m_import.eventClick += (c, t) =>
            {
                DefaultOptions.RestoreAll();
                AdvancedVehicleOptions.ImportVehicleDataConfig();
                optionList = AdvancedVehicleOptions.config.options;
            };

            m_export.eventClick += (c, t) => AdvancedVehicleOptions.ExportVehicleDataConfig(true);

            m_resetall.eventClick += (c, t) =>
            {
                ConfirmPanel.ShowModal(Translations.Translate("AVO_MOD_MP52"), Translations.Translate("AVO_MOD_MP53"), (comp, ret) =>
                {
                    if (ret != 1)
                    {
                        return;
                    }

                    DefaultOptions.RestoreAll();
                    AdvancedVehicleOptions.ResetVehicleDataConfig();
                    optionList = AdvancedVehicleOptions.config.options;

                    ExceptionPanel resetpanel = UIView.library.ShowModal <ExceptionPanel>("ExceptionPanel");
                    resetpanel.SetMessage("Advanced Vehicle Options", Translations.Translate("AVO_MOD_MP54"), false);
                });
            };

            panel.eventMouseDown += (c, p) =>
            {
                eventMouseMove += RotateCamera;
                if (m_optionPanel.m_options != null && m_optionPanel.m_options.useColorVariations)
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab, m_previewColor);
                }
                else
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab);
                }
            };

            panel.eventMouseUp += (c, p) =>
            {
                eventMouseMove -= RotateCamera;
                if (m_optionPanel.m_options != null && m_optionPanel.m_options.useColorVariations)
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab, m_previewColor);
                }
                else
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab);
                }
            };

            panel.eventMouseWheel += (c, p) =>
            {
                m_previewRenderer.zoom -= Mathf.Sign(p.wheelDelta) * 0.25f;
                if (m_optionPanel.m_options != null && m_optionPanel.m_options.useColorVariations)
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab, m_previewColor);
                }
                else
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab);
                }
            };
        }
Ejemplo n.º 2
0
        private void SetupControls()
        {
            float offset = 40f;

            // Title Bar
            m_title            = AddUIComponent <UITitleBar>();
            m_title.iconSprite = "IconAssetBuilding";
            m_title.title      = "Mesh Info " + MeshInfo.version;

            // Type DropDown
            UILabel label = AddUIComponent <UILabel>();

            label.textScale        = 0.8f;
            label.padding          = new RectOffset(0, 0, 8, 0);
            label.relativePosition = new Vector3(15f, offset + 5f);
            label.text             = "Type :";

            m_prefabType       = UIUtils.CreateDropDown(this);
            m_prefabType.width = 110;
            m_prefabType.AddItem("Building");
            m_prefabType.AddItem("Prop");
            m_prefabType.AddItem("Tree");
            m_prefabType.AddItem("Vehicle");
            m_prefabType.selectedIndex    = 0;
            m_prefabType.relativePosition = label.relativePosition + new Vector3(60f, 0f);

            m_prefabType.eventSelectedIndexChanged += (c, t) =>
            {
                m_prefabType.enabled = false;
                m_isSorted           = false;
                PopulateList();
                m_prefabType.enabled = true;
            };

            // Sorting DropDown
            label                  = AddUIComponent <UILabel>();
            label.textScale        = 0.8f;
            label.padding          = new RectOffset(0, 0, 8, 0);
            label.relativePosition = m_prefabType.relativePosition + new Vector3(130f, 0f);
            label.text             = "Sort by :";

            m_sorting       = UIUtils.CreateDropDown(this);
            m_sorting.width = 125;
            m_sorting.AddItem("Name");
            m_sorting.AddItem("Triangles");
            m_sorting.AddItem("LOD Triangles");
            m_sorting.AddItem("Weight");
            m_sorting.AddItem("LOD Weight");
            m_sorting.AddItem("Texture");
            m_sorting.AddItem("LOD Texture");
            m_sorting.selectedIndex    = 0;
            m_sorting.relativePosition = label.relativePosition + new Vector3(60f, 0f);

            m_sorting.eventSelectedIndexChanged += (c, t) =>
            {
                m_sorting.enabled = false;
                m_isSorted        = false;
                PopulateList();
                m_sorting.enabled = true;
            };

            // Sorting direction
            m_sortDirection                  = AddUIComponent <UISprite>();
            m_sortDirection.atlas            = UIUtils.GetAtlas("Ingame");
            m_sortDirection.spriteName       = "IconUpArrow";
            m_sortDirection.relativePosition = m_sorting.relativePosition + new Vector3(130f, 0f);

            m_sortDirection.eventClick += (c, t) =>
            {
                m_sortDirection.flip = (m_sortDirection.flip == UISpriteFlip.None) ? UISpriteFlip.FlipVertical : UISpriteFlip.None;
                m_isSorted           = false;
                PopulateList();
            };

            // Search
            m_search                  = UIUtils.CreateTextField(this);
            m_search.width            = 150f;
            m_search.height           = 30f;
            m_search.padding          = new RectOffset(6, 6, 6, 6);
            m_search.relativePosition = new Vector3(width - m_search.width - 15f, offset + 5f);

            label                  = AddUIComponent <UILabel>();
            label.textScale        = 0.8f;
            label.padding          = new RectOffset(0, 0, 8, 0);
            label.relativePosition = m_search.relativePosition - new Vector3(60f, 0f);
            label.text             = "Search :";


            m_search.eventTextChanged += (c, t) => PopulateList();

            // Labels
            label                  = AddUIComponent <UILabel>();
            label.textScale        = 0.9f;
            label.text             = "Name";
            label.relativePosition = new Vector3(15f, offset + 50f);

            label                  = AddUIComponent <UILabel>();
            label.textScale        = 0.9f;
            label.text             = "Texture";
            label.relativePosition = new Vector3(width - 135f, offset + 50f);

            UILabel label2 = AddUIComponent <UILabel>();

            label2.textScale        = 0.9f;
            label2.text             = "Weight";
            label2.relativePosition = label.relativePosition - new Vector3(125f, 0f);

            label                  = AddUIComponent <UILabel>();
            label.textScale        = 0.9f;
            label.text             = "Triangles";
            label.relativePosition = label2.relativePosition - new Vector3(115f, 0f);

            // Item List
            m_itemList                  = UIFastList.Create <UIPrefabItem>(this);
            m_itemList.rowHeight        = 40f;
            m_itemList.backgroundSprite = "UnlockingPanel";
            m_itemList.width            = width - 10;
            m_itemList.height           = height - offset - 75;
            m_itemList.relativePosition = new Vector3(5f, offset + 70f);
        }
Ejemplo n.º 3
0
        public override void Awake()
        {
            height = 46;

            focusButton                  = UIUtils.CreateButton(this);
            focusButton.name             = "CCX_FocusButton";
            focusButton.text             = "Point 0";
            focusButton.size             = new Vector2(70f, 30f);
            focusButton.relativePosition = new Vector3(8, 8);
            focusButton.tooltip          = "Click here to place the camera at this point";

            easingDropDown           = UIUtils.CreateDropDown(this);
            easingDropDown.name      = "CCX_EasingDropDown";
            easingDropDown.textScale = 0.9f;
            easingDropDown.AddItem("None");
            easingDropDown.AddItem("Auto");
            easingDropDown.AddItem("In");
            easingDropDown.AddItem("Out");
            easingDropDown.AddItem("InOut");
            easingDropDown.selectedValue        = "Auto";
            easingDropDown.size                 = new Vector2(80f, 30f);
            easingDropDown.textFieldPadding.top = 7;
            easingDropDown.relativePosition     = new Vector3(focusButton.relativePosition.x + focusButton.width + 8, 8);
            easingDropDown.tooltip              = "Camera movement easing";

            durationInput                  = UIUtils.CreateTextField(this);
            durationInput.name             = "CCX_DurationInput";
            durationInput.size             = new Vector2(40f, 26f);
            durationInput.numericalOnly    = true;
            durationInput.allowFloats      = true;
            durationInput.padding.top      = 6;
            durationInput.relativePosition = new Vector3(easingDropDown.relativePosition.x + easingDropDown.width + 8, 10);
            durationInput.tooltip          = "Duration in seconds";

            delayInput                  = UIUtils.CreateTextField(this);
            delayInput.name             = "CCX_DelayInput";
            delayInput.size             = new Vector2(45f, 26f);
            delayInput.numericalOnly    = true;
            delayInput.allowFloats      = true;
            delayInput.padding.top      = 6;
            delayInput.relativePosition = new Vector3(durationInput.relativePosition.x + durationInput.width + 8, 10);
            delayInput.tooltip          = "Delay in seconds";

            fovInput                  = UIUtils.CreateTextField(this);
            fovInput.name             = "CCX_DelayInput";
            fovInput.size             = new Vector2(45f, 26);
            fovInput.numericalOnly    = true;
            fovInput.allowFloats      = true;
            fovInput.padding.top      = 6;
            fovInput.relativePosition = new Vector3(delayInput.relativePosition.x + delayInput.width + 8, 10);
            fovInput.tooltip          = "Field of view in degrees";

            resetButton                  = UIUtils.CreateButton(this);
            resetButton.name             = "CCX_ResetButton";
            resetButton.text             = "O";
            resetButton.size             = new Vector2(45f, 30f);
            resetButton.relativePosition = new Vector3(fovInput.relativePosition.x + fovInput.width + 8, 8);
            resetButton.tooltip          = "Recapture the camera position";

            removeButton                  = UIUtils.CreateButton(this);
            removeButton.name             = "CCX_RemoveButton";
            removeButton.text             = "X";
            removeButton.size             = new Vector2(40f, 30f);
            removeButton.relativePosition = new Vector3(resetButton.relativePosition.x + resetButton.width + 8, 8);
            removeButton.tooltip          = "Remove this point";

            focusButton.eventClicked += (c, p) =>
            {
                CameraPath.SetCitiesCameraTransform(knot);
            };

            easingDropDown.eventSelectedIndexChanged += (c, p) =>
            {
                knot.mode = (EasingMode)p;
            };

            durationInput.eventTextSubmitted += (c, p) =>
            {
                float value;
                if (float.TryParse(p, out value) && value > 0)
                {
                    knot.duration = value;
                }

                durationInput.text = knot.duration.ToString();
            };

            durationInput.eventMouseWheel += (c, p) =>
            {
                float value;
                if (float.TryParse(durationInput.text, out value))
                {
                    knot.duration      = Mathf.Max(0, value + p.wheelDelta);
                    durationInput.text = knot.duration.ToString();
                }
                p.Use();
            };

            delayInput.eventTextSubmitted += (c, p) =>
            {
                float value;
                if (float.TryParse(p, out value))
                {
                    knot.delay = Mathf.Max(0, value);
                }

                delayInput.text = knot.delay.ToString();
            };

            delayInput.eventMouseWheel += (c, p) =>
            {
                float value;
                if (float.TryParse(delayInput.text, out value))
                {
                    knot.delay      = Mathf.Max(0, value + p.wheelDelta);
                    delayInput.text = knot.delay.ToString();
                }
                p.Use();
            };

            fovInput.eventTextSubmitted += (c, p) =>
            {
                float value;
                if (float.TryParse(p, out value))
                {
                    knot.fov = Mathf.Clamp(value, 20f, 179f) / 2f;
                }

                fovInput.text = (2f * knot.fov).ToString();
            };

            fovInput.eventMouseWheel += (c, p) =>
            {
                float value;
                if (float.TryParse(fovInput.text, out value))
                {
                    knot.fov      = Mathf.Clamp(value + p.wheelDelta, 20f, 179f) / 2f;
                    fovInput.text = (2f * knot.fov).ToString();
                }
                p.Use();
            };

            resetButton.eventClicked += (c, p) =>
            {
                knot.CaptureCamera();
                fovInput.text = (2f * knot.fov).ToString();
            };

            removeButton.eventClicked += (c, p) =>
            {
                CameraDirector.cameraPath.knots.RemoveAt(index);
                CameraDirector.mainWindow.RefreshKnotList();
            };
        }
Ejemplo n.º 4
0
        /*public override void OnDestroy()
         * {
         *  base.OnDestroy();
         *
         *  DebugUtils.Log("Destroying UIMainPanel");
         *
         *  if (m_button != null) GameObject.Destroy(m_button.gameObject);
         *  GameObject.Destroy(m_optionPanel.gameObject);
         * }*/

        private void SetupControls()
        {
            float offset = 40f;

            // Title Bar
            m_title            = AddUIComponent <UITitleBar>();
            m_title.iconSprite = "InfoIconTrafficCongestion";
            m_title.title      = "Advanced Vehicle Options " + ModInfo.version;

            // Category DropDown
            UILabel label = AddUIComponent <UILabel>();

            label.textScale        = 0.8f;
            label.padding          = new RectOffset(0, 0, 8, 0);
            label.relativePosition = new Vector3(10f, offset);
            label.text             = "Category :";

            m_category       = UIUtils.CreateDropDown(this);
            m_category.width = 150;

            for (int i = 0; i < categoryList.Length; i++)
            {
                m_category.AddItem(categoryList[i]);
            }

            m_category.selectedIndex    = 0;
            m_category.tooltip          = "Select a category to display\nTip: Use the mouse wheel to switch between categories faster";
            m_category.relativePosition = label.relativePosition + new Vector3(75f, 0f);

            m_category.eventSelectedIndexChanged += (c, t) =>
            {
                m_category.enabled = false;
                PopulateList();
                m_category.enabled = true;
            };

            // Search
            m_search                  = UIUtils.CreateTextField(this);
            m_search.width            = 145f;
            m_search.height           = 30f;
            m_search.padding          = new RectOffset(6, 6, 6, 6);
            m_search.tooltip          = "Type the name of a vehicle type";
            m_search.relativePosition = new Vector3(WIDTHLEFT - m_search.width, offset);

            m_search.eventTextChanged += (c, t) => PopulateList();

            label                  = AddUIComponent <UILabel>();
            label.textScale        = 0.8f;
            label.padding          = new RectOffset(0, 0, 8, 0);
            label.relativePosition = m_search.relativePosition - new Vector3(60f, 0f);
            label.text             = "Search :";

            // FastList
            m_fastList = UIFastList.Create <UIVehicleItem>(this);
            m_fastList.backgroundSprite = "UnlockingPanel";
            m_fastList.width            = WIDTHLEFT - 5;
            m_fastList.height           = height - offset - 110;
            m_fastList.canSelect        = true;
            m_fastList.relativePosition = new Vector3(5, offset + 35);

            // Configuration file buttons
            UILabel configLabel = this.AddUIComponent <UILabel>();

            configLabel.text             = "Configuration file:";
            configLabel.textScale        = 0.8f;
            configLabel.relativePosition = new Vector3(10, height - 60);

            m_import                  = UIUtils.CreateButton(this);
            m_import.text             = "Import";
            m_import.tooltip          = "Import the configuration";
            m_import.relativePosition = new Vector3(10, height - 40);

            m_export                  = UIUtils.CreateButton(this);
            m_export.text             = "Export";
            m_export.tooltip          = "Export the configuration";
            m_export.relativePosition = new Vector3(105, height - 40);

            // Preview
            UIPanel panel = AddUIComponent <UIPanel>();

            panel.backgroundSprite = "GenericPanel";
            panel.width            = WIDTHRIGHT - 10;
            panel.height           = HEIGHT - 420;
            panel.relativePosition = new Vector3(WIDTHLEFT + 5, offset);

            m_preview                  = panel.AddUIComponent <UITextureSprite>();
            m_preview.size             = panel.size;
            m_preview.relativePosition = Vector3.zero;

            m_previewRenderer      = gameObject.AddComponent <PreviewRenderer>();
            m_previewRenderer.size = m_preview.size * 2; // Twice the size for anti-aliasing

            m_preview.texture = m_previewRenderer.texture;

            // Follow
            if (m_cameraController != null)
            {
                m_followVehicle                  = AddUIComponent <UISprite>();
                m_followVehicle.spriteName       = "LocationMarkerFocused";
                m_followVehicle.width            = m_followVehicle.spriteInfo.width;
                m_followVehicle.height           = m_followVehicle.spriteInfo.height;
                m_followVehicle.tooltip          = "Click here to cycle through the existing vehicles of that type";
                m_followVehicle.relativePosition = new Vector3(panel.relativePosition.x + panel.width - m_followVehicle.width - 5, panel.relativePosition.y + 5);

                m_followVehicle.eventClick += (c, p) => FollowNextVehicle();
            }

            // Option panel
            m_optionPanel = AddUIComponent <UIOptionPanel>();
            m_optionPanel.relativePosition = new Vector3(WIDTHLEFT, height - 370);

            // Event handlers
            m_fastList.eventSelectedIndexChanged  += OnSelectedItemChanged;
            m_optionPanel.eventEnableCheckChanged += OnEnableStateChanged;
            m_import.eventClick += (c, t) =>
            {
                DefaultOptions.RestoreAll();
                AdvancedVehicleOptions.ImportConfig();
                optionList = AdvancedVehicleOptions.config.options;
            };
            m_export.eventClick += (c, t) => AdvancedVehicleOptions.ExportConfig();

            panel.eventMouseDown += (c, p) =>
            {
                eventMouseMove += RotateCamera;
                if (m_optionPanel.m_options != null && m_optionPanel.m_options.useColorVariations)
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab, m_previewColor);
                }
                else
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab);
                }
            };

            panel.eventMouseUp += (c, p) =>
            {
                eventMouseMove -= RotateCamera;
                if (m_optionPanel.m_options != null && m_optionPanel.m_options.useColorVariations)
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab, m_previewColor);
                }
                else
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab);
                }
            };

            panel.eventMouseWheel += (c, p) =>
            {
                m_previewRenderer.zoom -= Mathf.Sign(p.wheelDelta) * 0.25f;
                if (m_optionPanel.m_options != null && m_optionPanel.m_options.useColorVariations)
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab, m_previewColor);
                }
                else
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab);
                }
            };
        }
        private void SetupControls()
        {
            float offset = 40f;

            //Beta Testing Timestamp
            //DateTime now = DateTime.Now;
            //m_title.title = "Advanced Vehicle Options " + ModInfo.version + " " + now;

            // Title Bar
            m_title            = AddUIComponent <UITitleBar>();
            m_title.iconSprite = "InfoIconTrafficCongestion";
            m_title.title      = "Advanced Vehicle Options " + ModInfo.version;

            // Category DropDown
            UILabel label = AddUIComponent <UILabel>();

            label.textScale        = 0.8f;
            label.padding          = new RectOffset(0, 0, 8, 0);
            label.relativePosition = new Vector3(10f, offset);
            label.text             = "Category :";

            m_category       = UIUtils.CreateDropDown(this);
            m_category.width = 175;

            for (int i = 0; i < categoryList.Length; i++)
            {
                m_category.AddItem(categoryList[i]);
            }

            m_category.selectedIndex    = 0;
            m_category.tooltip          = "Select a category to display\nTip: Use the mouse wheel to switch between categories faster";
            m_category.relativePosition = label.relativePosition + new Vector3(75f, 0f);

            m_category.eventSelectedIndexChanged += (c, t) =>
            {
                m_category.enabled = false;
                PopulateList();
                m_category.enabled = true;
            };

            // Search
            m_search                  = UIUtils.CreateTextField(this);
            m_search.width            = 145f;
            m_search.height           = 30f;
            m_search.padding          = new RectOffset(6, 6, 6, 6);
            m_search.tooltip          = "Type the name of a vehicle type";
            m_search.relativePosition = new Vector3(WIDTHLEFT - m_search.width, offset);

            m_search.eventTextChanged += (c, t) => PopulateList();

            label                  = AddUIComponent <UILabel>();
            label.textScale        = 0.8f;
            label.padding          = new RectOffset(0, 0, 8, 0);
            label.relativePosition = m_search.relativePosition - new Vector3(60f, 0f);
            label.text             = "Search :";

            // FastList
            m_fastList = UIFastList.Create <UIVehicleItem>(this);
            m_fastList.backgroundSprite = "UnlockingPanel";
            m_fastList.width            = WIDTHLEFT - 5;
            m_fastList.height           = height - offset - 110;
            m_fastList.canSelect        = true;
            m_fastList.relativePosition = new Vector3(5, offset + 35);

            // Configuration file buttons
            UILabel configLabel = this.AddUIComponent <UILabel>();

            configLabel.text             = "Actions for Vehicle Configuration:";
            configLabel.textScale        = 0.8f;
            configLabel.relativePosition = new Vector3(16, height - 65);

            m_import                  = UIUtils.CreateButton(this);
            m_import.text             = "Import";
            m_import.width            = 80;
            m_import.tooltip          = "Import the configuration";
            m_import.relativePosition = new Vector3(10, height - 45);

            m_export                  = UIUtils.CreateButton(this);
            m_export.text             = "Export";
            m_export.width            = 80;
            m_export.tooltip          = "Export the configuration";
            m_export.relativePosition = new Vector3(95, height - 45);

            m_resetall                  = UIUtils.CreateButton(this);
            m_resetall.text             = "Reset all";
            m_resetall.width            = 80;
            m_resetall.tooltip          = "Reset full configuration";
            m_resetall.relativePosition = new Vector3(180, height - 45);

            // Preview
            UIPanel panel = AddUIComponent <UIPanel>();

            panel.backgroundSprite = "GenericPanel";
            panel.width            = WIDTHRIGHT - 10;
            panel.height           = HEIGHT - 420;
            panel.relativePosition = new Vector3(WIDTHLEFT + 5, offset);

            m_preview                  = panel.AddUIComponent <UITextureSprite>();
            m_preview.size             = panel.size;
            m_preview.relativePosition = Vector3.zero;

            m_previewRenderer      = gameObject.AddComponent <PreviewRenderer>();
            m_previewRenderer.size = m_preview.size * 2; // Twice the size for anti-aliasing

            m_preview.texture = m_previewRenderer.texture;

            // Follow a vehicle
            if (m_cameraController != null)
            {
                m_followVehicle                  = AddUIComponent <UISprite>();
                m_followVehicle.spriteName       = "LocationMarkerFocused";
                m_followVehicle.width            = m_followVehicle.spriteInfo.width;
                m_followVehicle.height           = m_followVehicle.spriteInfo.height;
                m_followVehicle.tooltip          = "Click here to cycle through the existing vehicles of that type.\nHold Shift Key down for zooming directly to vehicle.";
                m_followVehicle.relativePosition = new Vector3(panel.relativePosition.x + panel.width - m_followVehicle.width - 5, panel.relativePosition.y + 5);

                m_followVehicle.eventClick += (c, p) => FollowNextVehicle();
            }

            //Remove the followed vehicle
            {
                m_removeVehicle = AddUIComponent <UISprite>();
                m_removeVehicle.Hide();
                m_removeVehicle.spriteName       = "IconPolicyOldTown";
                m_removeVehicle.width            = m_removeVehicle.spriteInfo.width - 12;
                m_removeVehicle.height           = m_removeVehicle.spriteInfo.height - 12;
                m_removeVehicle.tooltip          = "Click here to remove the selected vehicle.";
                m_removeVehicle.relativePosition = new Vector3(panel.relativePosition.x + panel.width - m_removeVehicle.width - 33, panel.relativePosition.y + 7);

                m_removeVehicle.eventClick += (c, p) => RemoveThisVehicle();
            }

            // Option panel
            m_optionPanel = AddUIComponent <UIOptionPanel>();
            m_optionPanel.relativePosition = new Vector3(WIDTHLEFT, height - 370);

            // Event handlers
            m_fastList.eventSelectedIndexChanged  += OnSelectedItemChanged;
            m_optionPanel.eventEnableCheckChanged += OnEnableStateChanged;
            m_import.eventClick += (c, t) =>
            {
                DefaultOptions.RestoreAll();
                AdvancedVehicleOptionsUID.ImportConfig();
                optionList = AdvancedVehicleOptionsUID.config.options;
            };
            m_export.eventClick += (c, t) => AdvancedVehicleOptionsUID.ExportConfig();

            m_resetall.eventClick += (c, t) =>
            {
                ConfirmPanel.ShowModal("Confirm Reset Configuration", "Customized settings for all vehicles will be reset.\n\n" +
                                       "Proceed with Configuration reset ?", (comp, ret) =>
                {
                    if (ret != 1)
                    {
                        return;
                    }

                    DefaultOptions.RestoreAll();
                    AdvancedVehicleOptionsUID.ResetConfig();
                    optionList = AdvancedVehicleOptionsUID.config.options;

                    ExceptionPanel resetpanel = UIView.library.ShowModal <ExceptionPanel>("ExceptionPanel");
                    resetpanel.SetMessage("Advanced Vehicle Options", "All vehicle configuration and customized settings\n" +
                                          "have been reset to the Game Defaults.", false);
                });
            };

            panel.eventMouseDown += (c, p) =>
            {
                eventMouseMove += RotateCamera;
                if (m_optionPanel.m_options != null && m_optionPanel.m_options.useColorVariations)
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab, m_previewColor);
                }
                else
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab);
                }
            };

            panel.eventMouseUp += (c, p) =>
            {
                eventMouseMove -= RotateCamera;
                if (m_optionPanel.m_options != null && m_optionPanel.m_options.useColorVariations)
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab, m_previewColor);
                }
                else
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab);
                }
            };

            panel.eventMouseWheel += (c, p) =>
            {
                m_previewRenderer.zoom -= Mathf.Sign(p.wheelDelta) * 0.25f;
                if (m_optionPanel.m_options != null && m_optionPanel.m_options.useColorVariations)
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab, m_previewColor);
                }
                else
                {
                    m_previewRenderer.RenderVehicle(m_optionPanel.m_options.prefab);
                }
            };
        }
        public override void Start()
        {
            name             = "CCX_MainWindow";
            atlas            = UIUtils.GetAtlas("Ingame");
            backgroundSprite = "SubcategoriesPanel";
            size             = new Vector2(465, 180);
            isVisible        = false;

            UIDragHandle dragHandle = AddUIComponent <UIDragHandle>();

            dragHandle.target           = parent;
            dragHandle.relativePosition = Vector3.zero;

            UIButton close = AddUIComponent <UIButton>();

            close.size             = new Vector2(30f, 30f);
            close.text             = "X";
            close.textScale        = 0.9f;
            close.textColor        = new Color32(118, 123, 123, 255);
            close.focusedTextColor = new Color32(118, 123, 123, 255);
            close.hoveredTextColor = new Color32(140, 142, 142, 255);
            close.pressedTextColor = new Color32(99, 102, 102, 102);
            close.textPadding      = new RectOffset(8, 8, 8, 8);
            close.canFocus         = false;
            close.playAudioEvents  = true;
            close.relativePosition = new Vector3(width - close.width, 0);

            close.eventClicked += (c, p) =>
            {
                if (isVisible)
                {
                    CameraDirector.ToggleUI();
                }
            };

            // Control panel
            UILabel label = AddUIComponent <UILabel>();

            label.textScale        = 0.9f;
            label.text             = "Cinematic Camera Extended";
            label.relativePosition = new Vector2(8, 8);
            label.SendToBack();

            UIPanel controlPanel = AddUIComponent <UIPanel>();

            controlPanel.atlas            = atlas;
            controlPanel.backgroundSprite = "GenericPanel";
            controlPanel.color            = new Color32(206, 206, 206, 255);
            controlPanel.size             = new Vector2(width - 16, 46);
            controlPanel.relativePosition = new Vector2(8, 28);

            addKnotButton                  = UIUtils.CreateButton(controlPanel);
            addKnotButton.name             = "CCX_AddKnot";
            addKnotButton.textScale        = 1.5f;
            addKnotButton.text             = "+";
            addKnotButton.size             = new Vector2(40f, 30f);
            addKnotButton.relativePosition = new Vector3(8, 8);
            addKnotButton.tooltip          = "Add a new point to the path";

            playButton                  = UIUtils.CreateButton(controlPanel);
            playButton.name             = "CCX_Play";
            playButton.textScale        = 1.5f;
            playButton.text             = ">";
            playButton.size             = new Vector2(40f, 30f);
            playButton.playAudioEvents  = false;
            playButton.relativePosition = new Vector3(controlPanel.width - playButton.width - 8, 8);
            playButton.tooltip          = "Play the current path";

            playSpeedDropDown       = UIUtils.CreateDropDown(controlPanel);
            playSpeedDropDown.width = 75;
            playSpeedDropDown.items = new string[]
            {
                "x 1/16",
                "x 1/8",
                "x 1/4",
                "x 1/2",
                "x 1",
                "x 2",
                "x 4",
                "x 8",
                "x 16"
            };
            playSpeedDropDown.selectedValue    = "x 1";
            playSpeedDropDown.relativePosition = new Vector3(playButton.relativePosition.x - playSpeedDropDown.width - 8, 8);
            playSpeedDropDown.tooltip          = "Playback speed";

            timelineSlider                  = controlPanel.AddUIComponent <UISlider>();
            timelineSlider.name             = "CCX_TimelineSlider";
            timelineSlider.size             = new Vector2(playSpeedDropDown.relativePosition.x - addKnotButton.relativePosition.x - addKnotButton.width - 20, 18);
            timelineSlider.relativePosition = new Vector2(addKnotButton.relativePosition.x + addKnotButton.width + 10, 14);

            UISlicedSprite bgSlider = timelineSlider.AddUIComponent <UISlicedSprite>();

            bgSlider.atlas            = atlas;
            bgSlider.spriteName       = "BudgetSlider";
            bgSlider.size             = new Vector2(timelineSlider.width, 9);
            bgSlider.relativePosition = new Vector2(0, 4);
            bgSlider.tooltip          = "Drag the slider to preview the animation";

            UISlicedSprite thumb = timelineSlider.AddUIComponent <UISlicedSprite>();

            thumb.atlas                = atlas;
            thumb.spriteName           = "SliderBudget";
            timelineSlider.thumbObject = thumb;

            timelineSlider.minValue = 0f;
            timelineSlider.maxValue = 1f;
            timelineSlider.stepSize = 0;
            timelineSlider.value    = 0;

            // FOV panel
            UIPanel fovPanel = AddUIComponent <UIPanel>();

            fovPanel.atlas            = atlas;
            fovPanel.backgroundSprite = "GenericPanel";
            fovPanel.color            = new Color32(206, 206, 206, 255);
            fovPanel.size             = new Vector2(width - 120 - 8 * 3, 46);
            fovPanel.relativePosition = new Vector2(8, controlPanel.relativePosition.y + controlPanel.height + 8);

            label                   = fovPanel.AddUIComponent <UILabel>();
            label.textScale         = 0.9f;
            label.text              = "Fov:";
            label.autoSize          = false;
            label.height            = 30;
            label.verticalAlignment = UIVerticalAlignment.Middle;
            label.relativePosition  = new Vector2(8, 8);

            fovInput                  = UIUtils.CreateTextField(fovPanel);
            fovInput.name             = "CCX_MainFovInput";
            fovInput.size             = new Vector2(45f, 26);
            fovInput.text             = (2f * CameraDirector.camera.fieldOfView).ToString();
            fovInput.numericalOnly    = true;
            fovInput.allowFloats      = true;
            fovInput.padding.top      = 6;
            fovInput.relativePosition = new Vector3(fovPanel.width - fovInput.width - 8, 10);
            fovInput.tooltip          = "Field of view in degrees";

            fovSlider                  = fovPanel.AddUIComponent <UISlider>();
            fovSlider.name             = "CCX_TimelineSlider";
            fovSlider.size             = new Vector2(fovInput.relativePosition.x - label.relativePosition.x - label.width - 20, 18);
            fovSlider.relativePosition = new Vector2(label.relativePosition.x + label.width + 10, 14);

            bgSlider                  = fovSlider.AddUIComponent <UISlicedSprite>();
            bgSlider.atlas            = atlas;
            bgSlider.spriteName       = "BudgetSlider";
            bgSlider.size             = new Vector2(fovSlider.width, 9);
            bgSlider.relativePosition = new Vector2(0, 4);
            bgSlider.tooltip          = "Drag the slider to change the field of view";

            thumb                 = fovSlider.AddUIComponent <UISlicedSprite>();
            thumb.atlas           = atlas;
            thumb.spriteName      = "SliderBudget";
            fovSlider.thumbObject = thumb;

            fovSlider.minValue = 20f;
            fovSlider.maxValue = 179f;
            fovSlider.stepSize = 1f;
            fovSlider.value    = CameraDirector.camera.fieldOfView * 2f;

            // FPS panel
            UIPanel fpsPanel = AddUIComponent <UIPanel>();

            fpsPanel.atlas            = atlas;
            fpsPanel.backgroundSprite = "GenericPanel";
            fpsPanel.color            = new Color32(206, 206, 206, 255);
            fpsPanel.size             = new Vector2(120, 46);
            fpsPanel.relativePosition = new Vector2(fovPanel.relativePosition.x + fovPanel.width + 8, fovPanel.relativePosition.y);

            fpsInput                  = UIUtils.CreateTextField(fpsPanel);
            fpsInput.name             = "CCX_FpsInput";
            fpsInput.size             = new Vector2(45f, 26);
            fpsInput.text             = CameraDirector.fps.ToString();
            fpsInput.numericalOnly    = true;
            fpsInput.allowFloats      = true;
            fpsInput.padding.top      = 6;
            fpsInput.relativePosition = new Vector3(fpsPanel.width - fpsInput.width - 8, 10);
            fpsInput.tooltip          = "Fps";
            fpsInput.tooltip          = "Sync the camera and the simulation at a set frame rate";

            fpsCheckBox                  = UIUtils.CreateCheckBox(fpsPanel);
            fpsCheckBox.text             = "Fps:";
            fpsCheckBox.isChecked        = false;
            fpsCheckBox.width            = fpsPanel.width - fpsInput.width - 24;
            fpsCheckBox.relativePosition = new Vector2(8, 16);
            fpsCheckBox.tooltip          = "Sync the camera and the simulation at a set frame rate";

            // Hide UI checkbox
            hideUICheckBox                  = UIUtils.CreateCheckBox(this);
            hideUICheckBox.name             = "CCX_HideUICheckBox";
            hideUICheckBox.text             = "Hide UI during playback";
            hideUICheckBox.isChecked        = true;
            hideUICheckBox.width            = width - 16;
            hideUICheckBox.relativePosition = new Vector2(8, fovPanel.relativePosition.y + fovPanel.height + 8);

            // Start simulation checkbox
            startSimCheckBox                  = UIUtils.CreateCheckBox(this);
            startSimCheckBox.name             = "CCX_StartSimCheckBox";
            startSimCheckBox.text             = "Unpause simulation";
            startSimCheckBox.isChecked        = false;
            startSimCheckBox.width            = (width - 16) / 2;
            startSimCheckBox.relativePosition = new Vector2(8, hideUICheckBox.relativePosition.y + hideUICheckBox.height + 8);

            // FastList
            fastList = UIFastList.Create <UIKnotsListRow>(this);
            fastList.backgroundSprite = "UnlockingPanel";
            fastList.width            = width - 16;
            fastList.height           = 46 * 5;
            fastList.canSelect        = true;
            fastList.relativePosition = new Vector3(8, startSimCheckBox.relativePosition.y + startSimCheckBox.height + 8);

            fastList.rowHeight = 46f;
            fastList.rowsData  = CameraDirector.cameraPath.knots;

            // Load/Save
            saveLoadButton                  = UIUtils.CreateButton(this);
            saveLoadButton.name             = "CCX_SaveLoadButton";
            saveLoadButton.text             = "Save/Load";
            saveLoadButton.size             = new Vector2(100f, 30f);
            saveLoadButton.relativePosition = new Vector3(width - saveLoadButton.width - 8, fastList.relativePosition.y + fastList.height + 8);
            saveLoadButton.tooltip          = "Work in progress";

            height           = saveLoadButton.relativePosition.y + saveLoadButton.height + 8;
            dragHandle.size  = size;
            absolutePosition = new Vector3(savedWindowX.value, savedWindowY.value);
            MakePixelPerfect();

            addKnotButton.eventClicked += (c, p) =>
            {
                int i = CameraDirector.cameraPath.AddKnot();
                fastList.DisplayAt(i);

                timelineSlider.minValue = 0f;
                float duration = CameraDirector.cameraPath.CalculateTotalDuraction();
                if (duration <= 0f)
                {
                    duration = 1f;
                }
                timelineSlider.maxValue = duration;
            };

            playButton.eventClicked += (c, p) =>
            {
                CameraDirector.cameraPath.Play();
            };

            timelineSlider.eventMouseDown += (c, p) =>
            {
                CameraPath.currentTransfrom = new Knot();
            };

            timelineSlider.eventValueChanged += (c, p) =>
            {
                CameraDirector.cameraPath.SetToTime(p);
            };

            hideUICheckBox.eventCheckChanged += (c, p) =>
            {
                CameraDirector.freeCamera = p;
            };

            startSimCheckBox.eventCheckChanged += (c, p) =>
            {
                CameraDirector.startSimulation = p;
            };

            fovSlider.eventValueChanged += (c, p) =>
            {
                CameraDirector.camera.fieldOfView = p / 2f;
                fovInput.text = p.ToString();
            };

            fovInput.eventTextSubmitted += (c, p) =>
            {
                float value;
                if (float.TryParse(p, out value))
                {
                    CameraDirector.camera.fieldOfView = Mathf.Clamp(value, 20f, 179f) / 2f;

                    if (fovSlider.value != value)
                    {
                        fovSlider.value = value;
                    }
                }

                fovInput.text = (2f * CameraDirector.camera.fieldOfView).ToString();
            };

            fovInput.eventMouseWheel += (c, p) =>
            {
                if (!p.used)
                {
                    fovSlider.value += p.wheelDelta;
                    p.Use();
                }
            };

            fpsCheckBox.eventCheckChanged += (c, p) =>
            {
                CameraDirector.useFps = p;
            };

            fpsInput.eventTextSubmitted += (c, p) =>
            {
                float value;
                if (float.TryParse(p, out value))
                {
                    CameraDirector.fps = Mathf.Max(0, value);
                }

                fpsInput.text = CameraDirector.fps.ToString();
            };

            fpsInput.eventMouseWheel += (c, p) =>
            {
                if (!p.used)
                {
                    CameraDirector.fps = Mathf.Max(0, CameraDirector.fps + p.wheelDelta);
                    fpsInput.text      = CameraDirector.fps.ToString();
                    p.Use();
                }
            };

            saveLoadButton.eventClicked += (c, p) =>
            {
                if (saveLoadWindow == null)
                {
                    saveLoadWindow = (UISaveLoadWindow)GetUIView().AddUIComponent(typeof(UISaveLoadWindow));
                }
                else
                {
                    Destroy(saveLoadWindow);
                }
            };

            DebugUtils.Log("UIMainWindow created");
        }