00001 #include <iostream>
00002 using namespace std;
00003
00004 #include "mythuibutton.h"
00005 #include "mythmainwindow.h"
00006
00007 MythUIButton::MythUIButton(MythUIType *parent, const char *name, bool doInit)
00008 : MythUIType(parent, name)
00009 {
00010 m_State = None;
00011
00012 m_PaddingMargin = 0;
00013
00014 if (doInit)
00015 Init();
00016
00017 connect(this, SIGNAL(TakingFocus()), this, SLOT(Select()));
00018 connect(this, SIGNAL(LosingFocus()), this, SLOT(Deselect()));
00019
00020 SetCanTakeFocus(true);
00021 }
00022
00023 MythUIButton::~MythUIButton()
00024 {
00025 }
00026
00027 void MythUIButton::Init()
00028 {
00029 m_BackgroundImage = new MythUIStateType(this, "buttonback");
00030 m_CheckImage = new MythUIStateType(this, "buttoncheck");
00031 m_Text = new MythUIText(this, "buttontext");
00032 m_ButtonImage = new MythUIImage(this, "buttonimage");
00033 m_ArrowImage = new MythUIImage(this, "arrowimage");
00034
00035 m_CheckImage->SetVisible(false);
00036 m_ButtonImage->SetVisible(false);
00037 m_ArrowImage->SetVisible(false);
00038
00039 }
00040
00041 bool MythUIButton::ParseElement(QDomElement &element)
00042 {
00043 if (element.tagName() == "inactivefont")
00044 {
00045 QString fontname = getFirstText(element);
00046 MythFontProperties *fp = GetFont(fontname);
00047 if (!fp)
00048 fp = GetGlobalFontMap()->GetFont(fontname);
00049 if (fp)
00050 SetFont(Disabled, *fp);
00051 }
00052 else if (element.tagName() == "activefont")
00053 {
00054 QString fontname = getFirstText(element);
00055 MythFontProperties *fp = GetFont(fontname);
00056 if (!fp)
00057 fp = GetGlobalFontMap()->GetFont(fontname);
00058 if (fp)
00059 SetFont(Normal, *fp);
00060 }
00061 else if (element.tagName() == "value")
00062 {
00063 QString msg = getFirstText(element);
00064 m_Text->SetText(msg);
00065 }
00066 else if (element.tagName() == "showarrow")
00067 {
00068 EnableRightArrow(parseBool(element));
00069 }
00070 else if (element.tagName() == "arrow")
00071 {
00072 MythImage *tmp = LoadImage(element);
00073 SetRightArrowImage(tmp);
00074 }
00075 else if (element.tagName() == "check-empty")
00076 {
00077 MythImage *tmp= LoadImage(element);
00078 SetCheckImage(MythUIStateType::Off, tmp);
00079 }
00080 else if (element.tagName() == "check-half")
00081 {
00082 MythImage *tmp= LoadImage(element);
00083 SetCheckImage(MythUIStateType::Half, tmp);
00084 }
00085 else if (element.tagName() == "check-full")
00086 {
00087 MythImage *tmp= LoadImage(element);
00088 SetCheckImage(MythUIStateType::Full, tmp);
00089 }
00090 else if (element.tagName() == "regular-background")
00091 {
00092 MythImage *tmp= LoadImage(element);
00093 SetBackgroundImage(Normal, tmp);
00094 SetBackgroundImage(Active, tmp);
00095 SelectState(Normal);
00096 }
00097 else if (element.tagName() == "selected-background")
00098 {
00099 MythImage *tmp= LoadImage(element);
00100 SetBackgroundImage(Selected, tmp);
00101 }
00102 else if (element.tagName() == "inactive-background")
00103 {
00104 MythImage *tmp= LoadImage(element);
00105 SetBackgroundImage(SelectedInactive,
00106 tmp);
00107 }
00108 else if (element.tagName() == "margin")
00109 {
00110 int paddingMargin = NormX(getFirstText(element).toInt());
00111 SetPaddingMargin(paddingMargin);
00112 }
00113 else if (element.tagName() == "multiline")
00114 {
00115 if (parseBool(element))
00116 m_textFlags |= Qt::WordBreak;
00117 else
00118 m_textFlags &= ~Qt::WordBreak;
00119
00120 m_Text->SetJustification(m_textFlags);
00121 }
00122 else if (element.tagName() == "textflags")
00123 {
00124 QString align = getFirstText(element).lower();
00125
00126 m_textFlags = m_textFlags & Qt::WordBreak;
00127
00128 if (align == "center")
00129 m_textFlags |= Qt::AlignCenter;
00130 else if (align == "right")
00131 m_textFlags |= Qt::AlignRight;
00132 else if (align == "left")
00133 m_textFlags |= Qt::AlignLeft;
00134 else if (align == "allcenter")
00135 m_textFlags |= Qt::AlignHCenter | Qt::AlignVCenter;
00136 else if (align == "vcenter")
00137 m_textFlags |= Qt::AlignVCenter;
00138 else if (align == "hcenter")
00139 m_textFlags |= Qt::AlignHCenter;
00140
00141 m_Text->SetJustification(m_textFlags);
00142 }
00143 else
00144 return MythUIType::ParseElement(element);
00145
00146 return true;
00147 }
00148
00149 MythImage* MythUIButton::LoadImage(QDomElement element)
00150 {
00151 MythImage *tmp;
00152 QString filename = element.attribute("filename");
00153
00154 if (!filename.isEmpty())
00155 {
00156 tmp = GetMythPainter()->GetFormatImage();
00157 tmp->Load(filename);
00158 }
00159 else
00160 {
00161 QColor startcol = QColor(element.attribute("gradientstart", "#505050"));
00162 QColor endcol = QColor(element.attribute("gradientend", "#000000"));
00163 int alpha = element.attribute("gradientalpha", "100").toInt();
00164
00165 tmp = MythImage::Gradient(QSize(10, 10), startcol, endcol, alpha);
00166 }
00167
00168 return tmp;
00169 }
00170
00171 void MythUIButton::SetTextRect(const QRect &textRect)
00172 {
00173 if (textRect == m_TextRect)
00174 return;
00175
00176 m_TextRect = textRect;
00177 m_Text->SetArea(textRect);
00178 }
00179
00180 void MythUIButton::SetBackgroundImage(StateType state, MythImage *image)
00181 {
00182 QString num = QString::number((int)state);
00183 m_BackgroundImage->AddImage(num, image);
00184
00185 QSize aSize = m_Area.size();
00186 aSize = aSize.expandedTo(image->size());
00187 m_Area.setSize(aSize);
00188
00189 SetupPlacement();
00190 }
00191
00192 void MythUIButton::SetCheckImage(MythUIStateType::StateType state,
00193 MythImage *image)
00194 {
00195 m_CheckImage->AddImage(state, image);
00196 }
00197
00198 void MythUIButton::SetFont(StateType state, MythFontProperties &prop)
00199 {
00200 m_FontProps[(int)state] = prop;
00201 m_Text->SetFontProperties(m_FontProps[(int)Normal]);
00202 }
00203
00204 void MythUIButton::SetButtonImage(MythImage *image)
00205 {
00206 if (image)
00207 {
00208 m_ButtonImage->SetImage(image);
00209 m_ButtonImage->SetVisible(true);
00210 }
00211 else
00212 m_ButtonImage->SetVisible(false);
00213 SetupPlacement();
00214 }
00215
00216 void MythUIButton::SetRightArrowImage(MythImage *image)
00217 {
00218 if (image)
00219 {
00220 m_ArrowImage->SetImage(image);
00221 m_ArrowImage->SetVisible(true);
00222 }
00223 else
00224 m_ArrowImage->SetVisible(false);
00225 SetupPlacement();
00226 }
00227
00228 void MythUIButton::SetPaddingMargin(int margin)
00229 {
00230 m_PaddingMargin = margin;
00231 }
00232
00233 void MythUIButton::SetText(const QString &msg, int textFlags)
00234 {
00235 m_Text->SetText(msg);
00236 if (textFlags > 0)
00237 m_Text->SetJustification(textFlags);
00238 else if (m_textFlags > 0)
00239 m_Text->SetJustification(m_textFlags);
00240 SetRedraw();
00241 }
00242
00243 void MythUIButton::SelectState(StateType newState)
00244 {
00245 if (m_State == newState)
00246 return;
00247
00248 m_State = newState;
00249
00250 if (!m_BackgroundImage->DisplayState(QString::number((int)m_State)))
00251 m_BackgroundImage->DisplayState(QString::number((int)Normal));
00252
00253 if (!m_FontProps.contains((int)m_State))
00254 m_Text->SetFontProperties(m_FontProps[(int)Normal]);
00255 else
00256 m_Text->SetFontProperties(m_FontProps[(int)m_State]);
00257
00258 SetRedraw();
00259 }
00260
00261 void MythUIButton::SetCheckState(MythUIStateType::StateType state)
00262 {
00263 m_CheckImage->DisplayState(state);
00264 }
00265
00266 void MythUIButton::EnableCheck(bool enable)
00267 {
00268 m_CheckImage->SetVisible(enable);
00269 SetupPlacement();
00270 }
00271
00272 void MythUIButton::EnableRightArrow(bool enable)
00273 {
00274 m_ArrowImage->SetVisible(enable);
00275 SetupPlacement();
00276 }
00277
00278 void MythUIButton::SetupPlacement(void)
00279 {
00280 int width = m_Area.width();
00281 int height = m_Area.height();
00282
00283 QRect arrowRect = QRect(), checkRect = QRect(), imageRect = QRect();
00284 arrowRect = m_ArrowImage->GetArea();
00285 if (m_CheckImage->IsVisible())
00286 checkRect = m_CheckImage->GetArea();
00287 if (m_ButtonImage->IsVisible())
00288 imageRect = m_ButtonImage->GetArea();
00289
00290 int textx = m_PaddingMargin;
00291 int imagex = m_PaddingMargin;
00292 int textwidth = width - 2 * m_PaddingMargin;
00293
00294 if (checkRect != QRect())
00295 {
00296 int tmp = checkRect.width() + m_PaddingMargin;
00297 textx += tmp;
00298 imagex += tmp;
00299 textwidth -= tmp;
00300
00301 m_CheckImage->SetPosition(m_PaddingMargin,
00302 (height - checkRect.height()) / 2);
00303 }
00304
00305 if (arrowRect != QRect())
00306 {
00307 textwidth -= arrowRect.width() + m_PaddingMargin;
00308 m_ArrowImage->SetPosition(width - arrowRect.width() - m_PaddingMargin,
00309 (height - arrowRect.height()) / 2);
00310 }
00311
00312 if (imageRect != QRect())
00313 {
00314 int tmp = imageRect.width() + m_PaddingMargin;
00315 textx += tmp;
00316 textwidth -= tmp;
00317 m_ButtonImage->SetPosition(imagex,
00318 (height - imageRect.height()) / 2);
00319 }
00320
00321 SetTextRect(QRect(textx, 0, textwidth, height));
00322 }
00323
00324 void MythUIButton::CopyFrom(MythUIType *base)
00325 {
00326 MythUIButton *button = dynamic_cast<MythUIButton *>(base);
00327 if (!button)
00328 {
00329 cerr << "ERROR, bad parsing" << endl;
00330 return;
00331 }
00332
00333 m_FontProps = button->m_FontProps;
00334
00335 m_TextRect = button->m_TextRect;
00336 m_PaddingMargin = button->m_PaddingMargin;
00337 m_textFlags = button->m_textFlags;
00338
00339 MythUIType::CopyFrom(base);
00340
00341 m_BackgroundImage = dynamic_cast<MythUIStateType *>
00342 (GetChild("buttonback"));
00343 m_CheckImage = dynamic_cast<MythUIStateType *>
00344 (GetChild("buttoncheck"));
00345 m_Text = dynamic_cast<MythUIText *>
00346 (GetChild("buttontext"));
00347 m_ButtonImage = dynamic_cast<MythUIImage *>
00348 (GetChild("buttonimage"));
00349 m_ArrowImage = dynamic_cast<MythUIImage *>
00350 (GetChild("arrowimage"));
00351
00352 m_CheckImage->SetVisible(false);
00353 m_ButtonImage->SetVisible(false);
00354 m_ArrowImage->SetVisible(false);
00355
00356 SetupPlacement();
00357 SelectState(button->m_State);
00358 }
00359
00360 void MythUIButton::CreateCopy(MythUIType *parent)
00361 {
00362 MythUIButton *button = new MythUIButton(parent, name(), false);
00363 button->CopyFrom(this);
00364 }
00365
00366 bool MythUIButton::keyPressEvent(QKeyEvent *e)
00367 {
00368 QStringList actions;
00369 bool handled = false;
00370 GetMythMainWindow()->TranslateKeyPress("Global", e, actions);
00371
00372 for (unsigned int i = 0; i < actions.size() && !handled; i++)
00373 {
00374 QString action = actions[i];
00375 handled = true;
00376
00377 if (action == "SELECT")
00378 {
00379 emit buttonPressed();
00380 }
00381 else
00382 handled = false;
00383 }
00384
00385 return handled;
00386 }