mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-31 14:02:59 +00:00 
			
		
		
		
	dialog:: more fixes
This commit is contained in:
		| @@ -2360,9 +2360,9 @@ EX void projectionDialog() { | ||||
|       dialog::add_action([] () { *dialog::get_ne().editwhat = -1; vpconf.scale = 1; dialog::get_ne().s = "-1"; }); | ||||
|       } | ||||
|     dialog::addItem(sphere ? "orthographic" : "Gans model", 'O'); | ||||
|     dialog::add_action([] () { vpconf.alpha = vpconf.scale = 999; dialog::get_ne().s = dialog::disp(vpconf.alpha); }); | ||||
|     dialog::add_action([] () { vpconf.alpha = vpconf.scale = 999; dialog::get_ne().reset_str(); }); | ||||
|     dialog::addItem(sphere ? "towards orthographic" : "towards Gans model", 'T'); | ||||
|     dialog::add_action([] () { double d = 1.1; vpconf.alpha *= d; vpconf.scale *= d; dialog::get_ne().s = dialog::disp(vpconf.alpha); }); | ||||
|     dialog::add_action([] () { double d = 1.1; vpconf.alpha *= d; vpconf.scale *= d; dialog::get_ne().reset_str(); }); | ||||
|     }; | ||||
|   } | ||||
|  | ||||
|   | ||||
							
								
								
									
										21
									
								
								dialogs.cpp
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								dialogs.cpp
									
									
									
									
									
								
							| @@ -48,7 +48,7 @@ EX namespace dialog { | ||||
|   const static scaler asinhic100 = {[] (ld x) { return asinh(x*100); }, [] (ld x) { return sinh(x)/100; }, false}; | ||||
|   | ||||
|   /** extendable dialog */ | ||||
|   struct extdialog { | ||||
|   struct extdialog : funbase { | ||||
|     string title, help; | ||||
|     int dialogflags; | ||||
|     reaction_t reaction; | ||||
| @@ -73,17 +73,19 @@ EX namespace dialog { | ||||
|     void draw() override; | ||||
|     void apply_edit(); | ||||
|     void apply_slider(); | ||||
|     string disp(ld x); | ||||
|     void reset_str() { s = disp(*editwhat); } | ||||
|     }; | ||||
| #endif | ||||
|  | ||||
|   EX number_dialog& get_ne() { | ||||
|     auto ptr = screens.back().target<number_dialog>(); | ||||
|     auto ptr = dynamic_cast<number_dialog*> (screens.back().target_base()); | ||||
|     if(!ptr) throw hr_exception("get_ne() called without number dialog"); | ||||
|     return *ptr; | ||||
|     } | ||||
|  | ||||
|   EX extdialog& get_di() { | ||||
|     auto ptr = screens.back().target<extdialog>(); | ||||
|     auto ptr = dynamic_cast<extdialog*> (screens.back().target_base()); | ||||
|     if(!ptr) throw hr_exception("get_di() called without extdialog"); | ||||
|     return *ptr; | ||||
|     } | ||||
| @@ -1167,10 +1169,9 @@ EX namespace dialog { | ||||
|     else return int(x-.5); | ||||
|     } | ||||
|    | ||||
|   EX string disp(ld x) {  | ||||
|     auto& ne = get_ne(); | ||||
|     if(ne.dialogflags & sm::HEXEDIT) return "0x" + itsh((unsigned long long)(x)); | ||||
|     if(ne.intval) return its(ldtoint(x)); | ||||
|   string number_dialog::disp(ld x) { | ||||
|     if(dialogflags & sm::HEXEDIT) return "0x" + itsh((unsigned long long)(x)); | ||||
|     if(intval) return its(ldtoint(x)); | ||||
|     return fts(x); | ||||
|     } | ||||
|  | ||||
| @@ -1179,7 +1180,7 @@ EX namespace dialog { | ||||
|     if(ne.intval) *ne.intval = ldtoint(*ne.editwhat); | ||||
|     if(ne.reaction) ne.reaction(); | ||||
|     if(ne.intval) *ne.editwhat = *ne.intval; | ||||
|     ne.s = disp(*ne.editwhat); | ||||
|     reset_str(); | ||||
|     #if CAP_ANIMATIONS | ||||
|     anims::deanimate(anims::find_param(ne.editwhat)); | ||||
|     #endif | ||||
| @@ -1188,7 +1189,7 @@ EX namespace dialog { | ||||
|   EX void use_hexeditor() { | ||||
|     auto& ne = get_ne(); | ||||
|     ne.dialogflags |= sm::HEXEDIT; | ||||
|     ne.s = disp(*ne.editwhat); | ||||
|     ne.reset_str(); | ||||
|     } | ||||
|    | ||||
|   void number_dialog::apply_edit() { | ||||
| @@ -1460,7 +1461,6 @@ EX namespace dialog { | ||||
|   EX void editNumber(ld& x, ld vmin, ld vmax, ld step, ld dft, string title, string help) { | ||||
|     number_dialog ne; | ||||
|     ne.editwhat = &x; | ||||
|     ne.s = disp(x); | ||||
|     ne.vmin = vmin; | ||||
|     ne.vmax = vmax; | ||||
|     ne.step = step; | ||||
| @@ -1473,6 +1473,7 @@ EX namespace dialog { | ||||
|     #if CAP_ANIMATIONS | ||||
|     anims::get_parameter_animation(anims::find_param(&x), ne.s); | ||||
|     #endif | ||||
|     ne.reset_str(); | ||||
|     pushScreen(ne); | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -8,11 +8,15 @@ namespace hr { | ||||
| template<class Sig> | ||||
| class function; | ||||
|  | ||||
| /* callable objects derived from funbase can be retrieved from hr::function using target_base */ | ||||
| struct funbase { virtual ~funbase() {} }; | ||||
|  | ||||
| template<class R, class... Args> | ||||
| struct function_state_base { | ||||
|     virtual R call(Args...) const = 0; | ||||
|     virtual function_state_base *clone() const = 0; | ||||
|     virtual ~function_state_base() {} | ||||
|     virtual funbase* as_funbase() = 0; | ||||
| }; | ||||
|  | ||||
| template<class T, class R, class... Args> | ||||
| @@ -25,6 +29,10 @@ struct function_state : function_state_base<R, Args...> { | ||||
|     function_state_base<R, Args...> *clone() const override { | ||||
|         return new function_state(*this); | ||||
|     } | ||||
|     virtual funbase* as_funbase() { | ||||
|       if(std::is_base_of<funbase, T>::value) return (funbase*) (&t_); | ||||
|       return nullptr; | ||||
|       } | ||||
| }; | ||||
|  | ||||
| template<class R, class... Args> | ||||
| @@ -65,6 +73,10 @@ public: | ||||
|       if(!ptr) return nullptr; | ||||
|       return &ptr->t_; | ||||
|       } | ||||
|  | ||||
|     struct funbase* target_base() { | ||||
|       return ptr_->as_funbase(); | ||||
|       } | ||||
| }; | ||||
|  | ||||
| } // namespace hr | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue