summaryrefslogtreecommitdiff
path: root/src/generic/apt/config_signal.cc
blob: 1febb548ba2b071728e932bb87125100fabbc23a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// config_signal.cc			-*-c++-*-
//
// Implementations and stuff for config_signal

#include "config_signal.h"

#include <sigc++/functors/mem_fun.h>
#include <apt-pkg/strutl.h>

signalling_config::signalling_config(Configuration *_user_config,
				     Configuration *_system_config,
				     Configuration *_theme_config)
  :user_config(_user_config), system_config(_system_config),
   theme_config(_theme_config)
{
  update_theme(system_config->Find(PACKAGE "::Theme", ""));

  this->connect(PACKAGE "::Theme", sigc::mem_fun(*this, &signalling_config::do_update_theme));
}

signalling_config::~signalling_config()
{
  for(connmap::iterator i=conn_table.begin();
      i!=conn_table.end();
      i++)
    delete i->second;
}

void signalling_config::do_update_theme()
{
  update_theme(system_config->Find(PACKAGE "::Theme", ""));
}

void signalling_config::update_theme(string newtheme)
{
  themeroot=newtheme;
  if(!themeroot.empty())
    themeroot=PACKAGE "::Themes::"+themeroot+"::";
}

void signalling_config::Set(string Name, string Value)
{
  user_config->Set(Name, Value);
  system_config->Set(Name, Value);

  connmap::iterator found=conn_table.find(Name);

  if(found!=conn_table.end())
    found->second->emit();
}

void signalling_config::Set(string Name, int Value)
{
  user_config->Set(Name.c_str(), Value);
  system_config->Set(Name.c_str(), Value);

  connmap::iterator found=conn_table.find(Name);

  if(found!=conn_table.end())
    found->second->emit();
}

void signalling_config::SetNoUser(string Name, string Value)
{
  system_config->Set(Name, Value);

  connmap::iterator found=conn_table.find(Name);

  if(found!=conn_table.end())
    found->second->emit();
}

void signalling_config::SetNoUser(string Name, int Value)
{
  system_config->Set(Name.c_str(), Value);

  connmap::iterator found=conn_table.find(Name);

  if(found!=conn_table.end())
    found->second->emit();
}

void signalling_config::connect(string name, const sigc::slot0<void> &slot)
{
  connmap::iterator found=conn_table.find(name);

  if(found!=conn_table.end())
    found->second->connect(slot);
  else
    {
      sigc::signal0<void> *sig=new sigc::signal0<void>;

      conn_table[name]=sig;
      sig->connect(slot);
    }
}

// right now, may emit too many signals..that's ok..?
void signalling_config::setcfg(Configuration *new_user_cfg,
			       Configuration *new_system_cfg,
			       Configuration *new_theme_cfg)
{
  Configuration *old_user_cfg=user_config;
  Configuration *old_system_cfg=system_config;
  Configuration *old_theme_cfg=theme_config;

  user_config=new_user_cfg;
  system_config=new_system_cfg;
  theme_config=new_theme_cfg;

  update_theme(system_config->Find(PACKAGE "::Theme", ""));

  for(connmap::iterator i=conn_table.begin();
      i!=conn_table.end();
      i++)
    if(Exists(i->first) ||
       old_user_cfg->Exists(i->first) ||
       old_system_cfg->Exists(i->first) ||
       (!themeroot.empty() && old_theme_cfg->Exists(i->first)))
      i->second->emit();
}

void signalling_config::Dump(ostream &out)
{
  user_config->Dump(out);
}