Unity运行模式用GUILayout实现ComboBox

public class ComboBox
    {

        public int index;//索引
        public string weight="";//权重

        private int labelWidth = 60;//标题的宽

        public float Weight
        {
            get { return float.Parse(weight); }
        }
        /// <summary>
        /// 复选框的宽度
        /// </summary>
        public const int WIDTH = 150;
        /// <summary>
        /// 复选框的高度
        /// </summary>
        public const int Height = 20;
        /// <summary>
        /// Lable
        /// </summary>
        public string label = "";

        public int viewAreaHeight = 200;

        public ComboBox(Dictionary<object, object> dataSource,int viewHeight = 200)
        {
            if (dataSource == null)
            {
                dataSource = new Dictionary<object, object>();
                for (int i = 0; i < 50; i++)
                {
                    dataSource.Add(i, string.Format("<color=#ff0000ff>请初始化数据 {0}</color>" ,i));
                }
            }
            viewAreaHeight = viewHeight;
            this.Init(dataSource,1);
        }
        private Dictionary<object, object> dataSource;
        private object currentValue;
        private object currentDisplayText;
        private int currentIndex;

        private bool showList;
        private Vector2 scrollPosition;
        private float showListTime;
        private int guiDepth;
        private bool alreadyInitGuiDepth;
        /// <summary>
        /// 选择项更改事件参数
        /// </summary>
        public class SelectItemChangedArgs : EventArgs
        {
            private object itemValue;
            private object itemDisplayText;
            public object ItemValue
            {
                get
                {
                    return itemValue;
                }
            }
            public object ItemDisplayText
            {
                get
                {
                    return itemDisplayText;
                }
            }
            public SelectItemChangedArgs(object iValue, object iDisplayText)
            {
                itemValue = iValue;
                itemDisplayText = iDisplayText;
            }
        }
        /// <summary>
        /// 选择项更改事件
        /// </summary>
        public event EventHandler<SelectItemChangedArgs> OnSelectItemChanged;
        public object SelectValue
        {
            get { return currentValue; }
        }
        public object SelectDisplayText
        {
            get { return currentDisplayText; }
        }
        public float ShowListTime
        {
            get { return showListTime; }
        }
        /// <summary>
        /// 数据源
        /// </summary>
        public Dictionary<object, object> DataSource
        {
            set
            {
                dataSource = value;
                currentDisplayText = null;
                currentValue = null;
            }
            get
            {
                return dataSource;
            }
        }
        /// <summary>
        /// 初始化各项参数,控件应该只调用一次此方法,进行重置数据源直接使用DataSource属性即可
        /// </summary>
        /// <param name="data">
        /// A <see cref="Dictionary<System.Object, System.Object>"/>
        /// </param>
        /// <param name="depth">
        /// A <see cref="System.Int32"/>
        /// </param>
        public void Init(Dictionary<object, object> data, int depth)
        {
            dataSource = data;
            currentIndex = -1;
            //将控件置于当前GUI元素之上,并且只在第一次调用初始化方法设置GUI深度,防止循环中重复调用
            if (!alreadyInitGuiDepth)
            {
                //guiDepth = GUI.depth - 1;
                alreadyInitGuiDepth = true;
            }
            currentDisplayText = null;
            currentValue = null;
        }

        /// <summary>
        /// 强行设置下拉列表是否是示
        /// </summary>
        /// <param name="show">
        /// A <see cref="System.Boolean"/>
        /// </param>
        public void SetShowList(bool show)
        {
            if (showList)
            {
                showList = show;
            }
        }
        /// <summary>
        /// 绘制下拉列表框
        /// </summary>
        public void Draw()
        {
            if (dataSource == null)
            {
                return;
            }
            if (currentDisplayText == null || currentValue == null)
            {
                if (dataSource.Count > 0)
                {
                    currentDisplayText = dataSource.Values.First();
                    currentValue = dataSource.Keys.First();
                    currentIndex = 0;
                }
                else
                {
                    currentDisplayText = "无";
                    currentValue = -1;
                    currentIndex = -1;
                }
            }

            GUILayout.BeginVertical(GUILayout.Width(WIDTH));
            GUILayout.BeginHorizontal();

            int spaceW = labelWidth;
            if (label == null || label.Equals(""))
            {
                spaceW = 0;
            }
            GUILayout.Label(label, GUILayout.Width(spaceW));

            string buttonName = "";
            if(currentDisplayText == null)
            {
                buttonName = "无";
            }else if(currentDisplayText is monster_model)
            {
                buttonName = ((monster_model)currentDisplayText).name;
            }else if(currentDisplayText is string)
            {
                buttonName = currentDisplayText.ToString();
            }
            buttonName += (showList ? "   <color=#f27272FF>></color>" : "   <color=#f27272FF>V</color>");

            if (GUILayout.Button(buttonName,GUILayout.Width(WIDTH + 20)))
            {
                showList = !showList;
                if (showList)
                {
                    showListTime = Time.time;
                }
                else
                {
                    showListTime = 0f;
                }
            }
            GUILayout.EndHorizontal();
            this.DrawList();
            GUILayout.EndVertical();
        }
        /// <summary>
        /// 绘制列表项
        /// </summary>
        public void DrawList()
        {
            if (showList == true)
            {
                //为了留出最方下的横线,这里高度减1
                GUILayout.BeginHorizontal();
                int spaceW = labelWidth;
                if (label == null || label.Equals(""))
                {
                    spaceW = 0;
                }
                GUILayout.Label("", GUILayout.Width(spaceW));

                scrollPosition = Vector2.Lerp(scrollPosition, GUILayout.BeginScrollView(scrollPosition, true, true,GUILayout.Width(WIDTH+20),GUILayout.Height(this.viewAreaHeight)), 0.5f);

                for (int i = 0; i < dataSource.Count; i++)
                {
                    drawItem(i);
                }
                GUILayout.EndScrollView();
                GUILayout.EndHorizontal();
            }
        }
        /// <summary>
        /// 绘制内容项,并响应事件
        /// </summary>
        /// <param name="index">
        /// A <see cref="System.Int32"/>
        /// </param>
        private void drawItem(int index)
        {
            object value = dataSource.Values.ElementAt(index);
            string buttonName = value as string;
            if(value is monster_model)
            {
                buttonName = ((monster_model)value).name;
            }

            if (GUILayout.Button(buttonName,GUILayout.Width(WIDTH)))
            {
                if(value is monster_model)
                {
                    currentDisplayText = ((monster_model)value).name;
                    currentValue = dataSource.Keys.ElementAt(index);
                }
                else
                {
                    currentDisplayText = value;
                    currentValue = dataSource.Keys.ElementAt(index);
                }
                if (currentIndex != index)
                {
                    currentIndex = index;
                    if (OnSelectItemChanged != null)
                    {
                        if(value is monster_model)
                        {
                            OnSelectItemChanged(this, new SelectItemChangedArgs(currentValue, value));
                        }
                        else
                        {
                            OnSelectItemChanged(this, new SelectItemChangedArgs(currentValue, currentDisplayText));
                        }
                    }
                }
                showList = false;
            }
        }
        public void OnGUI()
        {
            GUI.depth = guiDepth;
            this.Draw();
        }
        /// <summary>
        /// 按时间比较各ComboBox控件的顺序,初衷是为了点击新的控件时,其它ComboBox控件下拉列表自动隐藏
        /// </summary>
        public class ShowListComparer : IComparer<ComboBox>
        {
            #region IComparer[ComboBox] implementation
            int IComparer<ComboBox>.Compare(ComboBox x, ComboBox y)
            {
                return x.showListTime.CompareTo(y.showListTime) * -1;
            }
            #endregion
        }
    }

先说明一下:这个功能是在一位大神的GUI的代码基础上修改的,这样就可以自动排版了,不过已经忘了是哪位了。

时间: 2024-11-03 21:02:10

Unity运行模式用GUILayout实现ComboBox的相关文章

PHP运行模式的深入理解

PHP运行模式有4钟:1)cgi 通用网关接口(Common Gateway Interface))2) fast-cgi 常驻 (long-live) 型的 CGI3) cli  命令行运行   (Command Line Interface)4)web模块模式 (apache等web服务器运行的模块模式)1.CGI(Common Gateway Interface)CGI即通用网关接口(Common Gateway Interface),它是一段程序, 通俗的讲CGI就象是一座桥,把网页和W

Hive基础之Hive体系架构&amp;运行模式&amp;Hive与关系型数据的区别

Hive架构 1)用户接口: CLI(hive shell):命令行工具:启动方式:hive 或者 hive --service cli ThriftServer:通过Thrift对外提供服务,默认端口是10000:启动方式:hive --service hiveserver WEBUI(浏览器访问hive):通过浏览器访问hive,默认端口是9999:启动方式:hive --service hwi 2)元数据存储(Metastore):启动方式:hive -service metastore

开启Tomcat APR运行模式,优化并发性能

Tomcat支持三种接收请求的处理方式:BIO.NIO.APR 1>.BIO模式:阻塞式I/O操作,表示Tomcat使用的是传统JavaI/O操作(即Java.io包及其子包).Tomcat7以下版本默认情况下是以bio模式运行的,由于每个请求都要创建一个线程来处理,线程开销较大,不能处理高并发的场景,在三种模式中性能也最低.启动tomcat看到如下日志,表示使用的是BIO模式:  2>.NIO模式:是javaSE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包).

apachectl -V查看运行模式(大写的V)

apachectl -l查看运行模式

Spark修炼之道(高级篇)——Spark源码阅读:第十节 Standalone运行模式解析

Spark Standalone采用的是Master/Slave架构,主要涉及到的类包括: 类:org.apache.spark.deploy.master.Master 说明:负责整个集群的资源调度及Application的管理. 消息类型: 接收Worker发送的消息 1. RegisterWorker 2. ExecutorStateChanged 3. WorkerSchedulerStateResponse 4. Heartbeat 向Worker发送的消息 1. Registered

Java魔法堂:JVM的运行模式 (转)

一.前言 JVM有Client和Server两种运行模式.不同的模式对应不同的应用场景,而JVM也会有相应的优化.本文将记录JVM模式的信息,以便日后查阅. 二.介绍 在$JAVA_HOME/jre/bin下有client目录,分别代表JVM的两种运行模式.   client运行模式,针对桌面应用,加载速度比server模式快10%,而运行速度为server模式的10分之一.client下默认的堆容量 -Xms1M -Xmx64M   server运行模式,针对服务器应用.server下默认的堆

Java魔法堂:JVM的运行模式

一.前言 JVM有Client和Server两种运行模式.不同的模式对应不同的应用场景,而JVM也会有相应的优化.本文将记录JVM模式的信息,以便日后查阅. 二.介绍 在$JAVA_HOME/jre/bin下有client和server两个目录,分别代表JVM的两种运行模式.  client运行模式,针对桌面应用,加载速度比server模式快10%,而运行速度为server模式的10分之一.client下默认的堆容量 -Xms1M -Xmx64M   server运行模式,针对服务器应用.ser

【Spark深入学习-11】Spark基本概念和运行模式

----本节内容------- 1.大数据基础 1.1大数据平台基本框架 1.2学习大数据的基础 1.3学习Spark的Hadoop基础 2.Hadoop生态基本介绍 2.1Hadoop生态组件介绍 2.2Hadoop计算框架介绍 3.Spark概述 3.1 Spark出现的技术背景 3.2 Spark核心概念介绍 4.Spark运行模式 4.1.Spark程序组成 4.2.Spark运行模式 5.参考资料 --------------------- 1.大数据基础 1.1 大数据平台基本框架

spark运行模式

Spark有以下四种运行模式: local:本地单进程模式,用于本地开发测试Spark代码; standalone:分布式集群模式,Master-Worker架构,Master负责调度,Worker负责具体Task的执行; on yarn/mesos:运行在yarn/mesos等资源管理框架之上,yarn/mesos提供资源管理,spark提供计算调度,并可与其他计算框架(如MapReduce/MPI/Storm)共同运行在同一个集群之上; on cloud(EC2):运行在AWS的EC2之上