diff options
author | Dees_Troy <dees_troy@teamw.in> | 2012-09-05 21:24:24 +0200 |
---|---|---|
committer | Dees_Troy <dees_troy@teamw.in> | 2012-09-05 21:24:31 +0200 |
commit | 51a0e82eb29a6dfc79f93479883383fbdbf8bcc2 (patch) | |
tree | 52fc18206eb0feba9f50dc3b0ede9fdc5e40f35e /gui/slider.cpp | |
parent | Initial stub of partitions.hpp (diff) | |
download | android_bootable_recovery-51a0e82eb29a6dfc79f93479883383fbdbf8bcc2.tar android_bootable_recovery-51a0e82eb29a6dfc79f93479883383fbdbf8bcc2.tar.gz android_bootable_recovery-51a0e82eb29a6dfc79f93479883383fbdbf8bcc2.tar.bz2 android_bootable_recovery-51a0e82eb29a6dfc79f93479883383fbdbf8bcc2.tar.lz android_bootable_recovery-51a0e82eb29a6dfc79f93479883383fbdbf8bcc2.tar.xz android_bootable_recovery-51a0e82eb29a6dfc79f93479883383fbdbf8bcc2.tar.zst android_bootable_recovery-51a0e82eb29a6dfc79f93479883383fbdbf8bcc2.zip |
Diffstat (limited to 'gui/slider.cpp')
-rw-r--r-- | gui/slider.cpp | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/gui/slider.cpp b/gui/slider.cpp new file mode 100644 index 000000000..95962c09b --- /dev/null +++ b/gui/slider.cpp @@ -0,0 +1,171 @@ +// slider.cpp - GUISlider object +// Pulled & ported from https://raw.github.com/agrabren/RecoverWin/master/gui/slider.cpp + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <fcntl.h> +#include <sys/reboot.h> +#include <sys/stat.h> +#include <sys/time.h> +#include <sys/mman.h> +#include <sys/types.h> +#include <sys/ioctl.h> +#include <time.h> +#include <unistd.h> +#include <stdlib.h> + +#include <string> + +extern "C" { +#include "../common.h" +#include "../minuitwrp/minui.h" +#include "../recovery_ui.h" +} + +#include "rapidxml.hpp" +#include "objects.hpp" + +GUISlider::GUISlider(xml_node<>* node) +{ + xml_attribute<>* attr; + xml_node<>* child; + + sAction = NULL; + sSlider = NULL; + sSliderUsed = NULL; + sTouch = NULL; + sTouchW = 20; + + if (!node) + { + LOGE("GUISlider created without XML node\n"); + return; + } + + child = node->first_node("resource"); + if (child) + { + attr = child->first_attribute("base"); + if (attr) + sSlider = PageManager::FindResource(attr->value()); + + attr = child->first_attribute("used"); + if (attr) + sSliderUsed = PageManager::FindResource(attr->value()); + + attr = child->first_attribute("touch"); + if (attr) + sTouch = PageManager::FindResource(attr->value()); + } + + // Load the placement + LoadPlacement(node->first_node("placement"), &mRenderX, &mRenderY); + + if (sSlider && sSlider->GetResource()) + { + mRenderW = gr_get_width(sSlider->GetResource()); + mRenderH = gr_get_height(sSlider->GetResource()); + } + if (sTouch && sTouch->GetResource()) + { + sTouchW = gr_get_width(sTouch->GetResource()); // Width of the "touch image" that follows the touch (arrow) + sTouchH = gr_get_height(sTouch->GetResource()); // Height of the "touch image" that follows the touch (arrow) + } + + //LOGI("mRenderW: %i mTouchW: %i\n", mRenderW, mTouchW); + mActionX = mRenderX; + mActionY = mRenderY; + mActionW = mRenderW; + mActionH = mRenderH; + + sAction = new GUIAction(node); + + sCurTouchX = mRenderX; + sUpdate = 1; + + return; +} + +GUISlider::~GUISlider() +{ + delete sAction; +} + +int GUISlider::Render(void) +{ + if (!sSlider || !sSlider->GetResource()) return -1; + + // Draw the slider + gr_blit(sSlider->GetResource(), 0, 0, mRenderW, mRenderH, mRenderX, mRenderY); + + // Draw the used + if (sSliderUsed && sSliderUsed->GetResource() && sCurTouchX > mRenderX) + { + gr_blit(sSliderUsed->GetResource(), 0, 0, sCurTouchX - mRenderX, mRenderH, mRenderX, mRenderY); + } + + // Draw the touch icon + if (sTouch && sTouch->GetResource()) + { + gr_blit(sTouch->GetResource(), 0, 0, sTouchW, sTouchH, sCurTouchX, (mRenderY + ((mRenderH - sTouchH) / 2))); + } + + sUpdate = 0; + return 0; +} + +int GUISlider::Update(void) +{ + if (sUpdate) return 2; + return 0; +} + +int GUISlider::NotifyTouch(TOUCH_STATE state, int x, int y) +{ + static bool dragging = false; + + switch (state) + { + case TOUCH_START: + if (x >= mRenderX && x <= mRenderX + sTouchW && + y >= mRenderY && y <= mRenderY + mRenderH) + { + sCurTouchX = x - (sTouchW / 2); + if (sCurTouchX < mRenderX) sCurTouchX = mRenderX; + dragging = true; + } + break; + + case TOUCH_DRAG: + if (!dragging) return 0; + if (y < mRenderY - sTouchH || y > mRenderY + (sTouchH * 2)) + { + sCurTouchX = mRenderX; + dragging = false; + sUpdate = 1; + break; + } + sCurTouchX = x - (sTouchW / 2); + if (sCurTouchX < mRenderX) sCurTouchX = mRenderX; + if (sCurTouchX > mRenderX + mRenderW - sTouchW) sCurTouchX = mRenderX + mRenderW - sTouchW; + sUpdate = 1; + break; + + case TOUCH_RELEASE: + if (!dragging) return 0; + if (sCurTouchX >= mRenderX + mRenderW - sTouchW) + { + sAction->doActions(); + } + sCurTouchX = mRenderX; + dragging = false; + sUpdate = 1; + case TOUCH_REPEAT: + case TOUCH_HOLD: + break; + } + return 0; +} + |